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

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

— конфигурационный файл Ansible, Inventory-файл
— полезные команды Ansible
— теги
— переменные
— Ad-Hoc-режим
— модули
— debug в Ansible

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

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

 

Конфигурационный файл Ansible, Inventory-файл

Просмотр версии Ansible и используемого конфигурационного файла Ansible

 

Конфигурационный файл Ansible(ansible.cfg) может располагаться в разных местах и соответственно иметь разный приоритет для Ansible
Ниже представлен список мест, откуда Ansible может читать свой конфигурационный файл в порядке наиболее приоритетного к наименее приоритетному
1. Расположение файла определено переменной окружения $ANSIBLE_CONFIG
2. Файл ansible.cfg в корне каталога с проектом(в текущей директории)
3. Файл .ansible.cfg в домашнем каталоге пользователя ~/.ansible.cfg
4. Глобальный/общий файл /etc/ansible/ansible.cfg

Полезно использовать отдельный ansible.cfg файл для проекта, помещая его в корневой каталог проекта, путем копирования из глобального файла /etc/ansible/ansible.cfg и изменяя необходимые параметры(например, расположение ролей и инвентори-файла)

Проверка используемого inventory-файла

Указание Inventory файл в конфиге Ansible вместо указывания inventory-файла в командной строке

 

Inventory-файл можеть бать определен в следующих местах:
1. В переменной окружения $ANSIBLE_HOSTS
2. Параметром -i при запуске ansible или ansible-playbook
3. В кофигурационном файле ansible через параметр inventory

Отключение предложения по добавлению ключей SSH в файл known_hosts(проверка host fingerprint)

Альтернативным вариантом является установка переменной

Добавление хоста в inventоry-файл

На управляемой ноде необходимо установить python, а также пакет python-apt(python интерфейс к libapt-pkg)

Проверка доступности хоста по icmp-протоколу

Если нужно выполнить команду/playbook для всех серверов, тогда используем дефолтную группу all

 

По умолчанию все сервера входят в группу all
Все сервера, которые не принадлежат какой-либо группе, по умолчанию входят в группу ungrouped
Т.е. каждый сервер, как минимум, входит в 2 группы(all + ungrouped/group_name)

Если команду необходимо выполнить локально(на самом Ansible-сервере), то в inventory-файл добавляем опцию ansible_connection со значением local для Ansible-мастера


Полезные команды Ansible

Проверка синтаксиса playbook-а (опция —syntax-check)

 

Имитация выполнения плейбука(dry-run режим) без его фактического выполнения(опция —check).Полезно посмотреть/проверить что и на каких серверах будет изменено при выполнении этого плейбука
В этом режиме Ansible не будет вносить никаких изменений на вашем хосте, а просто сообщит, какие изменения будут сделаны, если бы плейбук был запущен без этого флага.
Важно помнить,что это может не работать должным образом, если ваших задачах используются условия.

 

Теги
Выполнение ТОЛЬКО задач с определенным тегом(опция —tags)

Предварительно необходимо установить тег на таске

Если несколько тегов необходимо установить, то используем формат

 

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

 

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

 

Просмотр списка доступных в плейбуке тегов

Также теги можно навешивать и на роли, таски, плейбуки

Например, для ролей

На плейбуки

 

Hosts-шаблоны

Все хосты в группе app

Все хосты, за исключением хостов в группе web

Все хосты, которые находятся в группах lb или db

 

Выполнение плейбука на конкретном хосте(опция —limit )

 

Выполнение плейбука на нескольких хостах(опция —limit)

 

Выполнение плейбука на определенном хосте и только определенной роли/таска с указанным тегом

 

Просмотр спиcка хостов, на которых будет выполняться плейбук

 

Просмотр списка всех тасков, которые будут выполнены

 

Просмотра списка всех тасков, которые будут выполнены, в которых есть указанных тег

 

Просмотр списка всех хостов, на которых будут выполнены таски, выполняющееся для группы kub

 

Пошаговое выполнение каждого таска в плейбуке с необходимостью подтверждения об выполнении или пропуске выполнения каждого таска
Это позволит вам выбирать, хотите ли вы выполнить задачу ( y ), пропустить ее ( n ) или ( c ) продолжить не спрашивая.

 

Переменные

Inventory-переменные

Спиоск inventory-переменных для всех хостов

Или вывод в формате yaml

Список inventory-переменных для конкретного хоста(например,хоста с именем kub)

Часть этих переменных(ansible_host, ansible_user, ansible_port, ansible_ssh_private_key_file,owner) указана в inventory-файле для этого хоста

А переменная «message» указана для группы other, в которую входит группа kub, в которую входит хост kub

Построение дерева/графика inventory

Аналогично,но с выводом переменных

 

Рекомендуется не использовать переменные в inventory-файле, а выносить в отдельный каталог с именем
group_vars – для определения групповых переменных(т.е. переменные будут доступны для всех хостов, включенных в эту группу)
Внутри каталога group_vars создаются файлы с названием группы, к хостам которой необходимо применить эту переменную
host_vars – для определения переменных для конкретного хоста
Внутри каталога host_vars создается файл с названием хоста, к которому необходимо применить переменную
Каталоги group_vars/host_vars необходимо создавать на одном уровне с inventory-файлом если предполагается использования команд типа ansible, ansible-console и т.д.
Каталоги group_vars/host_vars необходимо создавать на одном уровне с файлом плейбуком, если предполагается использования команды ansible-playbook
Если одна и та же переменная определена и для группы и для хоста, то приоритет имеет переменная, определенная для хоста.

 

Список переменных, отсортированный в порядке от минимального до максимального приоритета

 

Например, выполним перенос переменных из файла inventory в отдельный файл в каталоге group_vars для группы webservers
Например, в inventory-файле содержится

Внутри этого каталога создадим файл с именем группы(webservers)

Закомментируем переменные для этой группы в файле inventory

Проверяем наличие переменных у всех хостов в группе webservers

 

Типы переменных в Ansible:
1. Переменные определенные/заданные пользователем
2. Автоматически собранные переменные – facts ( по умолчанию в каждом плейбуке первым таском запускается сбор фактов с помощью модуля setup, который и собирает всю инфу с целевого хоста, в результате чего становятся доступным множество переменных типа ansible_ значения которых наполняется после сбора fact-ов). Если в сборе фактов не необходимости(например, не используются переменные, получаемые из фактов или просто не нужна никаая информация о хосте), то можно отключить сбор фактов. Для плейбука достаточно добавить строку gather_facts: no на том же уровне,где находится tasks
3. Локальные факты(facts.d). Пользователь может разместить файл/ы с именами *.fact на целевой машине в каталоге /etc/ansible/facts.d/ и переменные указанные в этих .fact-файлах будут доступны при обработке gathering facts, как ansible_local
4. Magic-переменные.
Имена таких переменных зарезервированы Ansible-ом. Наиболее используемые magic-переменные:
рostvars, groups, group_names, inventory_hostname
Более подробно о magic-переменных:
https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html#accessing-information-about-other-hosts-with-magic-variables

Пример локальных переменных
Например, на целевом хосте размещаем файл

 

С управляющей ноды проверяем доступность локальных переменных

И эти перменные доступны в templat-ах/playbook-ах
Например, значение переменной db_package доступно через

 

Переменные могут быть определены и переопределены в нескольких местах
Список мест, где могут быть определены переменные, отсортированный в порядке наиболее приоритетных

Полный список переменных отсортированный менее приоритетного к более приоритетному доступен по ссылке
https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html#ansible-variable-precedence

В ролях переменные могут определяться как переменные по умолчанию(общие для всех) ( в файле roles//defaults/main.yml), а также более специфичные/конкретные/приоритетные в файле roles/<role_name>/vars/main.yml

Полезно разделять переменные по окружениям(dev,staging,prod)
Например, структура директорий может иметь вид
ansible/
# Групповые (общие) переменные

# Переменные отдельных хостов (частные)

Общие переменные для всех групп указываются в файлах в каталоге group_vars/all
Переменные для всех хостов в группах определенных окружений соответственно в файлах group_vars/{dev,stage,prod}
Переменные для конкретных хостов указываются в файле в каталоге host_vars/{hostname}
Каждая группа и каждый хост могут иметь набор переменных в разных файлах (например common, secret).Названия файлов в директориях здесь не важны, главное чтобы имя директории совпадало с именами (группы или хоста) в соответствующем inventory. Заводить директорию для группы или единичного хоста не обязательно, можно просто создать файл и записать в нем все необходимые переменные. Однако такая структура каталогов позволяет хранить пароли в шифрованном виде (не хеши, а именно пароли), отдельно от общих переменных и в последствии использовать ansible-vault для шифрования значения переменных, содержащих sensitive-данные.

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

 

Переменные в плейбуках могут определяться непосредственно или через подключение дополнительного файла с переменными с помощью опции vars_files
Это дополнительный файл с переменными указывается относительно пути плейбука и должен быть создан в формате YAML

 

 

Определение переменных с командной строки (—extra-var/-e)

С командной строки передадим переменную MYHOSTS, которая используется в плейбуке и определяет хосты, на которых необходимо выполнить плейбук
(Более элегантный/правильный способ для изменения хостов, на которых должен выполняться playbook является указание опции -l при запуске плейбука)

Запуск плейбука выполняется с передачей переменной MYHOSTS

Проверим, что приоритет переменной, заданной с командной строки больше, чем приоритет переменной, указанной, например, в inventory-файле
Например, зададим переменную owner для хоста в inventory-файле

При выполнении плейбука с передачей уже существующей/определенной переменной(owner) с помощью —extra-var переопределим эту переменную, присвоив ей другое значение(myuser1)

 

Переменные в Ansible доступны с помощью двойных фигурных скобок {{ variable_name }}
Если переменная используется как первый элемент значения, тогда ее обязательно необходимо обрамлять в двойные кавычки


Ad-hoc-режим

Синтаксис Ad-hoc режима

По умолчанию ansible будет подключаться к удаленным хостам по ssh под пользователем, под которым выполняется текущая команда ansible
Для подключения под отличным от текущего пользователя, необходимо использовать опцию -u
Альтернативным вариантом является указание пользователя в inventory-файле в переменной ansible_user для хоста/группы.
Также в конфигурационном файле ansible.cfg есть параметр remote_user, который можно использовать для этих целей

В плейбуках также можно определять данную опцию remote_user, которая имеет приоритет над определенной в глобальном/общем файле конфигурации(/etc/ansible/ansible.cfg)

 

Для того, чтобы под текущим пользователем(например, myansibleuser) подключиться на управляемую машину для выполнения команд необходимо
1.Настроит беспарольный SSH-доступ(по приватным ключам) с Ansible управляющего хоста на управляемую ноду

2.Предоставить пользователю myansibleuser повышать свои привилегии до root-пользователя с помощью sudo на управляемом хосте

3.Настроить/проверить(по умолчанию эти опции также используются) возможность повышать привилегии до root-пользователя в конфигурационном файле Ansible — ansible.cfg

 

Модули
Просмотр доступных модулей в Ansible

https://docs.ansible.com/ansible/latest/modules/list_of_all_modules.html

Просмотр документации по модулю

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

Если модуль не указывается,то используется модуль command
Например

Аналогично команде

 

Модуль setup -сбор фактов
Список fact-ов(информации) собираемых ансиблом для хоста и доступних в Playbook-e или templat-е в виде соответствующих переменных

Фильтрация фактов(например, выведем только переменную ansible_distribution)

 

Модули shell и command -выполнение команды удаленном сервере
Модуль shell — запуск Shell-команды(модуль shell и в качестве аргумента передаем команду, которую нужно выполнить, запуск команды происходит в оболочке (/bin/sh) на удаленной машине )

 

Модуль command -налогично shell, но запуск команды на удаленной машине происходит без использования оболочки, поэтому переменные окружения не будут доступны, также не будут доступны операторы типа

Разница между shell и command хорошо видна на команде с использованием операторов, которые не поддерживает модуль command(например, оператор | )

 

Модуль copy -копирование файла на удаленный сервер
Копирование файла на управляемый сервер

Если не хватает прав на создание файла на управляемом хосте,то используем опцию –b (—become), которая повышает привиллегии до root-пользователя через маханизм sudo

Просмотр наличия файла на управляемой машине

 

Модуль file -создание/удаление файла/каталога на управляемом хосте
Удаление файла на управляемом хосте

 

Модуль get_url -Закачивание файлов с HTTP,HTTPS,FTP-хостов по URL на управляемый хост

 

Модуль apt -установка/удаление пакета в Debian/Ubuntu
Установка(если не установлен) или обновление до последней версии(если установлен) пакета stress

Либо
Установка(если не установлен) пакета stress с предварительным обновлением локального кеша пакетов

Удаление пакета stress

Установка Apache на Ubuntu


Модуль service
— запуск/остановка/перезапуск сервиса и добавление/удаление сервиса на/из автозагрузку/и
Запуск сервиса apache2 и добавление его в автозагрузку

 

Модуль uri -проверка доступности страницы в Интернете

по статусу кода ответа можно понять коректно ли выполнилась команда
Если нужно получить/просмотреть содержимое страницы

 

Модуль git — получение файлов(checkout) с git-репозитария
Checkout приватного git-репозитария на целевой хост в каталог /home/calculator
SSH-ключ, с которым с целевого хоста идет аутентификация на Git-сервере, указывается в опции key_file
Если файл имеет имя id_rsa и находится внути каатлога ~/.ssh/ на целевом хосте, то этот файл будет использоваться по умолчанию и нет необходимости принудительно его указывать через опцию key_file

До и после выполнения задачи считается SHA, который позволяет понять, был ли репозиторий обновлен.

 

Модуль debug — модуль печатает операторы во время выполнения и может быть полезен для отладки переменных или выражений без необходимости остановки выполнения плейбука
Например

Или вывести значения переменных inventory_hostname(которую мы определяем в inventory-файле) и ansible_fqdn(собранную/полученную ансиблом во время выполнения таска по умолчанию с именем gathering facts)

Вывести значение перменной ansible_os_family
При использовании параметра var переменная указывается без каких-либо дополнительных символов/кавычек т.е. необходиом указывать непосредственно имя переменной

 

Модуль lineinfile — управление строками в файле

Модуль lineinfile используется для вставки/изменения/удаления текста/строк в файле
Например, вставим/добавим(параметр state) указанную строку(параметр line) в указанный файл(параметр path)
Указанная строка будет добавлена в конец указанного файла
Если файл не существует, то он будет создан(параметр create). В том числу будет создана и структуру каталогов, по пути которой находится файл(/project/devops/)
Если не указывать параметр create и файл не существует, то таск выполнится с ошибкой
Если повторно выполнить этот плейбук,т о никаких изменений сделано не будет т.к. файл уже существует и содержит желаемую строку

Если необходимо заменить строку, которая соответствует regexp-у на указанную строку
Например, в файле /project/devops/abc.txt(параметр path) заменить строку, которая начинается со слова «docker» (параметр regexp) строкой «hello world» (параметр line)
Важным моментом является указание параметра backrefs в значение yes(по умолчанию используется backrefs: no). Если параметр backrefs не указан или указан в no, то работает это следующим образом, если строка с указанным regexp-ом не найдена,то указанная в параметре line строка будет добавлена в конец файла. Более того, при повторном выполнении плейбука,сснова такая строка будет добавлена в конец файла т.е. по факту будет продублирована, что явно нежелательно
При указании backrefs: yes, если строка с указанным regexp-ом не найдена, то ничего не будет изменено/добавлено в файле

Для удаления строки соответствующей шаблону используется значение absent для параметра state

Python синтаксис регулярных выражений
https://docs.python.org/3/library/re.html
https://docs.python.org/2/library/re.html

 

Количество одновременно выполняемых процессов(-f)
По умолчанию используется 5 параллельных процесов для выполнения команд на разных хостах

Если необходимо, чтобы команды выполнялись только на одной машине одновременно, тогда используем опцию -f

 

Debug в Ansible
Уровень детализации вывода при выполнении плейбука регулируется кол-вом опций -v(verbose)

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

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

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