Автоматизируем и ускоряем процесс настройки облачных серверов с Ansible. Часть 3: Переменные и файл inventory
В первой части мы начали изучение Ansible, популярного инструмента для автоматизации настройки и развертывания ИТ-инфраструктуры. Ansible был успешно установлен, описаны принципы работы, базовая настройка. В завершении статьи мы показали как быстро установить nginx на несколько серверов.
Во второй части мы разобрались в выводе playbook, научились отлаживать и повторно использовать скрипты Ansible.
В этой части вы узнаете, как писать единый Ansible playbook для разных ОС (например с rpm и deb), как обслуживать множество хостов и не писать их все в inventory, как сгруппировать сервера по регионам InfoboxCloud и многое другое.
Переменные в AnsibleПеременные используются для хранения значений, которые могут применяться в playbook. В процессе использования переменные можно переопределять множество раз. Информация о серверах из inventory также может использоваться как переменные.
- передача файла переменных
- определение переменных в playbook
- передача в ansible-playbook, используя команду -e / --extra-vars
- определение переменных в файле inventory
Задача установит в переменную package_name значение httpd или apache2 в зависимости от семейства ОС на сервере.
Переменные можно использовать для установки значений пользователя в процессе исполнения playbook:
В переменные удобно сохранить список значений для его многократного использования. Если одна и та же переменная используется во множестве playbook – их использование уменьшит сложность скриптов.
Все переменные в Ansible должны начинаться с буквы. В имени можно использовать буквы, цифры и подчеркивания. Переменные, определенные в include файлах будут перегружать (заменять) переменные, определенные на других уровнях иерархии, кроме переменных, переданных через --extra-vars.
Переменные в импортированных файлах/ansible/playbooks/tasks/pkg_apache_install.yml):
Включим его в файл установки Apache и проверки, что сервис запущен (
/ansible/setup_apache.yml):
Как мы видим, в файле setup_apache.yml мы успешно используем переменную, определенную во включенном файле. Данный playbook будет правильно устанавливать apache и на rpm дистрибутивы и на deb, используя правильное имя пакета с apache.
Переменные в playbookПеременные в playbook устанавливаются с помощью ключевого слова vars:. Переменные устанавливаются в виде имя_переменной: значение. Переменные перегрузят другие переменные, которые установлены в глобальном файле или в inventory.
Пример описания переменной в playbook:
Переменные в глобальном файле/ansible/common/vars/global.yml
В данном примере мы задаем переменную package_name напрямую (после # можно написать комментарий), а ключи доступа для InfoboxCloud API ищем в переменных окружения с помощью плагина lookup.
В playbook путь к файлам переменных задается через vars_files:
Использование фактов как переменныхВы можете использовать любой факт как переменную, который собирается при gather_facts. Для получения списка всех фактов для конкретной группы машин используйте команду:
, где experiments – название группы машин в inventory.
Погружаемся в inventory–файлВ первой части мы кратко рассматривали простой inventory–файл. Давайте посмотрим на него внимательнее.
/ansible/inventory):
Можно просто записать имена хостов и ip адреса и будут использоваться все сервера при исполнении playbook с этим файлом inventory.
Группы в inventoryИспользование групп мы также уже видели ранее:
Группа для исполнения playbook указывается в разделе «hosts:» playbook
Если вы хотите использовать конкретный хост — можно в раздел hosts передать его.
Если вы хотите использовать все хосты всех групп — можно использовать
Группы групп в inventoryОчень полезная функция, позволяющая, например, сгруппировать хосты не только по назначению, но и по региону размещения, что очень актуально для InfoboxCloud (Москва, Амстердам). Нередко бывают и другие задачи, где нужно использовать группы групп.
В этом примере в группу web my входят сервера в Москве и Амстердаме. Можно из playbook обращаться как к группе web, так и к группам серверов в конкретном регионе.
Регулярные выражения в inventoryЕсли у вас есть большое количество серверов, использование соглашений о наименовании (например web001, web002… web00N) позволит проще указывать их в inventory. Можно использовать регулярные выражения в inventory файле:
, где web[001:200] будет соответствовать web 001, web002, web003, web004, . web199, web200 для группы web; db[001:020] будет соответствовать db001, db002, db003 . db019, db020 для группы db. 192.168.2.[1:30] будет соответствовать 192.168.2.1, 192.168.2.2, 192.168.2.3 для группы balancer.
Переменные в inventory–файлеРассмотренные ранее способы установки переменных применяли их сразу ко всем хостам в inventory. Иногда может потребоваться использование специфических переменных для конкретной группы хостов или конкретного хоста.
Установка переменных для конкретных хостов:
Установка переменных для группы хостов (web):
Вынос переменных в отдельные файлы для inventoryМожно создавать файлы переменных для хостов и для групп. Папки с этими файлами должны быть в одной директории с файлом inventory. Файлы переменных, относящиеся к конкретным хостам, нужно сохранять в папку host_vars, относящиеся к конкретным группам — в папку group_vars.
Пример файла переменных для хоста web001 (
/ansible/host_vars/web001):
Пример файла переменных для группы db (
Переменные inventory следуют иерархии: переменные в глобальном файле перегружают любые хост-переменные, групповые переменные и переменные в файле inventory. Хост-переменные перегружают групповые переменные, а в свою очередь групповые переменные перегружают переменные файла inventory.
Через ansible.cfg можно переопределить параметры конфигурации Ansible.
ЗаключениеВ написании статьи очень помогла книга "Learning Ansible" и конечно официальная документация.
Все эксперименты с Ansible удобно проводить в InfoboxCloud, так как имеется возможность для каждого виртуального сервера установить именно то количество ресурсов, которое необходимо для задачи (CPU/Ram/диск независимо друг от друга) или использовать автомасштабирование, а не выбирать VM из готовых шаблонов. Когда эксперименты не проводятся — можно просто выключить VM и оплачивать только стоимость диска.
Если вы обнаружили ошибку в статье, автор ее с удовольствием исправит. Пожалуйста напишите в ЛС или на почту о ней. Туда же можно задавать вопросы по Ansible для освещения в последующих статьях.