Файл inventory
Список хостов с тэгами (группами), на которые впоследствии ссылаются в задачах.
Последовательность поиска файла
По умолчанию: /etc/ansible/hosts
Однако проще указывать файл при запуске playbook
ansible-playbook -i my_inventory.ini playbook.yml
Форматы файлов:
Есть динамический, ini и yaml формат. Определяет формат по содержанию файла, расширение файла (.ini, .yaml, .yml) не играет роли. Порядок анализа:
- Является ли файл исполняемым — если да, то запускает его как динамический inventory
- Пытается распарсить как INI — если получается, использует INI-формат
- Пытается распарсить как YAML — если получается, использует YAML-формат
- Если ничего не подошло — выдает ошибку
Важно:
- Нельзя смешивать форматы в одном файле
- Способ отличия форматов:
INI-формат: начинается с секций в квадратных скобках [group]
YAML-формат: начинается с --- (опционально) или со слова all: / children: / hosts: - Автодетект может ошибаться. Если будет файл, валидный как INI и как YAML, то Ansible выберет INI.
Проверка, как Ansible интерпретирует ваш файл:
# Покажет структуру inventory в JSON
ansible-inventory -i ваш_файл --list
# Покажет в удобном для человека виде
ansible-inventory -i ваш_файл --graph
Можно в директории хранить несколько файлов и использовать их по необходимости.
# Посмотреть все хосты из inventory
ansible all -i inventory.ini --list-hosts
# Посмотреть переменные конкретного хоста
ansible -i inventory.ini web1 -m debug -a "var=hostvars[inventory_hostname]"
# Выполнить команду на группе серверов
ansible web_servers -i inventory.ini -m command -a "df -h"
ini формат:
Ожидается, что hosts в формате ini.
[example]
www.example.com
192.168.0.1
192.168.0.2:2222
Внутри [] название группы, далее состав этой группы (доменное имя или IP). Указание порта определяет порт ssh сервера.
Вложенные группы
При указании :children создается метагруппа. То есть
[staging:children]
web_servers
db_servers
создаст группу staging, которая будет состоять из хостов группы web_servers и db_servers. Это именно группы, хосты указывать в метагруппе нельзя. Можно городить любую иерархию, одна метагруппа внутри другой.
Переменные
Для хоста переменные через пробел в одной строке
[databases]
192.168.1.20 ansible_user=ubuntu ansible_ssh_private_key_file=~/.ssh/ubuntu-key.pem
При помощи :vars задаются переменные для группы
[staging:vars]
ansible_user=staging_user
env=staging
app_version=latest
Динамический инвентарь