Знакомство с Ansible — Часть 2

В первой части рассмотрены следующие темы:

— Конфигурационный файл Ansible, Inventory-файл
— Полезные команды Ansible
— Теги
— Переменные
— Ad-Hoc-режим
— Модули
— Debug в Ansible

В этой второй части рассмотрены следующие темы:

— Роли
— Import/Include
— Выполнение задачи на другом сервере(delegate_to)
— Однократное выполнение задачи (run_once )
— Перехват и обработка ошибок(ignore_errors|any_errors_fatal)
— Помещение вывода выполнения команды таска в переменную(register,failed_when)
— Условия выполнения таска( when)
— Ansible Vault

 

Работа с ролями

Роль представляет собой структурированный плейбук содержащий набор (как и минимум) тасков (task), и дополнительно — обрабработчиков событий (handler), переменных (defaults), файлов (files), шаблонов (templates), а также описание и зависимости (meta).

Создание роли

Создание роли с именем deploy_apache_web(при этом создается соответствующая структура каталогов)

 

Файл с переменными по умолчанию(defaults/main.yml)
Здесь очень удобно задавать какие-то общие переменные, а в group_vars/host_vars можно задавать нужные групповые/хостовые переменные для соответствующих групп/хостов

 

Файлы с переменными роли по пути  «/vars/filename.yml» показаны в разделе import/include

 

Файл с обработчиками событий(handlers/main.yml)

Обработчики (handlers) это задачи с уникальными именами, которые будут выполняться только в случае уведомления от другой задачи.
Обработчики(Handlers) выполняется всегда в конце плейбука, несмотря на то,что handler может вызываться несколькими тасками
Они очень удобны для перезапуска сервисов или перезагрузки системы.
Вы можете объявить их используя handler и вызвать с помощью notify.

 

Файл с описанием тасков(tasks/main.yml)

 

Файл с описанием шаблона (templates/filename.j2)
В качестве шаблонизатора Ansible использует jinja2, систему шаблонов для Python
Внутри Jinja2-шаблона можно использовать любую переменную, которая определена Ansible-ом.
Во время выполнения вышеуказанного таска все переменные в шаблон-файле index.html.j2 будут заменены их соответствующими значениями, после чего подставлены в файл index.html.j2 и скопированы файл в каталог {{ destin_folder }} на целевом сервере

Итоговая структура роли имеет вид:

Плейбук, вызывающий роль

 

Установка роли с Ansible Galaxy
Формат

Например

Более подробно об Ansible Galaxy
http://docs.ansible.com/ansible/galaxy.html


Include/Import

Include и import используются для разделения сложных/больших плейбуков на составные части/файлы путем выноса некоторых тасков или переменных в отдельные файлы и включение или импортирование этих отдельных файлов с тасками(с помощью директивы include) или файлов с переменными(с помощью директивы include_vars) в главный плейбук
Это позволяет сделать плейбук более читабельным и гибким

Например, вынесим таски по созданию каталогов и файлов в отдельные файлы и подключим эти файлы в основном плейбуке

Также переопределим в include переменную mytext, которая задана на глобальном уровне в основном плейбуке через параметр vars
Базовый/основной плейбук имеет вид

 

Подключение файла с переменными в роли с помощью директивы include_vars
Создадим YAML-файл с описанием переменных и подключим его в плейбук с помощью директивы include_vars

 

Перенаправление выполнения task-а на другой сервер — delegate_to
Delegate_to — Делегирование выполнение команды на другом сервере
Например, task для удаления хоста из лоадбалансера будет выполнена на master Ansible хосте(хосте, с которого мы запускаем наш плейбук)
Это достигается за счет использования параметра delegate_to
В нашем случае

Базовый плейбук имеет вид

В результате выполнения такого плейбука на мастер ансибл сервере будет создан файл /tmp/log.txt с таким содержимым

Также полезным примером использования delegate_to является запуск таска на мастер ансибле для того, чтобы дождаться пока сервер перезагрузится
Например, перезагружаем сервера и на мастере выполняем таск, который будет ожидать пока сервера запустятся, начнет выполнять проверку доступности сервера через 5 секунд и максимальное время ожидание составит 40 секунд

 

Запуск таска только один раз(независимо от кол-ва серверов) — run_once
На каком из набора серверов запустится таск с указанным параметром run_once – это определается порядком серверов, указанных в inventory-файле

Если необходимо выполнить команды только один раз и чтобы команда выполнялась на конкретном сервере, тогда используем совместно обе опции run_once и delegate_to


Перехват и обработка ошибок

По умолчанию при неуспешном выполнении какого-либо таска на хосте, все остальные таски на этом хосте(и только на этом хосте) не выполняются( т.е. дефолтная опция ignore_errors: false)
Для принудительного продолжения выполнения тасков, которые находятся в плейбуке ниже/после таска, который выполнился с ошибкой, на этом хосте в параметры такого таска добавляется параметр

Если необходимо, чтобы при неуспешном выполнении одного таска на любом хосте, немедленно прекратить дальнейшее выполнение всего плейбука на ВСЕХ хостах, то используем параметр

в глобальных параметрах плейбука

 

Помещение вывода выполнения команды таска в переменную — register
Вывод результата выполнения команды помещаем в переменную myresult(параметр register) и выводим значение переменной(модуль debug)

при запуске плейбука получаем такой вывод по заданному таску

Теперь из такого результата можно вытащить любой параметр
Полезно использовать параметры стандартного вывода команды(stdout) и стандартного вывода команды разделенного по строкам (stdout_lines), стандартного вывода ошибок(stderr) и стандартного вывода ошибок разделенного по строкам(stderr_lines) и кода выполнения/выхода команды return code(rc)

например, возьмем для работы stdout

при запуске плейбука получаем такой вывод по заданному таску

Это позволяет делать поиск в таком выводе команды и отмечать, например, таск как выполнившийся неуспешно, если найден указанный нами паттерн/шаблон/слово
с помощью параметра

Например, пометим таск как выполнившийся с ошибкой, если в стандартном выводе команды в этом таске присутствует слово World с помошью параметра failed_when
failed_when: «‘World’ in myresult.stdout»

В результате выполнения такого таска будет получена ошибка свидетельствующая о том, что указанный нами паттерн был найден в выводе команды, выполнявшейся в таске

Также удобно использовать код выхода выполнения команды
Как обычно в Linux
0- команда выполнилась успешно
Все остальные коды отличные от нуля — не успешное выполнение команды
Например, отметим таск как выполнившейся неуспешно, если код выхода команды отличный от нуля

В результате выполнения такого таска будет получено сообщение, свидетельствующее об успешном выполнении таска

 

Выполнение таска либо подключение/импорт файла в зависимости от условий — when
When — позволяет выполнять таск или подключать/импортировать другие файлы, если условие, которое указано в нем истинно
Например, выведем на экран ту или иную фразу/строку в зависимости от того, выполняется ли условие в параметре when
Например, проверим наличие файла (с помощью модуля stat) и результат проверки сохраним в переменную result( с помощью register)
В следующем таске(Print message when the file is exist) проверяется статус/состояние переменной result – если файл существует, то выведем соответствующую строку на экран(«The file is exist»)
Если файл не существует, то этот таск не будет выполняться вообще.
А выполнится следующий таск(Print message when the file is NOT exist) т.к. файла не существует и условие в when истино. Соответственно на экран будет выведена строка («The file is NOT exist «)

Аналогично выполним/пропустим выполнение таска в зависимости от коды выхода команды
В первом таске выполним команду по проверки версии apache и запишим результат вывода команды в переменную register
Если apache2 установлен(соответственно и его версию мы получим корректно), то выполнится второй таск, который выведем на экран вывод команды указанной в первой таске. Третий таск в этом случае ожидаемо будет пропущен
Если apache2 не установлен, тогда команда в первом таске выполнится с ошибкой и соответственно код выхода такой команды будет отличным от нуля.
В результате чего второй таск выполняться не будет(т.к. условие в when не истинно/ не выполняется), а выполнится третий таск, который установит пакет apache2
Также важно отметить, что используется опция ignore_errors, которая позволяет продолжить выполнение ниже следующих тасков для хоста при неуспешном выполнении таска, для которого установлена эта опция,(по умолчанию, ансибл немедленно прекращает выполнение всех ниже следующих тасков для хоста, при неуспешном выполнении текущего таска)

Аналогично при использовании переменных
Например, переменных(ansible_), которые становятся доступными после собрания фактов

Еще один пример
Первый таск будет выполняться только когда переменная foo определена.
Второй таск будет выполняться только тогда, когда переменная bar НЕ определена
Если второй таск будет выполняться, то ожидаемо выполнится с ошибкой(модуль fail)

 


Ansible Vault

Создание шифрованного файла с секретной информацией

Вводим пароль для шифрования/дешифрования файла
Далее открывается текстовый редактор по-умолчанию для наполнения файла

Просмотр текущего файла(необходимо будет ввести пароль, установленный при создании шифрованого файла предыдущей командой)

Eсли просматривать файл в открытом виде файл будет содержать зашифрованный текст

Изменение содержания/редактирование файла

Изменение пароля, установленного при создании шифрованного файла

Создадим и зашифруем плейбук, в котором хранится некоторый пароль(mypassword)

Шифруем плейбук

В открытом виде информация не читаемая

Для просмотра плейбука используем команду

Расшифровать плейбук

Содержимое файла станет доступным в открытом виде

Зашифруем снова

Для запуска зашифрованного плейбука необходимо использовать параметр/опцию

В противном случае попытка дешфрования плейбука будет неуспешной

Для корректной расшифровке плейбука используем параметр —ask-vault-pass

Для запуска шифрованного плейбука без пароля используем опцию

в которой указываем файл, содержащий пароль

Наряду с шифрованием всего плейбука Ansible поддерживает шифрование отдельных
строк/слов/текста
Например, зашифруем указанный в плейбуке пароль mypassword
Для этого используем команду

Командой спросит пароль, которым будут шифроваться данные
После чего предложит вести текст, который нужно зашифровать

Также можно использовать следующую команду для достиженя такого же результата(получение шифрованного пароля mypassword)

Теперь в плейбуке вместо пароля в чистом виде, используем его зашифрованную ansible-vault-ом версию

Т.е. пароль в плейбуке пароль будет иметь вид

Также, как и с шифрованием всего плейбука, при шифровании отдельных его строк, значений(например, шифрование пароля, которое мы выполнили) необходимо использовать либо опцию —ask-vault-pass либо опцию —vault-password-file
Без указаний одной из этих опций ожидаемо дешифровка зашифрованного пароля будет неуспешной

На хосте, на котором выполнялся плейбук, согласно плейбуку сгенерировался файл с корректным паролем

Комментирование и размещение ссылок запрещено.

Комментарии закрыты.

Яндекс.Метрика