Введение
В этом практическом занятии (lab) вы узнаете, как создавать и настраивать файлы инвентаря Ansible. Ansible использует файлы инвентаря для определения и организации управляемых хостов. Вы изучите базовую структуру файла инвентаря, создадите группы, установите иерархию групп и назначите переменные группам. Эти навыки являются обязательными для эффективного управления инфраструктурой с помощью Ansible.
Создание базового инвентаря
В лабораторной среде предварительно настроен доступ по SSH к локальной машине. Вы можете использовать
localhostв качестве целевого хоста для всех операций Ansible в этом практическом занятии (lab).
Файл инвентаря Ansible определяет хосты и группы хостов, на которых выполняются команды, модули и задачи в плейбуке. Давайте создадим базовый файл инвентаря.
Создайте новый файл с именем inventory в каталоге /home/labex/project:
nano /home/labex/project/inventory
Добавьте в файл следующее содержимое:
localhost ansible_connection=local
Разберем это на составляющие:
localhost: Это имя хоста. В данном случае это локальная машина.ansible_connection=local: Это переменная Ansible, которая сообщает Ansible подключаться к этому хосту локально, а не по SSH. Это полезно для управления локальной машиной.
Сохраните файл и выйдите из редактора (в nano нажмите Ctrl+X, затем Y, а затем Enter).
Теперь давайте протестируем наш инвентарь с использованием модуля ping Ansible. Модуль ping на самом деле не использует протокол ICMP ping; вместо этого он проверяет, может ли Ansible подключиться к хосту и выполнить Python-код.
Запустите эту команду:
ansible -i inventory -m ping all
Разберем эту команду на составляющие:
-i inventory: Указывает файл инвентаря, который нужно использовать.-m ping: Сообщает Ansible использовать модульping.all: Целируются все хосты в инвентаре.
Вы должны увидеть вывод, указывающий на успешное подключение:
localhost | SUCCESS => {
"changed": false,
"ping": "pong"
}
Если вы видите такой вывод, это означает, что Ansible успешно подключился к локальному хосту и выполнил модуль ping.
Группировка хостов
Ansible позволяет организовать хосты в группы. Это полезно для применения конфигураций или выполнения задач на нескольких хостах одновременно. Давайте изменим наш инвентарь, чтобы включить группу.
Отредактируйте файл inventory:
nano /home/labex/project/inventory
Обновите содержимое до следующего:
[webservers]
localhost ansible_connection=local
Это определяет группу с именем webservers, которая включает наш локальный хост. В Ansible группы определяются путем помещения имени группы в квадратные скобки []. Любые хосты, перечисленные в группе, принадлежат этой группе.
Сохраните изменения и выйдите из редактора.
Теперь давайте протестируем нашу группу с использованием модуля ping:
ansible -i inventory -m ping webservers
Эта команда похожа на предыдущую, но вместо all мы целеуказываем на группу webservers.
Вы должны увидеть такой же успешный вывод, как и раньше, но теперь мы явно целеуказываем на группу webservers. Это может показаться ненужным при наличии только одного хоста, но по мере роста вашего инвентаря группировка становится все более полезной для целеуказания на определенные наборы хостов.
Создание иерархии групп
Ansible поддерживает вложенные группы, что позволяет создавать иерархии. Это полезно для организации хостов на основе их ролей или окружений. Давайте добавим еще одну группу и создадим иерархию.
Отредактируйте файл inventory:
nano /home/labex/project/inventory
Обновите содержимое до следующего:
[webservers]
localhost ansible_connection=local
[production:children]
webservers
Это создает новую группу с именем production, которая включает все хосты из группы webservers. Суффикс :children сообщает Ansible, что эта группа представляет собой группу групп, а не группу хостов.
Вот что означает эта иерархия:
- Любой хост из группы
webserversтакже неявно входит в группуproduction. - Вы можете применять конфигурации ко всем хостам в продакшене, целеуказывая на группу
production. - Вы по-прежнему можете целеуказывать только на группу
webservers, если это необходимо.
Сохраните изменения и выйдите из редактора.
Протестируйте новую иерархию групп:
ansible -i inventory -m ping production
Эта команда должна выполнить ping для всех хостов в группе production, которая включает все хосты из группы webservers. В нашем случае это по-прежнему только локальный хост, но в реальной ситуации эта структура позволяет осуществлять мощное и гибкое управление хостами.
Назначение переменных группам
Ansible позволяет назначать переменные группам в файле инвентаря. Эти переменные могут быть использованы в плейбуках и шаблонах, делая ваш код Ansible более гибким и повторно используемым.
Отредактируйте файл inventory:
nano /home/labex/project/inventory
Обновите содержимое до следующего:
[webservers]
localhost ansible_connection=local
[production:children]
webservers
[webservers:vars]
http_port=80
Это назначает переменную http_port со значением 80 всем хостам в группе webservers. Суффикс :vars используется для определения переменных для группы.
Сохраните изменения и выйдите из редактора.
Теперь давайте создадим простой плейбук для отображения этой переменной. Плейбук - это файл в формате YAML, который определяет набор задач для выполнения на хостах. Создайте новый файл с именем show_http_port.yml:
nano /home/labex/project/show_http_port.yml
Добавьте следующее содержимое:
---
- name: Show HTTP Port
hosts: webservers
tasks:
- name: Display HTTP Port
debug:
msg: "The HTTP port is {{ http_port }}"
Этот плейбук:
- Целеуказывает на группу
webservers - Имеет одну задачу, которая использует модуль
debugдля отображения сообщения - Использует синтаксис
{{ http_port }}для ссылки на переменную, которую мы определили в инвентаре
Сохраните изменения и выйдите из редактора.
Запустите плейбук:
ansible-playbook -i inventory show_http_port.yml
Вы должны увидеть вывод, отображающий значение порта HTTP:
PLAY [Show HTTP Port] ********************************************************
TASK [Gathering Facts] ********************************************************
ok: [localhost]
TASK [Display HTTP Port] ******************************************************
ok: [localhost] => {
"msg": "The HTTP port is 80"
}
PLAY RECAP ********************************************************************
localhost : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Это показывает, что переменная, которую мы определили в инвентаре, доступна в нашем плейбуке.
Резюме
В этом практическом занятии (lab) вы изучили основы управления инвентарем в Ansible. Вы создали базовый файл инвентаря и узнали, как использовать модуль ping Ansible для проверки соединения. Вы изучили, как группировать хосты и создавать иерархии групп, что является важной частью организации и управления более крупными инфраструктурами. Наконец, вы узнали, как назначать переменные группам и использовать их в простом плейбуке.
Эти навыки являются основой для работы с Ansible и будут неоценимы при переходе к более сложным задачам автоматизации. Помните, что эффективное управление инвентарем - это ключ к масштабируемым и поддерживаемым проектам на Ansible. По мере продолжения изучения Ansible рассмотрите возможность изучения более продвинутых функций инвентаря, таких как динамические инвентари и плагины инвентаризации.
Практика - это ключ к овладению этими концепциями. Попробуйте создать более сложные инвентари, поэкспериментируйте с различными структурами групп и используйте переменные в более продвинутых плейбуках. Чем больше вы будете работать с Ansible, тем более уверенно вы будете использовать его мощные возможности автоматизации.


