Системы управления конфигурацией упрощают администраторам процесс управления большим количеством серверов. Они позволяют автоматически контролировать разные системы из единого центра.
Для систем Linux доступны разные инструменты управления конфигурацией, например Chef и Puppet, но они сложные. Ansible — отличная альтернатива этим инструментам, поскольку его архитектура не требует установки специального программного обеспечения на нодах, использует SSH для выполнения задач автоматизации и файлы YAML для определения деталей выделения ресурсов.
В этом гайде мы разберем, как установить Ansible на сервер Debian и рассмотрим основы использования этого программного обеспечения. Подробный обзор Ansible смотрите в мануале Основы управления конфигурацией с помощью Ansible.
Требования
Нам понадобится:
- Главная нода управления Ansible: это машина, которую мы будем использовать для подключения и управления хостами Ansible с помощью SSH. Главной нодой Ansible может быть локальный компьютер или выделенный для запуска Ansible сервер. Но в этом гайде предполагается, что главная нода это система Debian 11. Убедитесь, что на главной ноде есть:
- Пользователь sudo. Для настройки можете выполнить разделы 2 и 3 мануала по настройке сервера Debian. Обратите внимание, если вы используете удаленный сервер в качестве главной ноды Ansible, то вам нужно также настроить брандмауэр ufw и разрешить внешний доступ к профилю пользователя non-root, что обеспечит безопасность удаленного сервера.
- Пара ключей SSH, связанная с этим пользователем. Для настройки выполните раздел 1 мануала по настройке ключей SSH в Debian.
- Один или несколько хостов Ansible: это любой компьютер, которым управляет главная нода Ansible. В этом гайде предполагается, что хосты Ansible являются удаленными серверами Debian. Убедитесь, что на каждом хосте Ansible есть:
- Открытый SSH-ключ главной ноды Ansible в файле author_keys системного пользователя. Этот пользователь может быть root или sudo. Для настройки можете выполнить раздел 2 мануала по настройке ключей SSH в Debian.
1: Установка Ansible
Чтобы начать использовать Ansible как средство управления серверной инфраструктурой, необходимо установить программное обеспечение Ansible на машину, которая будет служить главной нодой управления Ansible.
Чтобы включить PPA-архив официального проекта в список источников системы, на главной ноде выполните следующую команду:
sudo apt-add-repository ppa:ansible/ansible
Когда будет предложено принять добавление PPA, нажмите ENTER.
Затем обновите индекс пакетов системы, чтобы она знала о доступных в новом PPA пакетах:
sudo apt update
После обновления можно установить программное обеспечение Ansible:
sudo apt install ansible
Теперь на главной ноде Ansible есть необходимое для администрирования хостов программное обеспечение. Далее мы рассмотрим настройку файла инвентаризации главной ноды, чтобы Ansible мог управлять хостами.
2: Настройка файла инвентаризации
Файл инвентаризации (inventory file) содержит информацию о хостах, которые будут управляться с помощью Ansible. В файл инвентаризации можно включить от одного до нескольких сотен серверов, а хосты распределить по группам и подгруппам. Файл инвентаризации также часто задает переменные, действующие только для определенных хостов или групп, чтобы их можно было использовать с плейбуками и шаблонами. Некоторые переменные также могут влиять на способ запуска плейбука, например переменная ansible_python_interpreter, которую мы увидим далее.
Чтобы изменить заданное по умолчанию содержание файла инвентаризации Ansible, откройте файл /etc/ansible/hosts с помощью любого текстового редактора на главной ноде Ansible:
sudo nano /etc/ansible/hosts
Примечание: Ansible обычно создает файл инвентаризации по умолчанию в etc/ansible/hosts, но вы можете создавать файлы инвентаризации в любом месте, которое больше вам подходит. В нашем случае нужно будет указать путь к пользовательскому файлу инвентаризации через параметр -i при запуске команд Ansible и плейбуков. Использование индивидуальных файлов инвентаризации для каждого отдельного проекта позволяет минимизировать риск запуска плейбука на несоответствующей группе серверов.
Файл инвентаризации Ansible по умолчанию содержит ряд примеров, которые можно использовать как пример при настройке инвентаризации. В следующем примере мы определим группу [servers] с тремя разными серверами, у каждого из которых свой идентификатор: server1, server2 и server3. Обязательно замените их IP-адресами ваших хостов Ansible.
[servers] server1 ansible_host=203.0.113.111 server2 ansible_host=203.0.113.112 server3 ansible_host=203.0.113.113 [all:vars] ansible_python_interpreter=/usr/bin/python3
Подгруппа all:vars задает параметр хоста ansible_python_interpreter, который будет действовать для всех хостов из списка. С этим значением параметра удаленный сервер использует исполняемый файл Python 3 /usr/bin/python3, а не /usr/bin/python (Python 2.7), которого нет в последних версиях Debian.
Сохраните и закройте файл: нажмите CTRL+X, затем Y и ENTER для подтверждения изменений.
Если захотите проверить файл инвентаризации, можете запустить команду:
ansible-inventory --list -y
Вывод будет примерно такой, но в нем будет показана серверная инфраструктура, которая указана в вашем файле инвентаризации:
all: children: servers: hosts: server1: ansible_host: 203.0.113.111 ansible_python_interpreter: /usr/bin/python3 server2: ansible_host: 203.0.113.112 ansible_python_interpreter: /usr/bin/python3 server3: ansible_host: 203.0.113.113 ansible_python_interpreter: /usr/bin/python3 ungrouped: {}
После настройки файла инвентаризации можно переходить к тестированию подключения к хостам Ansible.
3: Тестирование подключения
После настройки файла инвентаризации можно проверить Ansible на подключение к этим серверам и возможность выполнять команды через SSH.
В этом гайде мы будем использовать учетную запись root в Debian, поскольку обычно это единственная доступная по умолчанию учетная запись на новых серверах. Если на хостах Ansible уже есть пользователь sudo, то рекомендуем использовать эту учетную запись.
Задать пользователя удаленной системы можно с помощью аргумента -u. Если он не задан, Ansible попытается подключиться к главной ноде от имени текущего системного пользователя.
На локальной машине или главной ноде Ansible запустите:
ansible all -m ping -u root
Эта команда с помощью встроенного модуля ping будет тестировать подключения на всех нодах из файла инвентаризации по умолчанию (выполняется подключение от пользователя root). Модуль ping тестирует следующее:
- доступность хостов;
- наличие действующих учетных данных SSH;
- способность хостов запускать модули Ansible с помощью Python.
Вывод будет примерно следующим:
server1 | SUCCESS => { "changed": false, "ping": "pong" } server2 | SUCCESS => { "changed": false, "ping": "pong" } server3 | SUCCESS => { "changed": false, "ping": "pong" }
Если это первое подключение к этим серверам через SSH, вам нужно будет подтвердить подлинность хостов, к которым вы подключаетесь через Ansible. При появлении запроса введите yes, а затем для подтверждения нажмите ENTER.
Когда получите ответ “pong” от хоста, значит сервер готов для запуска команд Ansible и плейбуков.
Примечание: Если вам не удается получить успешный ответ от серверов, ознакомьтесь с мануалом Как работать с Ansible: простая и удобная шпаргалка. Там вы найдете подробную информацию о запуске команд Ansible с разными параметрами подключения.
4: Запуск специальных команд (опционально)
Когда главная нода Ansible может взаимодействовать с хостами, на серверах можно запускать специальные команды и плейбуки.
Любая команда, запущенная на удаленном сервере через SSH, может быть запущена с помощью Ansible на серверах, которые указаны в файле инвентаризации. Например, проверить использование диска на всех серверах можно с помощью следующей команды:
ansible all -a "df -h" -u root
server1 | CHANGED | rc=0 >> Filesystem Size Used Avail Use% Mounted on udev 3.9G 0 3.9G 0% /dev tmpfs 798M 624K 798M 1% /run /dev/vda1 155G 2.3G 153G 2% / tmpfs 3.9G 0 3.9G 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup /dev/vda15 105M 3.6M 101M 4% /boot/efi tmpfs 798M 0 798M 0% /run/user/0 server2 | CHANGED | rc=0 >> Filesystem Size Used Avail Use% Mounted on udev 2.0G 0 2.0G 0% /dev tmpfs 395M 608K 394M 1% /run /dev/vda1 78G 2.2G 76G 3% / tmpfs 2.0G 0 2.0G 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup /dev/vda15 105M 3.6M 101M 4% /boot/efi tmpfs 395M 0 395M 0% /run/user/0 ...
С помощью ситуативных команд также можно запускать модули Ansible, как мы это делали с модулем ping при тестировании соединения. Например, с помощью модуля apt можно установить последнюю версию vim на все серверы в файле инвентаризации:
ansible all -m apt -a "name=vim state=latest" -u root
Использовать команды Ansible можно как для отдельных хостов, так и для групп и подгрупп хостов. Например, проверить uptime каждого хоста в группе servers можно следующим образом:
ansible servers -a "uptime" -u root
Можно указать несколько хостов, разделив их двоеточиями:
ansible server1:server2 -m ping -u root
Дополнительную информацию по работе с Ansible (в том числе о применении плейбуков для автоматизации настройки сервера) можно получить в гайде по Ansible.
Подводим итоги
В этом мануале мы установили Ansible и настроили файл инвентаризации для выполнения команд с главной ноды Ansible.
После подтверждения возможности подключения и управления инфраструктурой с главной ноды Ansible вы можете запускать на этих хостах любые команды или плейбуки.