По вашему запросу ничего не найдено :(
Убедитесь, что запрос написан правильно, или посмотрите другие наши статьи:
img
В данной статье мы рассмотрим процессы CICD автоматизации. Разберем роль такого продукта, как Jenkins и его аналогов. Программное обеспечение Jenkins написано на языке программирования Java, по отзывам ИТ сообщества, данный продукт написан очень хорошо. Но самое главное данное программное обеспечение полностью бесплатное. Многие энтузиасты в мире для данного продукта пишут плагины, которые расширяют функционал Jenkins. Рассмотрим 2 ключевых понятия CICD Автоматизации. CI – Continuous Integration. Это DevOps модель, в которой разработчики делают commit кода в репозиторий (обычно используется github или gitlab, для хранения кода) и автоматически запускается build или компиляция этого кода, после этого запускаются автоматические тесты кода: Unit Test, Integration Test, Functionality Test. CD – Continuous Delivery and Deployment. Это DevOps модель, в которой разработчики делают commit кода в репозиторий и автоматически запускается build или компиляция этого кода, после этого запускаются автоматические тесты кода и готовый Artifact (скомпилированный код, например если это Java, то артефактом является var, если это Android приложение, то apk файл) делает деплой в Staging и Production, т.е происходит установка кода в развернутую вашу среду в необходимом контуре. Рассмотрим процесс на примере. Процесс CICD автоматизации Первым шагом в процессе является Commit to Source Control (github, gitlab или bitbucket), система определяет наличие нового кода, срабатывает триггер и автоматически запускается следующий этап BuildCompile - компиляция кода. Система скачивает новый код, например, если код попал в master branch (основную ветку). После получения ответа от сборки, что все прошло успешно, запускается следующий этап тестов. Все тесты пишут все те же программисты, для того, чтобы проверить на сколько корректно отработал код. Весь этот процесс называется Continuous Integration. Это классическая схема содержит 3 этапа, иногда включаются дополнительные шаги, но они не принципиальны. В результате данного процесса мы получаем скомпилированный и протестированный код. Давайте рассмотрим последующие шаги. Следующий шаг мы можем сделать deployment кода. По сути это тот же процесс копирования файлов кода на сервера. Процесс деплоя можно делать в разные места, можно делать в AWS или Azure, можно делать в свое частное облако, развернутое на VMware. Весь процесс с добавочными шагами называется Continuous Delivery and Deployment. Получается следующее: за Source Control – отвечает git. За шаг build и compile будет отвечать Jenkins. Следовательно, Jenkins запустится, когда кто-нибудь сделает комит в систему контроля версий, в основную ветку или не основную, смотря как настроено. Следующим шагом Jenkins выполнит все необходимые тесты, которые подготовили программисты. Следующий шаг Deploy так же запустит Jenkins и скопирует код на необходимые сервера, с помощью скрипта или scp если это Linux сервер. Существуют вариации с использованием Puppet или Ansible если мы делаем Deploy артефакта или конфигурации в целом. Существуют альтернативы Jenkins, например, Bamboo, Circleci, Gitlab CICD, TeamCity. Установка Jenkins Для развертывания Jenkins нам понадобится виртуальная машина на Ubuntu версии 18 или выше. Идем на официальный сайт Jenkins,в разделе Download мы можем увидеть 2 версии. На момент написании статьи актуальная версия Jenkins 2.319.2LTS и во второй колонке мы можем увидеть недельные версии Jenkins 2.333 Как видите дистрибутивы есть практически под все операционные системы. Мы будем использовать стабильную версию под UbuntuDebian. Ознакомимся с требованиями к установке продукта Jenkins. Для инсталляции потребуется минимум 256 МБ RAM, места 1 ГБ, а также на сайте написаны рекомендованные требования, с которыми будет достаточно комфортно работать с продуктом. Так как Jenkins написан на Java, то для запуска и работы потребуется непосредственно установленная на сервере Java. Для начала проверим версию java на сервере. java –version Если сервер свежий или Java не установлена, то операционная система сообщит, что такая команда не найдена и предложить установить Java. Java устанавливается достаточно просто: sudo apt update – oбновляем репозиторий sudo apt search openjdk – ищем необходимый пакет sudo apt install openjdk-11-jdk – запускаем установку java в процессе система попросит подтвердить. Чтобы предупреждение не выскочило мы можем запустить установку с ключем –y По окончанию установки мы опять проверяем версию. Система покажет версию и билд Java. Теперь наш сервер готов к началу установки Jenkins. Добавляем ключ и репозиторий в операционную систему: curl -fsSL https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo tee /usr/share/keyrings/jenkins-keyring.asc > /dev/null echo deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] https://pkg.jenkins.io/debian-stable binary/ | sudo tee /etc/apt/sources.list.d/jenkins.list > /dev/null sudo apt-get update – обновляем репозиторий sudo apt-get install Jenkins – инсталлируем непосредственно сам Jenkins Теперь мы можем сделать пост настроечные мероприятия непосредственно в Jenkins. Открываем браузер и переходим на веб интерфейс http://ipaddr:8080, где вместо ipaddr – подставляем IP адрес сервера. В ответ получаем вот такое сообщение - Unlock Jenkins Система просит ввести дополнительный ключ, который был сгенерирован при установке сервера. Найти его достаточно просто достаточно ввести в консоли сервера sudo cat /var/lib/jenkins/secrets/initialAdminPassword Копируем и вставляем в веб форму. После прохождения этой несложной системы безопасности мы можем начать базовую настройку. Система предлагает выбрать стандартную установку или кастомизированную с выбором плагинов (расширений для различного функционала). Если мы выбираем стандартную установку, установятся только те плагины, которые сами разработчики протестировали и выбрали. Если мы выберем установку с выбором, соответственно система даст возможность установить не только стандартные, но и другие плагины. Выбираем стандартную установку и начинается процесс настройки самого Jenkins. Мы можем видать, что ставится git плагин, LDAP для работы с Active Directory, ssh для взаимодействия по протоколу ssh, расширение E-mail для отправки уведомлений и.т.д После непродолжительного ожидания, система предлагает создать суперпользователя с правами администратора в системе. Заполнение не сложное. Если бы мы выбрали другой вариант установки, то система нам предложила бы выбрать самостоятельно нужные плагины. Примерно вот в такой форме. Форма от версии к версии может отличатся. По окончанию заполнения формы, попадаем на экран где нам предлагают проверить URL, т.к эти данные будет Jenkins использовать, как переменные среды. В итоге мы попадаем на главный экран Jenkins. Данный экран – это основной рабочий стол. С помощью плагинов его можно кастомизировать. Так же можно в джобы добавить много разных параметров.
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
Дорогой читатель! В поисках полезной автоматизации и кастомизации своего Asterisk продвинутые администраторы прибегают к использованию различных скриптов. Это может быть PHP, Perl C, Pascal или Shell. Для использования скриптов, написанных на одном из перечисленных языков программирования в диалплане Asterisk используется AGI (Asterisk Gateway Interface) – о нем и поговорим. Как это работает? AGI - это прослойка между скриптом и диалпланом (планом набора) в Asterisk. В скрипт мы можем передавать различные переменные, а можем получать какие - то значения из скрипта. Когда Asterisk инициирует запуск скрипта через AGI, он передает в него набор переменных. Все переменные обладают префиксом agi_: Переменная Описание Пример agi_request Имя файла исполняемого скрипта trunk.php agi_channel Канал, инициирующий звонок Local/89123456789@from-internal-00000002;2 agi_language Языковой код en agi_type Тип канала, инициирующий вызов Local agi_uniqueid Уникальный идентификатор звонка 1497364935.15 agi_version Версия Asterisk 13.10.0 agi_callerid Номер звонящего (CID Number) 89123456789 agi_calleridname Имя звонящего (CID Name) 89123456789 agi_dnid Набранный номер unknown agi_context Контекст обработки вызова macro-dialout-trunk Как вызвать AGI в диалплане? Вызвать AGI скрипт очень просто: предварительно, загрузите скрипт в директорию /var/lib/asterisk/agi-bin/. После этого, скрипту необходимо дать права и собственника. Предположим, наш скрипт называется trunk.php: chmod 755 /var/lib/asterisk/agi-bin/trunk.php chown asterisk:asterisk /var/lib/asterisk/agi-bin/trunk.php Теперь, чтобы скрипт был вызван в диалплане, просто добавьте следующую конструкцию: exten => 1333,n,AGI(trunk.php) Просто, не правда ли? А если мы хотим передать переменную в скрипт? Просто добавьте ее после запятой: exten => 1333,n,AGI(trunk.php, ${CALLERID(number)}) А как же написать скрипт? Теперь к самому скрипту – напишем его на PHP. Пусть нам нужно отправлять письмо с номером звонящего. Выглядеть скрипт будет так: #!/usr/bin/php -q <?php require('phpagi.php'); $agi = new AGI(); //подключаем файл phpagi.php – 1 и 2 строки обязательны в любом скрипте $cid = $agi->request['agi_callerid']; // берем из AGI номер звонящего mail("info@merionet.ru", 'Привет!', 'Вот и номер звонящего:', $cid); //отправляем в письме Вот и все. Нам будет приходить на почту письмо с номером звонящего – прокачав данный функционал можно отслеживать пропущенные вызовы, например.
ВЕСЕННИЕ СКИДКИ
40%
50%
60%
До конца акции: 30 дней 24 : 59 : 59