Установка Подключение управляемых узлов Проверка подключения управляемых узлов Собственные файлы инвентаризации Выполнение одиночной команды Создание и выполнение плейбука Анализ вывода плейбука Разбор кода плейбука Выполнение операций с повышенными привилегиями Проверка синтаксиса плейбука Использование Ansible 6.7.0
Окружение
Ansible — это система управления конфигурациями, предназначенная для автоматизации настройки и развертывания программного обеспечения. Она поддерживает управление сетевыми устройствами и серверами, на которых установлен Python версии 2.4 и выше, используя SSH или WinRM для установления соединения.
Основное преимущество Ansible заключается в его простоте и эффективности. Администратору достаточно описать желаемую конфигурацию системы с помощью специальных сценариев, называемых плейбуками (playbooks). Плейбуки пишутся на декларативном языке разметки YAML. Благодаря этому, процесс переконфигурирования системы становится быстрым и удобным: для внесения изменений достаточно добавить или изменить несколько строк в сценарии.
Ansible также отличается отсутствием необходимости установки дополнительного программного обеспечения на управляемые узлы, что упрощает его внедрение и использование в различных инфраструктурах.
Для установки Ansible необходимо выполнить в терминале следующую команду (потребуются привилегии администратора):
sudo dnf install ansible
1. Управляемые узлы в Ansible определяются в специальном файле инвентаризации, который по умолчанию расположен по пути /etc/ansible/hosts. Открыть файл на редактирование можно с помощью команды (потребуются права администратора):
nano /etc/ansible/hosts
В данном файле адреса узлов могут быть указаны в различных форматах: как в виде IP-адресов, так и в виде доменных имён или имён хостов. Например:
[test] node.example.ru 192.168.0.100
Указывать адреса узлов можно с помощью функции диапазона, чтобы не вписывать их по одному. Например, чтобы указать десять узлов (node01, node02, … node10), допускается использование следующей записи:
node[01:10].example.ru
Ещё одна полезная функция — возможность определять псевдонимы для узлов. Например, можно использовать псевдоним custom_name, если указать его в файле следующим образом:
custom_name ansible_host=node.example.ru
Узлы можно объединять в группы. Для этого в квадратных скобках указывается название группы, а ниже перечисляются узлы, входящие в группу:
[group1] node1.example.ru 192.168.0.100 [group2] node2.example.ru 192.168.0.101
2. Для подключения к управляемым узлам используется протокол SSH c использованием RSA-ключей. Настройка подробно описана в нашей статье "Аутентификация по протоколу SSH с использованием RSA-ключа".
Необходимо сгенерировать и распространить ключ на все управляемые узлы. Для генерации ключа используется следующая команда:
ssh-keygen -C "$(whoami)@$(hostname)-$(date -I)"
3. Далее нужно распространить ключ на все подключенные хосты. Распространить ключи на хосты можно командой:
ssh-copy-id user@host
где:
user — пользователь управляемого узла;
host — адрес управляемого узла.
Пример:
ssh-copy-id root@192.168.0.100
Для проверки подключения всех узлов можно использовать встроенный модуль Ansible — ping:
ansible all -m ping
Если для подключения используется SSH с аутентификацией по паролю, то на управляющей машине дополнительно должен быть установлен пакет sshpass. Установить его можно с помощью команды:
sudo dnf install sshpass
Также для аутентификации по паролю необходимо использовать ключ -k при выполнении команды:
ansible all -m ping -k
Об успешном подключении к узлу проинформирует зелёная надпись следующего вида:
192.186.0.100 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python3.8" }, "changed": false, "ping": "pong" }
Для проверки подключения отдельной группы можно указать её название в команде вместо слова «all»:
ansible group_name -m ping
где group_name — это группа хостов, указанная в файле hosts. В результате под каждым хостом должно быть написано "ping": "pong".
При выполнении некоторых команд Ansible для перечисления управляемых узлов можно использовать собственные файлы инвентаризации. Для использования собственных файлов инвентаризации в командах необходимо указывать ключ -i:
ansible all -i /путь/к_файлу/инвентаризации -m ping
Допускается использование нескольких файлов инвентаризации в одной команде с указанием аргумента -i для каждого:
ansible all -i inventory1 -i invetory2 -i inventory3 -m ping
Также возможно перечисление нескольких узлов в одной команде. Нужные узлы перечисляются через запятую:
ansible all -i host1,host2,host3 -m ping
Ещё одной важной функциональной возможностью является поддержка выполнения команды для целого каталога, содержащего файлы инвентаризации. Для реализации данного подхода необходимо создать соответствующую иерархическую структуру файлов, которая должна быть организована следующим образом:
inventory/ inventory1 inventory2 inventory3
В данном случае при выполнении команды достаточно указание каталога, содержащего файлы инвентаризации. В результате команда будет автоматически выполнена для всех узлов, перечисленных в файлах указанного каталога:
ansible all -i inventory -m ping
Ansible позволяет выполнять одиночные bash-команды без создания плейбуков. Например, для проверки объема и использования оперативной памяти на управляемых узлах выполните команду:
ansible all -a "free -h"
В результате выполнения команды управляемые узлы могут вернуть сообщение следующего вида:
192.168.0.100 | CHANGED | rc=0 >> total used free shared buff/cache available Mem: 954Mi 282Mi 147Mi 6,0Mi 524Mi 519Mi Swap: 2,0Gi 162Mi 1,8Gi
Плейбуки (playbooks) — это сценарии, написанные на декларативном языке разметки YAML, которые выполняются на управляемых узлах. Благодаря своей декларативной природе плейбуки позволяют задавать желаемую конфигурацию узла в виде набора задач.
Файлы плейбуков можно хранить в любом удобном месте, но важно, чтобы файлы имели расширение .yml. Для создания плейбука можно выполнить следующую команду:
nano playbook.yml
В качестве первого примера рассмотрим создание плейбука для вывода переменной $HOSTNAME со всех управляемых узлов с помощью выполнения bash-команды echo. Добавьте в файл плейбука следующее содержимое:
Синтаксис YAML зависит от отступов, поэтому запись кода плейбуков представлена как кодом, так и в виде скриншота.
- name: Echo Playbook hosts: all tasks: - name: Execute command shell: echo "My hostname is "$HOSTNAME register: output - name: Display echo debug: var: output.stdout_lines
Запустить выполнение плейбука можно следующей командой:
ansible-playbook playbook.yml
Также, как и при использовании команды ansible, при запуске плейбука можно указать собственные файлы инвентаризации:
ansible-playbook playbook.yml -i /путь/к_файлу/инвентаризации
Для того чтобы узнать, какие узлы затронет выполнение плейбука, следует использовать команду:
ansible-playbook playbooks.yml --list-host
Результат вывода выполнения плейбука разделяется на несколько частей. Рассмотрим каждую из них:
PLAY [Echo Playbook]
В данной строке Ansible сообщает нам, что выполняется плейбук «Echo Playbook». Примечательно: если не добавлять строку с названием плейбука, Ansible вместо названия плейбука в квадратных скобках укажет группу управляемых узлов, на которую распространяется выполнение плейбука.
TASK [Gathering Facts] ok: [192.168.0.100]
Перед каждым воспроизведением плейбука Ansible автоматически собирает информацию об используемом окружении на управляемом узле. Например, используемую версию Python. В этой строке Ansible оповещает о том, что данные успешно собраны.
TASK [Execute Command] changed: [192.168.0.100]
TASK [Display echo] ok: [192.168.0.100] => { "output.stdout_lines": [ "My hostname is localhost.localdomain" ] }
Следующие сообщения уже говорят о статусе выполнения указанных в плейбуке задач. Первое сообщение указывает на то, что на управляемом узле были выполнены изменения. Однако в действительности никаких изменений не производилось. Такая ситуация возникает из-за того, что Ansible интерпретирует выполнение определённой команды или задачи как потенциальное изменение состояния системы.
Второе сообщение уже выводит желаемый результат выполнения команды echo.
PLAY RECAP 192.168.0.100 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Последнее сообщение представляет собой сводку выполнения плейбука, содержащую итоговую информацию о количестве выполненных задач, а также о количестве изменений, внесённых на управляемом узле. В этом отчёте также указывается количество задач, которые не были выполнены или завершились с ошибкой.
Разберём код подробнее. В первой строке используется ключевое слово name для указания названия плейбука:
- name: Echo Playbook
Указание имён необязательно, но они улучшают читаемость кода и помогают ориентироваться в логике работы плейбука. Допускается использование названий на русском языке.
В следующей строке указывается группа управляемых узлов:
hosts: all
Так как в данном примере стоит цель выполнения плейбука на всех управляемых узлах, то в значении этой строки указывается ключевое слово all.
Со строки tasks: начинается перечисление задач, которые должны быть выполнены на управляемых узлах. Каждой задаче назначено определённое имя аналогично имени плейбука. Рассмотрим код первой задачи:
- name: Execute command shell: echo "My hostname is "$HOSTNAME register: output
Для выполнения bash-команды используется встроенный в Ansible модуль shell. Именно работу этого модуля Ansible интерпретирует как изменение на управляемом узле. Вывод выполненной команды передаётся в переменную output с помощью ключевого слова register.
Результат команды echo можно получить из значения свойства переменной output под названием stdout_lines. Для вывода результата используется встроенный модуль debug:
- name: Display echo debug: var: output.stdout_lines
Следует отметить, что соблюдение правильного количества отступов при написании сценариев на YAML является критически важным для корректной работы сценариев.
Для некоторых операций на управляемых узлах требуются привилегии администратора.
В качестве примера рассмотрим создание плейбука для установки программ на управляемые узлы. Для этой задачи плейбук должен выглядеть следующим образом:
- hosts: all become: yes tasks: - name: Install programm vars: packages: - unrar - p7zip dnf: name: "{{ packages }}"
В результате выполнения плейбука на управляемые узлы будут установлены пакеты unrar и p7zip. Для запуска плейбука потребуется использовать ключ -K (потребуется ввести пароль администратора управляемого узла):
ansible-playbook playbook.yml -K
При успешном выполнении задачи Ansible может вывести в терминал следующее сообщение:
TASK [Install programm] changed: [192.168.0.100]
Важным нововведением в коде плейбука является строка:
become: yes
Эта строка указывает плейбуку использовать привилегии администратора на управляемых узлах. Вместо добавления этой строки в сценарий можно добавить ключ -b в команду запуска плейбука:
ansible-playbook playbook.yml -K -b
В коде задачи создаётся массив с именем packages, в котором перечисляются пакеты, которые будут установлены на управляемых узлах.
vars: packages: - unrar - p7zip
Для установки пакетов на узлах под управлением РЕД ОС используется встроенный модуль dnf. Важно понимать, что параметр name в данном контексте не является названием задачи, а представляет собой свойство модуля, в которое передаются названия пакетов, подлежащих установке. Именно в это свойство необходимо передать массив packages для установки необходимых пакетов.
dnf: name: "{{ packages }}"
По умолчанию при запуске плейбука Ansible автоматически проверяет его синтаксис. Однако часто возникает необходимость проверки синтаксиса без запуска плейбука. Для этого можно использовать следующую команду:
ansible-playbook --syntax-check your_playbook.yml
Пакеты Ansible версии 6.Х располагаются в подключаемом репозитории, поэтому порядок установки несколько отличается от обычного.
Установка пакетов Ansible версии 6.Х на РЕД ОС 7.3 производится с помощью следующей цепочки команд (потребуются привилегии администратора):
dnf install ansible6-release dnf clean all dnf makecache dnf install ansible
Дата последнего изменения: 27.06.2025
Если вы нашли ошибку, пожалуйста, выделите текст и нажмите Ctrl+Enter.
Нажимая «Отправить запрос», вы соглашаетесь с условиями обработки персональных данных.
Вы будете получать только актуальную информацию по обновлению безопасности
Подписываясь на уведомления, вы соглашаетесь с условиями обработки персональных данных.
На ваш почтовый адрес отправлено письмо с подтверждением подписки.