Ansible Playbooks
Ansible playbooks используются для выполнения многоэтапной процедуры на одном или нескольких удаленных компьютерах. Примером таких процедур может быть любой из следующих:
-
Изменяется логический набор системных уровней.
-
Развертывание на удаленных машинах.
-
Некоторые изменения конфигурации приложения, уже развернутого на удаленных компьютерах.
Сборник пьес не всегда должен выполняться на удаленной машине. Иногда это могут быть операции без сервера, такие как выполнение чего-либо с корзиной AWS S3 или подготовка виртуальных машин с использованием API, предоставляемых инструментом виртуализации или поставщиком общедоступного облака.
Вся процедура, которую выполняет Ansible playbook, делится на несколько задач. Как правило, каждая задача выполняется с помощью модуля Ansible или некоторой системной команды. Задачи могут быть определены непосредственно в сборнике пьес или ролях. Роль — это в основном набор задач многократного использования, которые выполняют полную процедуру. Например, Java может понадобиться для запуска разных приложений. В такой ситуации установка Java определяется как роль, которую может использовать любая книга воспроизведения для установки приложения, требующего Java, и, следовательно, зависимость Java может быть легко реализована.
Управление конфигурациями в Ansible
Ansible обычно называется системой управления конфигурацией (CM) и может использоваться для управления информацией среды обо всех стеках приложений и связанных ресурсах в компании. Роли и сборники игр должны быть рассчитаны на использование данных конфигурации, доступных в Ansible.
Хорошо спроектированные роли и сборники заданий настроены для работы с несколькими средами. Конфигурации, специфичные для среды, могут быть выведены из системы и поддерживаться в модулях vars, как в следующем примере:
envs:
env1:
app_server: app01.domain
db_server: db01.domain
env2:
app_server: app02.domain
db_server: db02.domain
В этом примере, книга воспроизведения может быть запущена в любой из сред, env1 или env2 , и книга воспроизведения может использовать связанные параметры конфигурации, определенные в Ansible, для внесения таких изменений:
-
Подключитесь к базе данных и внесите некоторые изменения в схему.
-
Обновление конфигурационный файл приложения , который имеет app_server и / или db_server элемент конфигурации в нем.
Модули vars загружаются в Ansible как структуры данных Python. В данном случае envs будет многоуровневым словарем, а параметр db_server для env2 может называться:
envs['env2']['db_server']
Когда playbook выполняется, вам нужно указать, в какой среде он работает. Один из способов сделать это — указать имя среды из командной строки, используя параметр extrasars Ansible playbook , как в этом примере:
$ ansible-playbook -i HOSTS-LIST install-app.yml -u USER -kK --extra-vars="env=env2"
В известной среде легко определить значение db_server в playbook как:
envs[env]['db_server']
Пример, который мы видели, очень прост. В реальной игровой книге может потребоваться несколько переменных в виде дополнительных переменных во время выполнения, чтобы их можно было поддерживать для работы в различных средах, а предоставление дополнительных переменных вскоре может стать громоздким и подверженным ошибкам.
Также необходимо указать список хостов, с которыми будет работать playbook. Если не существует базы данных управления конфигурациями (CMDB) или CMDB-подобной системы, которая могла бы динамически предоставлять списки хостов, рекомендуется хранить эту информацию в Ansible, как показано ниже, в модуле vars:
envs:
env1:
app_server: app01.domain
db_server: db01.domain
hosts:
- host1-env1.domain
- host2-env1.domain
- app01.domain
- db01.domain
env2:
app_server: app02.domain
db_server: db02.domain
hosts:
- host1-env2.domain
- host2-env2.domain
- app02.domain
- db02.domain
Если у вас есть список хостов в структуре данных YAML, такой, как эта, легко получить эту информацию в виде списка динамически с помощью простого скрипта Python, как показано в следующем примере.
#!/usr/bin/python
import sys
import yaml
env=sys.argv[1]
f=open('envs.yml')
envs=yaml.load(f)
hosts=envs['envs'][env]['hosts']
for host in hosts: print host
Значения элемента конфигурации и список хостов, сгенерированный таким образом, могут использоваться в качестве параметров при выполнении playbook.
Дженкинс как пользовательский интерфейс в Playbook
Дженкинс можно использовать в качестве интерфейса к сборнику пьес следующим образом:
-
Для сбора значений extra-vars необходимо запустить playbook с помощью формы работы Jenkins.
-
Для создания списков хостов и элементов конфигурации из модулей Ansible vars или из любого репозитория, к которому можно получить доступ с сервера Jenkins.
-
Для управления учетными данными, которые могут быть извлечены и внедрены в среду, в которой playbook запускает сценарии.
Настройка Playbook на Дженкинс
Трудно предоставить точные шаги по настройке Ansible playbook на Jenkins, потому что это зависит от того, как вы управляете playbooks и как SSH-доступ между хостами настроен в вашей организации. Для реализации стратегий, описанных здесь, достаточно того, кто знает как Ansible, так и Jenkins.
Настройка доступа без пароля
Задания Jenkins выполняются пользователем jenkins . Таким образом, доступ к SSH без пароля должен быть настроен для Дженкинс , чтобы получить доступ к удаленному компьютеру , как Jenkins или какой — либо другой учетной записи службы.
Пользователь, который входит в систему на удаленном компьютере, также должен иметь доступ sudo без пароля на этом компьютере.
Доступ без пароля подробно обсуждается в другой статье и прочитайте его, если вы не совсем разбираетесь в настройке SSH и sudo-доступа без пароля.
Создать работу Дженкинса для запуска Playbook
Создайте проект в стиле фристайл в Jenkins и определите параметры для каждого элемента ввода, предоставленного в playbook, используя опцию extra-vars . Тип параметра в форме работы Jenkins будет зависеть от доступности данных. В примере, который мы рассматривали, env может быть параметром выбора с возможными значениями env1 и env2 .
Генерация входных значений для Playbook
Перед запуском playbook, значения для необходимых параметров должны быть собраны программно. Они являются дополнением к пользовательским данным из формы вакансии. В основном, есть два предмета, которые нужно получить:
-
Закрытый ключ для SSH-ин на удаленных машинах. Закрытый ключ может быть настроен временно, если закрытые ключи управляются в некотором зашифрованном хранилище, включая функцию управления учетными данными Jenkin. Если закрытый ключ доступен на сервере Jenkins в статическом расположении, этот шаг не требуется.
-
Список удаленных машин, на которых будет запускаться playbook. Это может быть получено из модуля vars, как описано выше.
Настройка Playbook из командной строки
Выполнение playbook определяется в разделе Build > Execute Shell задания. Генерация входных значений и выполнение playbook описаны в этом разделе, и это будет выглядеть так:
#env is Jenkins build parameter
$ `gen-hosts-list $env` > /path/to/hosts_list
$ ansible-playbook /path/to/install-app.yml -i /path/to/hosts_list -u AUTO_USER --private-key=/path/to/private-key
Преимущества использования Jenkins
-
Большинство сложностей, связанных с запуском playbook, могут быть закодированы в форме Jenkins и Execute Shell. Это позволило бы операционному персоналу, имеющему небольшой опыт или вообще не имеющему опыта работы с Ansible, запускать playbooks.
-
Журнал сборки Jenkins является отличным ресурсом для отслеживания и аудита изменений, внесенных в конкретную среду.
-
У Дженкинса есть хороший интерфейс для групповых заданий, представлений с вкладками, которые помогут организовать ваши пьесы. Jenkins также позволяет задокументировать задание и параметры в одном интерфейсе формы. Удобнее ссылаться на документацию в самой форме, чем искать эту информацию в вики.
Накладные расходы с использованием Jenkins
При настройке, как описано здесь, нет никакого реального недостатка в использовании Jenkins для запуска playbooks, потому что playbooks не нуждаются в каких-либо дополнительных изменениях, чтобы запускаться из Jenkins, и они все равно могут выполняться из командной строки, если это необходимо.
Чтобы иметь возможность исполнять Ansible playbooks, как предлагается, вот несколько дополнительных подготовительных действий, которые увеличивают накладные расходы:
-
Установите и настройте Ansible на экземпляре Jenkins, который будет использоваться для настройки пользовательского интерфейса для книг воспроизведения.
-
Настройте SSH-доступ без пароля между сервером Jenkins и удаленными компьютерами. Поскольку это обычно не может быть сделано на лету, этот метод выполнения playbooks лучше подходит для запуска процедур на известных машинах, таких как периодические развертывания.
-
Если такие секреты, как пароль и ключи API, не обрабатываются должным образом, у них больше шансов попасть в журналы сборки, что следует предотвратить. Принятие дополнительных мер безопасности может увеличить накладные расходы.
В целом, использование пользовательского интерфейса Jenkins Job — отличная идея, если членам команды, практически не имеющим знаний об Ansible, необходимо участвовать в их использовании для достижения цели. Сделав еще один шаг вперед, пользователи, не входящие в состав рабочей группы, могут получить доступ к запуску таких заданий Jenkins для самостоятельного выполнения определенных процедур.