Поиск по сайту:

Файлы инвентаризации и конфигурации Ansible

Несколько дней назад мы обсуждали, как настроить трехузловую лабораторию Ansible с использованием Vagrant в Linux. В этой статье мы подробно изучим фундаментальные концепции Ansible, такие как инвентаризация Ansible и файлы конфигурации.

Базовая структура Ansible

Когда вы начинаете работать с ansible, вам следует понимать два важных файла. Один из них — файл Инвентарь Ansible, а второй — файл Конфигурация Ansible.

Файл configuration содержит все конфигурации, которые ansible будет использовать во время выполнения. Когда вы устанавливаете ansible с помощью менеджера пакетов ОС, вы можете увидеть файл конфигурации по умолчанию с именем «ansible.cfg», созданный в каталоге /etc/ansible.

Файл инвентаризации содержит IP-адрес или информацию DNS о списке управляемых хостов, с которыми мы хотим работать. Ansible прочитает имена хостов из файла инвентаризации, и задачи/игры будут выполняться на этих узлах. Файлы инвентаризации можно создавать в форматах ini, yaml и json.

Ниже приведена структура моего проекта. У меня есть файл конфигурации ansible.cfg, файл хостов и книга воспроизведения, написанная в формате yaml.

Когда я запускаю книгу воспроизведения, ansible прочитает конфигурацию из файла ansible.cfg и сведения о хосте из файла хостов для запуска воспроизведения.

vagrant@controller:~/ansible_project$ tree .
.
├── ansible.cfg
├── hosts
└── playbook.yml

0 directories, 3 files

Давайте подробно поговорим об этих двух файлах и, наконец, выполним несколько специальных команд.

Файл конфигурации Ansible

Ansible использует файл конфигурации для загрузки параметров, необходимых для запуска задачи ansible. Если вы установили ansible с помощью менеджера пакетов, у вас будет файл ansible.cfg в каталоге /etc/ansible.

Ниже приведен образец файла ansible.cfg.

Файл конфигурации Ansible

Ansible будет искать файл конфигурации в следующем порядке.

  • ANSIBLE_CONFIG — переменная среды
  • ansible.cfg — текущий каталог, из которого вы запускаете команду.
  • .ansible.cfg — домашний каталог пользователя.
  • /etc/ansible/ansible.cfg — в каталоге /etc/ansible.

Запустите команду ansible --version, чтобы увидеть, какой файл конфигурации выбирает ansible.

ansible --version
ansible [core 2.12.3]
  config file = /home/vagrant/ansible_project/ansible.cfg
  configured module search path = ['/home/vagrant/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/local/lib/python3.8/dist-packages/ansible
  ansible collection location = /home/vagrant/.ansible/collections:/usr/share/ansible/collections
  executable location = /usr/local/bin/ansible
  python version = 3.8.10 (default, Nov 26 2021, 20:14:08) [GCC 9.3.0]
  jinja version = 2.10.1
  libyaml = True

Я создал собственный каталог проекта и файл ansible.cfg. Мой файл конфигурации содержит только два свойства: местоположение инвентаря и отключенную проверку ключа хоста.

[defaults]
inventory = /home/karthick/ansible_project/hosts
host_key_checking = False

Существует множество других свойств, но на данный момент вы можете начать использовать их, добавив только свойство «инвентарь».

Файл инвентаризации Ansible

В файле инвентаризации мы укажем IP-адреса или DNS имен серверов, сетевых устройств, облачных сервисов или всего, с чем может работать Ansible.

Инвентаризации могут быть написаны в формате ini, json и yaml, а также у вас есть сценарии для преобразования одного формата инвентаризации в другие форматы.

По умолчанию вы можете найти файл инвентаря (хосты) в каталоге /etc/ansible, если вы установили ansible с помощью диспетчера пакетов ОС. Всегда рекомендуется создать отдельный каталог проекта и создать файл инвентаризации и конфигурации.

В таблице ниже показано, как настроена моя лаборатория Ansible. Я собираюсь создать файл инвентаризации для этой лабораторной установки и запущу модуль ping, чтобы продемонстрировать, как все работает в файле инвентаризации.

NODE TYPENODE NAMEIP ADDRESSOS FLAVOR
Control Nodecontroller.anslab.com192.168.10.3ubuntu/focal64
Managed Nodemanaged1.anslab.com192.168.10.4ubuntu/focal64
Managed Nodemanaged2.anslab.com192.168.10.5ubuntu/focal64

Настройка трехузловой лаборатории Ansible

Файл инвентаризации без явной группировки

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

[group-name]
Resource1
Resource2
....
Resource N

Вы можете создать файл инвентаризации без использования групп. В этом случае Ansible будет использовать две группы по умолчанию: "все" и "разгруппированные".

  • ВСЯ ГРУППА — все ресурсы, доступные в файле инвентаризации, по умолчанию будут отнесены к всем группам.
  • РАЗГРУППИРОВАНО. Ресурсы, не входящие ни в одну пользовательскую группу, будут автоматически добавлены в несгруппированную группу.

Я создал файл инвентаризации без каких-либо групп. Теперь эти два узла будут относиться ко всей группе, а также к несгруппированной группе.

cat hosts
managed1.anslab.com
managed2.anslab.com

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

ansible all --list-hosts
  hosts (2):
    managed1.anslab.com
    managed2.anslab.com
ansible ungrouped --list-hosts
  hosts (2):
    managed1.anslab.com
    managed2.anslab.com

Файл инвентаря с группировкой

Как и было предсказано, группировка — отличный способ организовать ваши ресурсы, чтобы вам было легко запускать задачу для конкретной группы. У меня есть два управляемых узла, и на них установлена Ubuntu 20.04LTS.

Допустим, я хочу сгруппировать свой файл инвентаризации по типу ОС, тогда файл инвентаризации будет выглядеть, как показано ниже. Здесь ubuntu — имя группы.

[ubuntu]
managed1.anslab.com
managed2.anslab.com

Для этой группы можно запускать задачи.

ansible ubuntu -m ping -o
managed1.anslab.com | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"changed": false,"ping": "pong"}
managed2.anslab.com | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"changed": false,"ping": "pong"}

Если я сейчас проверю наличие «разгруппированной» группы, хоста там не будет.

ansible ungrouped --list-hosts
[WARNING]: No hosts matched, nothing to do
hosts (0):

Вы можете создать столько групп, сколько захотите, в файле инвентаризации и использовать одни и те же имена ресурсов.

[ubuntu]
managed1.anslab.com
managed2.anslab.com

[dev]
managed1.anslab.com

[test]
managed2.anslab.com
ansible ubuntu -m ping -o
ansible dev -m ping -o
ansible test -m ping -o

Файл инвентаря с диапазонами

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

[ubuntu]
managed[1:2].anslab.com

Файл инвентаризации с дочерними группами

Вы можете создать группу и использовать в ней другие имена групп. Взгляните на приведенный ниже пример: у меня есть группа Ubuntu, в которой есть имена моих серверов. Я создал еще одну группу с именем server, которая содержит группу Ubuntu.

Важно добавить :children к имени группы, иначе группа серверов будет воспринимать «ubuntu» как имя сервера, а не имя группы.

[ubuntu]
managed[1:2].anslab.com

[server:children]
ubuntu

Файл инвентаризации с переменными хоста и групповыми переменными

Файл инвентаря поддерживает переменные хоста и группы. Переменные хоста — это не что иное, как переменные и их значения, передаваемые хосту в файле инвентаризации. В приведенной ниже конфигурации я говорю ansible использовать ostechnix в качестве моего пользователя и вместо использования стандартного порта ssh использовать порт 2222.

[ubuntu]
managed1.anslab.com ansible_user=ostechnix ansible_port=2222
managed2.anslab.com ansible_user=ostechnix ansible_port=2222

Групповые переменные аналогичны переменным хоста, но переменные будут применяться ко всей группе, а не к одному хосту. Из приведенной выше конфигурации видно, что ansible_user и ansible_port одинаковы для обоих узлов. Таким образом, вы можете создать групповую переменную, переменные которой будут наследоваться всеми узлами группы. Вам нужно добавить :vars, чтобы сделать группу групповой переменной.

[ubuntu]
managed1.anslab.com
managed2.anslab.com

[ubuntu:vars]
ansible_user=ostechnix
ansible_port=2222

Внимание! Если у вас есть переменная группы и переменная хоста для одного и того же узла, то переменная хоста имеет высокий приоритет.

Вы можете использовать множество параметров инвентаря, их список можно получить в официальном документе.

Файл инвентаря с псевдонимом

Вы можете создать псевдоним для ресурса, как показано ниже. Здесь m1 и m2 — псевдонимы.

[ubuntu]
m1 ansible_host=managed1.anslab.com
m2 ansible_host=managed2.anslab.com

Теперь этот псевдоним можно использовать для запуска некоторых задач.

ansible m1 -m ping -o
m1 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"changed": false,"ping": "pong"}
ansible m2 -m ping -o
m2 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"changed": false,"ping": "pong"}

Файл инвентаризации в формате YAML

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

На изображении ниже представлены два узла с парой переменных хоста.

Инвентаризация с хост-варами

На изображении ниже представлены два узла с групповыми переменными.

Инвентаризация с групповыми переменными

Команда Ansible Inventory

В Ansible есть команда инвентаризации, которая будет очень полезна для просмотра информации файлов инвентаризации.

Чтобы получить список поддерживаемых опций, выполните команду help.

ansible-inventory --help

Чтобы получить данные инвентаризации в формате графика, используйте флаг --graph. Если у вас есть разные файлы инвентаризации, вы можете использовать флаг -i, чтобы явно указать на файл инвентаризации.

ansible-inventory --graph

Представление графика

Вы можете распечатать информацию о хосте и группе, передав флаг --vars вместе с флагом --graph.

ansible-inventory --graph --vars

Представление графика с переменными

Когда вы используете флаг --list, выходные данные будут в формате JSON.

ansible-inventory -list

Вывод JSON

Вы можете получить информацию о конкретном узле, используя флаг --host.

ansible-inventory --host managed1.anslab.com

Информация о хосте

Заключение

В этой статье мы рассмотрели важную концепцию, которая составляет ядро ansible архитектуры. Если вы новичок, сосредоточьтесь на создании инвентаря в формате ini, и в дальнейшем вы узнаете больше о лучших практиках, когда начнете работать над производственными проектами.

Читать далее:

  • Аутентификация Ansible SSH и повышение привилегий
  • Начало работы с специальными командами Ansible

Статьи по данной тематике

Все права защищены. © Linux-Terminal.com • 2023-2025