Доступ к фактам в плейбуке Ansible

Ansible – это современный инструмент управления конфигурацией. Для связи и выполнения команд на управляемых серверах (нодах) он использует только SSH и Python – то есть вам не нужно устанавливать агентское программное обеспечение на удаленные ноды. В этой серии мануалов вы познакомитесь с основными функциями Ansible, которые можно использовать для написания сценариев автоматизации серверов. В конце серии вы найдете практический пример плейбука для автоматизации настройки удаленного веб-сервера Nginx и развертывания на нем статического HTML-сайта.

Примечание: Это четвертая часть серии по работе с Ansible. Другие мануалы из этой серии вы найдете по тегу ansible-practice. Весь код можно найти в этом репозитории.

По умолчанию перед выполнением определенных в плейбуке задач Ansible некоторое время собирает информацию о системах, которые требуют оркестровки. Эта информация называется фактами. Факты содержат, среди прочего, такие детали, как сетевые интерфейсы и адреса, название операционной системы на удаленных нодах и доступный объем памяти.

Ansible хранит факты в формате JSON, элементы группируются по нодам. Чтобы проверить, какая информация доступна для систем, которые вы инициализируете, вы можете запустить модуль setup с помощью специальной команды:

ansible all -i inventory -m setup -u 8host

Эта команда выведет обширный код JSON, содержащий информацию о вашем сервере. Чтобы получить подмножество этих данных, вы можете использовать параметр filter и указать требуемый шаблон. Например, если вы хотите получить данные обо всех IPv4-адресах на удаленных нодах, вы можете использовать такую команду:

ansible all -i inventory -m setup -a "filter=*ipv4*" -u 8host

Эта команда выведет такой результат:

203.0.113.10 | SUCCESS => {
    "ansible_facts": {
        "ansible_all_ipv4_addresses": [
            "203.0.113.10",
            "198.51.100.23"
        ],
        "ansible_default_ipv4": {
            "address": "203.0.113.10",
            "alias": "eth0",
            "broadcast": "203.0.113.255",
            "gateway": "203.0.113.1",
            "interface": "eth0",
            "macaddress": "06:c7:91:16:2e:b7",
            "mtu": 1500,
            "netmask": "203.0.113.0",
            "network": "203.0.113.0",
            "type": "ether"
        }
    },
    "changed": false
}

Собрав факты, которые будут полезны для вашего плея, вы можете соответствующим образом обновить свой плейбук. В качестве примера следующий плейбук будет выводить IPv4-адрес сетевого интерфейса по умолчанию. Как мы видим вывода предыдущей команды, в предоставленном Ansible JSON это значение доступно через ansible_default_ipv4.address.

В каталоге ansible-practice создайте новый файл по имени playbook-03.yml:

nano ~/ansible-practice/playbook-03.yml

Затем добавьте в новый плейбук следующие строки:

---
- hosts: all
  tasks:
    - name: print facts
      debug:
        msg: "IPv4 address: {{ ansible_default_ipv4.address }}"

Сохраните и закройте файл.

Чтобы опробовать этот плейбук на серверах из вашего инвентаря, запустите команду ansible-playbook с теми же аргументами подключения, которые вы использовали ранее (при запуске первого примера). Опять же, для подключения к удаленным серверам мы будем использовать инвентарь по имени inventory и пользователя 8host:

ansible-playbook -i inventory playbook-03.yml -u 8host

Когда вы запустите плейбук, на экране вы увидите IPv4-адрес вашего удаленного сервера:

...
TASK [print facts] ***************************************************************************************************************************************************************************
ok: [server1] => {
    "msg": "IPv4 address: 203.0.113.10"
}
...

Факты содержат важные данные, с помощью которых вы можете лучше настроить свои плейбуки. Чтобы узнать больше о тех деталях, которые вы можете собрать с помощью фактов, обратитесь к официальной документации Ansible.

Tags: ,

Добавить комментарий