По вашему запросу ничего не найдено :(
Убедитесь, что запрос написан правильно, или посмотрите другие наши статьи:
img
Перед вами Топ-10 преимуществ, которые виртуализация даст вашей организации. Нужна помощь убедить начальство, почему виртуализация – это верный путь? Или нужно убедить себя? Мы разобрались и делимся нашим исследованием. Шаг 1: Аппаратная абстракция Аппаратная абстракция упрощает человеческий труд и время простоя, связанное с заменой оборудования, поломками, модификациями и так далее. Также она помогает избежать зависимости от строго определенного оборудования и поставщиков. Хотите произвести апгрейд оперативной памяти или процессора? Нужно добавить больше места для хранения данных или дополнительный сетевой адаптер ? Это невероятно быстро и просто. Дни «корпения» над оборудованием в прошлом – больше не нужно перегружать сервер ресурсами до его использования . Можно по необходимости добавлять совместно используемые ресурсы прямо в процессе, с минимальным простоем. Шаг 2: Простота миграции Вернемся к первому тезису. Отсутствие привязки к строго определенному оборудованию позволяет с легкостью и быстротой перемещать виртуальную машину (или копию машины) на другой физический носитель или хостинг. Это огромный плюс для обслуживания, выравнивания нагрузки и критического восстановления. Шаг 3: Легкость в управлении дисками Инкапсуляция устройств хранения данных (перенос дисковых хранилищ «на лету») создает значительно упрощенные условия для полного отката системы и восстановления, что делает возможным невероятно быстрый BMR (Bare Metal Restore). Ваша машина – это набор файлов. Проще не бывает. Bare Metal - установка гипервизора на «голое» железо. Это позволяет исключить операционную систему и поставить гипервизор (VMware, Hyper-V, Citrix и прочие) сразу на сервер без ОС. Шаг 4: Снимки (снэпшоты) Снэпшоты упрощают тестирование и обеспечивают защиту от изменений, которые могут поломать конфигурацию системы. Если вы напортачите с физической машиной, то проведете за ее починкой часы, дни, или и того больше. Если же вы напортачите с виртуальной машиной, то просто верните снимок в предыдущее состояние. Готово! Одно только это преимущество – бесценно. Шаг 5: Простота в архивации Легкость в архивации старых систем – огромный плюс. Закончили эксплуатацию машины – можно ее отключать и переносить файлы на долговременное хранилище м, например, СХД. Машина понадобилась снова? Скопируйте файлы назад и запускайте в считанные минуты. Шаг 6: Легкость роста Виртуализация облегчает численный рост при помощи опции платных аддонов вроде HA (high availability), vMotion и так далее. Некоторые из этих функций бесплатны в зависимости от выбора платформы (Hyper-V, Xen). С множеством гипервизоров, нужно всего лишь применить лицензионный ключ для разблокировки новых функций, которые могут ощутимо улучшить работу вашего дата-центра. Начните с малого, растите и прокладывайте себе путь. Виртуализация позволяет вам быть гибкими в вопросах реализации. Шаг 7: Улучшенный контроль и поиск неисправностей Большинство гипервизорных решений позволяют контролировать все физические хосты через центральную консоль, где вы можете легко сравнивать использование ресурсов и просматривать историю задач и событий. Вы можете с легкостью делать сравнения между физическими и виртуальными серверами и проводить глубокий анализ и поиск неисправностей. Шаг 8: Консолидация нагрузки на физический сервер На одно оборудование можно поместить от 2 до 100 (и даже больше) виртуальных машин, снизив тем самым затраты на закупки аппаратных компонентов и использование пространства стойки , при этом также упадет потребление энергии и затраты на охлаждение. Вместо того, чтобы оставлять заказ на новый сервер, вы можете запустить новую виртуальную машину в считанные минуты. Большинство физических носителей используются лишь на долю своего потенциала из-за ограничений софта (таких как необходимость разделения приложений или ролей друг от друга). Вы можете разделять их, запуская на одном и том же оборудовании. Шаг 9: Легкость сегментации приложений Отсылаем вас к предыдущему заявлению. Нужно запустить одну машину на базе Linux, а другую на базе Windows ОС? Запустите новую виртуальную машину на том же оборудовании. За счет минимальных изменений в использовании оборудования ваши нужды будут удовлетворены – к тому же вам не придется покупать новый носитель. Шаг 10: Новый уровень дистанционного управления Дистанционное управление позволяет вам полностью управлять машиной на расстоянии. Вы можете делать запросы, которые обычно приходится делать «на месте» (сидя на корточках в неудобной и холодной серверной), через удаленную консоль – например, апгрейд ресурсов, поиск сетевых неисправностей, включение/отключение операций и многое другое. Это невероятно увеличивает эффективность управления сервером и снижает затраты на поездки и простои. Виртуализация сервера – это огромное преимущество для любой компании. Даже для отдельного хоста виртуализация имеет смысл (снимки, облегчение переноса и так далее).
img
В этой статье посмотрим как можно отправлять электронные письма при помощи Python. Есть и более простые способы это сделать, но мне больше подошел именно следующий вариант. Итак, вот как это выглядит: у вас есть имена и адреса электронной почты некоторой группы контактов. И вы хотите отправить каждому из них письмо, добавив в начале сообщения «Уважаемый [имя]». Для простоты вы можете хранить всю контактную информацию просто в файле, а не в базе данных. Также вы можете сохранить в файл шаблон сообщения, которое вы хотите отправить. Модуль smtplib в Python – это практически все, что вам понадобиться для отправки простых электронных писем без заполнения темы письма или какой-либо еще дополнительной информации. Но, конечно, для настоящих писем вам необходимо заполнить строку темы письма и другую информацию, и, возможно, даже прикрепить изображения или какие-то другие вложения. Вот тут и приходит на помощь пакет email в Python. Имейте в виду, что нельзя отправить сообщение через электронную почту, используя только этот пакет. Вам необходимо совместить email и smtplib. Обязательно ознакомьтесь с подробной официальной документацией для каждого из этих пакетов. Вот четыре основных шага для отправки электронных писем с помощью Python: Настройте SMTP-сервер и войдите в свою учетную запись. Создайте объект сообщения MIMEMultipart и загрузите его с соответствующими заголовками для полей From (От), To (Кому) и Subject (Тема). Добавьте тело сообщения. Отправьте сообщение с помощью объекта SMTP-сервера. А теперь давайте рассмотрим весь процесс. Допустим, что у вас есть файл контактов mycontacts.txt, который выглядит вот так: user@computer ~ $ cat mycontacts.txt john johndoe@example.com katie katie2016@example.com Каждая строка соответствует одному контакту. В каждой строке пишется имя, а за ним следует адрес электронной почты. У меня все сохранено в нижнем регистре. Я оставлю преобразования любых полей или некоторых начальных букв в верхний регистр логике программирования, если это будет необходимо. В Python это все довольно просто. Далее у нас есть файл с шаблоном сообщения message.txt. user@computer ~ $ cat message.txt Dear ${PERSON_NAME}, This is a test message. Have a great weekend! Yours Truly Обратили внимание на ${PERSON_NAME}? Это шаблонная строка в Python. Шаблонные строки можно легко заменить другими строками; в данном примере ${PERSON_NAME} будет заменено настоящим именем человека (вы скоро это увидите). А теперь давайте перейдем к коду Python. Для начала нам необходимо прочитать контакты из файла mycontacts.txt. Мы, кстати, можем обобщить это в отдельную функцию. # Function to read the contacts from a given contact file and return a # list of names and email addresses def get_contacts(filename): names = [] emails = [] with open(filename, mode='r', encoding='utf-8') as contacts_file: for a_contact in contacts_file: names.append(a_contact.split()[0]) emails.append(a_contact.split()[1]) return names, emails Функция get_contacts() в качестве аргумента принимает имя файла. Она откроет этот файл, прочитает каждую строку (то есть каждый контакт), разделит их на имя и адрес электронной почты, а затем добавит их в два отдельных списка. И, наконец, в качестве результата работы функции возвращаются эти два списка. Также нам нужна функция для того, чтобы прочитать шаблон сообщения (такой как message.txt) и вернуть объект типа Template, созданный из его содержимого. from string import Template def read_template(filename): with open(filename, 'r', encoding='utf-8') as template_file: template_file_content = template_file.read() return Template(template_file_content) Как и предыдущая функция, в качестве аргумента она принимает имя файла. Для того, чтобы отправить письмо, вам необходимо использовать протокол SMTP (Simple Mail Transfer Protocol – протокол простого обмена электронной почтой). Как уже упоминалось ранее, у Python есть необходимые для этого библиотеки. # import the smtplib module. It should be included in Python by default import smtplib # set up the SMTP server s = smtplib.SMTP(host='your_host_address_here', port=your_port_here) s.starttls() s.login(MY_ADDRESS, PASSWORD) В приведенном выше фрагменте кода вы импортируете smtplib, а затем создаете экземпляр SMTP, который формирует SMTP-соединение. В качестве параметра он принимает адрес хоста и номер порта, оба эти параметра полностью зависят от настроек SMTP вашего поставщика услуг электронной почты. Например, в случае Outlook строка под номером 4 будет выглядеть вот так: s = smtplib.SMTP(host='smtp-mail.outlook.com', port=587) Для того, чтобы все работало, вам необходимо использовать адрес хоста и номер порта конкретно вашего поставщика услуг электронной почты. MY_ADDRESS и PASSWORD – это две переменные, которые содержат полный адрес электронной почты и пароль от учетной записи, которую вы собираетесь использовать. А теперь самое время получить контактную информацию и шаблон сообщения, используя функции, которые мы определили ранее. names, emails = get_contacts('mycontacts.txt') # read contacts message_template = read_template('message.txt') А теперь давайте отправим отдельное письмо каждому из этих контактов. # import necessary packages from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText # For each contact, send the email: for name, email in zip(names, emails): msg = MIMEMultipart() # create a message # add in the actual person name to the message template message = message_template.substitute(PERSON_NAME=name.title()) # setup the parameters of the message msg['From']=MY_ADDRESS msg['To']=email msg['Subject']="This is TEST" # add in the message body msg.attach(MIMEText(message, 'plain')) # send the message via the server set up earlier. s.send_message(msg) del msg Для каждого name (имя) и email (адрес электронной почты) (из файла с контактами) вы создаете объект MIMEMultipart, настраиваете заголовки типов содержимого From (от), To (кому), Subject (тема) как словарь ключевых слов, а затем прикрепляете тело сообщения к объекту MIMEMultipart в виде обычного текста. Возможно, вам захочется прочитать документацию, чтобы узнать больше о других типах MIME, с которыми вы также можете поэкспериментировать. Также обратите внимание, что в строке 10 выше я заменяю ${PERSON_NAME} фактическим именем, которое было извлечено из файла с контактами с помощью механизма шаблонизации в Python. В данном конкретном примере я каждый раз удаляю объект MIMEMultipart и создаю его заново при каждой итерации цикла. Как только вы проделаете все это, то сможете отправить сообщение, используя простую удобную функцию send_message() объекта SMTP, который вы создали ранее. А вот и полный код: import smtplib from string import Template from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText MY_ADDRESS = 'my_address@example.comm' PASSWORD = 'mypassword' def get_contacts(filename): """ Return two lists names, emails containing names and email addresses read from a file specified by filename. """ names = [] emails = [] with open(filename, mode='r', encoding='utf-8') as contacts_file: for a_contact in contacts_file: names.append(a_contact.split()[0]) emails.append(a_contact.split()[1]) return names, emails def read_template(filename): """ Returns a Template object comprising the contents of the file specified by filename. """ with open(filename, 'r', encoding='utf-8') as template_file: template_file_content = template_file.read() return Template(template_file_content) def main(): names, emails = get_contacts('mycontacts.txt') # read contacts message_template = read_template('message.txt') # set up the SMTP server s = smtplib.SMTP(host='your_host_address_here', port=your_port_here) s.starttls() s.login(MY_ADDRESS, PASSWORD) # For each contact, send the email: for name, email in zip(names, emails): msg = MIMEMultipart() # create a message # add in the actual person name to the message template message = message_template.substitute(PERSON_NAME=name.title()) # Prints out the message body for our sake print(message) # setup the parameters of the message msg['From']=MY_ADDRESS msg['To']=email msg['Subject']="This is TEST" # add in the message body msg.attach(MIMEText(message, 'plain')) # send the message via the server set up earlier. s.send_message(msg) del msg # Terminate the SMTP session and close the connection s.quit() if __name__ == '__main__': main()
img
В нашей прошлой статье мы рассмотрели, как OSPF может автоматически фильтровать маршруты с помощью специальных областей и типов LSA. Но как насчет вариантов ручной фильтрации маршрутов в OSPF? В этой статье мы рассмотрим методы, которые можно использовать в различных точках топологии. Предыдущие статьи: Расширенные возможности OSPF: Области OSPF: создание конкретных типов областей Видео: протокол OSPF (Open Shortest Path First) за 8 минут Фильтрация на ASBR Одним из простых и эффективных методов фильтрации на ASBR является использование распределенного списка. Здесь мы определяем правила идентификации маршрута со списком доступа, а затем ссылаемся на этот список доступа в списке распространения. Рисунок 1. Топология OSPF В этом примере наша область 1 настроена как нормальная, не являющаяся магистральной областью. Вы можете увидеть это, при просмотре таблицы маршрутизации на ORL. show ip route Обратите внимание на два префикса (E2) 192.168.10.0 и 192.168.20.0. Давайте отфильтруем 192.168.10.0 на ASBR ATL. ATL# configuration terminal Enter configuration commands , one per line . End with CNTL/Z . ATL(config)#access-list 1 deny 192.168.10 .0 0.0.0.255 ATL(config)#access-list 1 permit any ATL(config)#router ospf 1 ATL(config-router)#distribute-list 1 out eigrp 100 ATL(config-router)#end ATL# Обратите внимание, насколько проста эта конфигурация. Давайте посмотрим, сработало ли это, еще раз изучив таблицу маршрутов ORL: show ip route Конфигурация работет отлично, и 192.168.10.0 больше не доступен на ORL. Другой простой метод - использовать команду summary-address на ASBR и использовать ключевое слово not-advertise. Вот пример из нашей топологии. Обратите внимание, что был удален предыдущий список рассылки из конфигурации ATL до этой настройки здесь: ATL#conf t Enter configuration commands, one per line. End with CNTL/Z . ATL(config)#router ospf 1 ATL(config-router)#summary-address 192 .168.10.0 not-advertise ATL(config-router)#end ATL# Проверка на ORL доказывает успешную фильтрацию сети 192.168.10.0. show ip route Нет ничего удивительного в том, что вы можете использовать подход route map для фильтрации в ASBR. Ведь route map невероятно полезны и гибки. Здесь мы определим правила со списком доступа (еще раз) и используем их в логике route map: ATL#conf t Enter configuration commands, one per line . End with CNTL/Z . ATL(config)#access-list 1 deny 192.168.10.0 0.0.0.255 ATL(config)#access-list 1 permit any ATL(config)#route-map МУМАР permit 10 ATL(config-route-map)#match ip address 1 ATL(config-route-map)#router ospf 1 ATL(config-router)#redistribute eigrp 100 metric 1000 route-map МУМАР subnets ATL(config-router)#end ATL# Как вы можете догадаться, проверка на ORL показывает отличную работу. show ip route Фильтрация на ABR Вы также можете фильтровать на ABR. Наиболее распространенным методом является использование списка префиксов, как показано здесь: ATL2#conf t Enter configuration commands, one per line. End with CNTL/Z. ATL2 (config)#ip prefix-list 1 deny 192.168.10.0/24 ATL2 (config)#ip prefix-list 1 permit 0.0.0.0/0 ATL2 (config)#router ospf 1 ATL2 (config-router )#area 1 filter-list prefix 1 out ATL2 (config-router )#end ATL2# show ip route Мы фильтруем префикс 192.168.10.0, но мы делаем это на ABR, и мы фильтруем по Type 3. Это контрастирует с фильтрацией типа 5 (для того же префикса!) Мы уже делали это раньше в ASBR. Фильтрация в роутере Имейте в виду, что вы можете легко фильтровать на любом спикере OSPF внутри самого маршрутизатора. Например, вы можете настроить подход к распределению списка и фильтровать входящие сообщения с его помощью. В этом примере мы еще раз остановимся на 192.168.10.0. Мы заблокируем его в ACL и будем использовать этот ACL в списке рассылки. Обратите внимание, что мы находимся на ORL: ORL#conf t Enter configuration commands , one per line . End with CNTL/Z . ORL(config) #access-list 1 deny 192.168.10.0 0.0.0.255 ORL(config) #access-list 1 permit any ORL(config)#router ospf 1 ORL(config-router)#distribute-list 1 in ORL(config- router)#end ORL# И снова наш желаемый результат проверки: show ip route
ВЕСЕННИЕ СКИДКИ
40%
50%
60%
До конца акции: 30 дней 24 : 59 : 59