Инструкция по установке и запуску Ansible на Linux
Используемые термины: Ansible, CentOS, Ubuntu.
Мы рассмотрим простую устаноку Ansible на Linux. Инструкция подойдет для Ubuntu, а также Rocky/CentOS.
Установка Ansible на Linux
Базовая настройка и запуск ad-hoc команды
Подключение без ввода пароля
Применение плейбуков
Диагностика проблем
Дополнительные материалы
Установка
Установка для Ubuntu и CentOS выполняется, немного, по-разному. Рассмотрим оба варианта.
Ubuntu
Выполняем команды:
apt update
apt install ansible
CentOS
По умолчанию Ansible нет в репозитории CentOS — устанавливаем EPEL:
yum install epel-release
После устанавливаем сам сервер управления:
yum install ansible
* система автоматически обновит список пакетов с учетом нового репозитория и начнет установку Ansible. Если появится запрос на подтверждение, отвечаем Y.
Установка и обновление коллекций
Рекомендуется сразу установить или обновить стандартные коллекции для задач Ansible:
ansible-galaxy collection install community.general
Начальная настройка и тестовый запуск Ansible
Разобьем наши действия на небольшие группы.
Настройка инвентарного файла
В данном файле хранится информация о хостах и/или группах хостов. Также в нем могет храниться переменные, определенные для конкретной группы хостов или конкретного компьютера.
Есть два варианта написания инвентарного файла — в формате yml или ini. Рассмотрим оба.
1. Файл формата ini.
Даннай формат используется по умолчанию. Откроем на редактирование файл с серверами, которыми хотим управлять:
vi /etc/ansible/hosts
и приведем его к следующему виду:
[test_servers]
192.168.1.100
192.168.1.101
* в данном примере создана группа серверов test_servers, в которую добавлены два сервера с IP-адресами 192.168.1.100 и 192.168.1.101.
2. Файл формата yml.
Создадим отдельный каталог:
mkdir /etc/ansible/inventory
И создадим файл:
vi /etc/ansible/inventory/test_servers.yml
test_servers:
vars:
ansible_python_interpreter: /usr/bin/python3
hosts:
server01:
ansible_ssh_host: 192.168.1.100
ansible_ssh_port: 22
server02:
ansible_ssh_host: 192.168.1.101
ansible_ssh_port: 22
* в данном примере также создана группа серверов test_servers, в которую добавлены два сервера server01 и server02 с IP-адресами 192.168.1.100 и 192.168.1.101. Адреса не обязательно писать, если имя машины разрешается с помощью DNS. Также не обязательно указывать порты, если они стандартные (22).
** обратите внимание, что мы также добавили переменную ansible_python_interpreter с указанием пути для запуска python.
Настройка ansible
Открываем конфигурационный файл ansible:
vi /etc/ansible/ansible.cfg
Для более новых версий ansible конфигурационный файл не создается. Создаем для него каталог и сам файл:
mkdir /etc/ansible
vi /etc/ansible/ansible.cfg
Снимаем комментарий с опции host_key_checking, приведя ее к виду:
host_key_checking = False
* данная настройка позволит нашему серверу управления автоматически принимать ssh fingerprint, избавляя нас от необходимости постоянно вводить yes, когда мы впервые конфигурируем новый сервер.
Также в секцию defaults добавим:
[defaults]
...
interpreter_python = auto_silent
* данная опция указывает, чтобы ansible автоматически искал python на целевом хосте без показа предупреждений.
Тестовый запуск
Теперь выполним проверку доступности добавленных серверов:
ansible -m ping test_servers -u root -kK
* данная команда проверит доступность по сети двух серверов из группы test_servers от учетной записи root.
Если мы создали и хотим использовать инвентарный файл yml, то вводим:
ansible -i /etc/ansible/inventory/test_servers.yml -m ping test_servers -u root -kK
* мы должны указать путь до файла inventory с помощью опции -i.
Будет запрошен пароль от учетной записи (в нашем случае, root). После будет запрошен пароль суперпользователя на серверах.
На экране должно появиться, примерно, следующее:
192.168.1.100 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": false,
"ping": "pong"
}
192.168.1.101 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
Наш сервер управления готов к работе.
Подключение без пароля
В нашем примере аутентификация на узлах выполняется с помощью пароля. Это не очень удобно и безопасно. Рассмотрим вариант использования ssh ключа.
На компьютере с ansible сгенерируем пару ключей следующей командой:
ssh-keygen -t ed25519
После нажатия Enter система попросит ввести параметры размещения ключа и пароль. Ничего не меняем, нажимая ввод и соглашаясь со значениями по умолчанию.
Мы увидим что-то на подобие:
Generating public/private ed25519 key pair.
Enter file in which to save the key (/root/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_ed25519
Your public key has been saved in /root/.ssh/id_ed25519.pub
The key fingerprint is:
SHA256:FTDGR6Gz92WI33/ywMSImcqfx2IRQjrD20tE/qzqZ5Y root@ansible.dmosk.ru
The key's randomart image is:
+--[ED25519 256]--+
| .+o+. |
| .+o.. |
| . =o.. |
| = ++.= + |
| *S+*.o = |
| ..oo+o * |
| .o+ oo + |
| E.o.o .o.|
| .o= .oo o+|
+----[SHA256]-----+
* обратите внимание, что мы сгенерировали ключи под пользователем root и из местоположение в каталоге /root/.ssh.
Теперь скопируем публичный ключ на все серверы, к которым будем подключаться:
ssh-copy-id -i /root/.ssh/id_ed25519.pub root@192.168.1.100
ssh-copy-id -i /root/.ssh/id_ed25519.pub root@192.168.1.101
* в нашем примере мы копируем наш ключ для пользователя root на удаленной системе.
Мы также можем скопировать ключ вручную. Для этого содержимое публичного файла (в нашем случае, id_ed25519.pub) добавить в файл authorized_keys для нужного пользователя. Например:
mkdir /root/.ssh
vi /root/.ssh/authorized_keys
* в данном примере мы сможем подключиться к компьютеру с нашим сертификатом под пользователм root.
Готово. Попробуем подключиться по SSH без пароля к любому из серверов:
ssh root@192.168.1.100
Мы должны подключиться к серверу без запроса пароля.
Теперь можно попробовать запустить наш ансибл без ввода паролей:
ansible -m ping test_servers -u root
Или с использованием инвентарного файла yml:
ansible -i /etc/ansible/inventory/test_servers.yml -m ping test_servers -u root
Команда должна выполниться без запросов пароля.
Использование плейбуков
Плейбук представляет из себя файл, в котором мы перечисляем список задач и/или ролей для выполнения ансиблом. Более того, в нем можно задать переменные и поведение работы ansible. Рассмотрим пример:
vi my_play.yml
- hosts: all
gather_facts: yes
user: root
vars:
app_ver: 14
roles:
- role: prepare
- role: install
- role: settings
- hosts: server1
gather_facts: no
user: root
tasks:
- name: install curl
package:
name: curl
state: present
В данном примере мы выполняем 2 блока задач:
- На всех хостах (hosts: all) нашего инвентарного файла запускаются 3 роли (prepare, install, settings). Ansible выполняет сбор фактов (gather_facts: yes), подключение к хостам будет выполняться от пользователя root, а также создается переменная app_ver: 14.
- На узле server1 запускается одна задача по установке пакета curl.
Теперь запустим плейбук командой:
ansible-playbook -i /etc/ansible/inventory/test_servers.yml ./my_play.yml
* мы используем созданный ранее инвентарный файл и запускаем плейбук my_play.yml.
Решение возможных проблем
В процессе запуска и работы с Ansible мы можем получить множество ошибок. Опишу некоторые из них.
Failed to connect to the host
Чаще всего, при запуске Ansible для нового хоста, мы можем получить ошибку соединения с хостом.
Причина: проблема, как правило, заключается в отсутствии прав на подключение к удаленному хосту по SSH.
Решение: введите с сервера ansible команду для подключения к удаленному хосту по SSH, например:
ssh root@192.168.1.100
* в данном случае, мы пытаемся подключиться к серверу 192.168.1.100 по SSH от пользователя root.
Если подключиться к серверу 192.168.1.100 вышеописанной командой не удалось, возможно введен неправильный пароль или доступ по SSH от root запрещен. В этом случае, создайте служебную учетную запись на сервере 192.168.1.100 и используйте ее для подключения по SSH. Например, на удаленном сервере вводим:
useradd ansible
passwd ansible
* в даном примере мы создали учетную запись ansible и задали ей пароль.
Теперь вводим нашу команду для проверки:
ansible -m ping test_servers -u ansible -kK
* обратите внимание, что мы выполняем теперь запрос от пользователя ansible.
Python Module not found
Ansible для своей работы использует модули, разработанные на языке Python. Чтобы он мог запускать вне необходимые команды, мы должны обеспечить наличие в системе соответсвующих модулей, а также удовлетворить требования по их версии.
Причина: в системе не установлен нужный для работы ансибл модуль питона или модуль есть, но его версия не подходит.
Решение: устанавливать и обновлять модули python мы можем с помощью утилиты pip.
Предположим, что мы получили ошибку:
Python Module not found: firewalld and its python module are required for this module, version 0.2.11 or newer required (0.3.9 or newer for offline operations)
В ошибке сказано, что нам нужен модуль firewall. Установим его:
python -m pip install firewall
При получении ошибки:
No module named pip
... устанавливаем в систему пакет python-pip.
No module named 'ansible.module_utils.six.moves
При подключении и выполнении какого либо задания (например, setup) на удаленном хосте мы получаем ошибку, в тексте которой есть строка:
ModuleNotFoundError: No module named 'ansible.module_utils.six.moves
Причина: несовместимость версии ansible и python. Например, если используется ansible версии 2.9, а на хосте python версии 3.12, мы получим данную ошибку.
Решение: удобнее всего обновить версию ansible. Посмотреть ее можно командой:
ansible --version
Обновление пакета стоит выполнить с использованием нативных репозиториев.
а) Для Deb (Debian / Ubuntu / Astra Linux):
apt update
apt install ansible
б) Для RPM (Rocky Linux / РЕД ОС):
dnf install ansible
После можно проверить работу сценария ansible, который выдавал ошибку.
Если обновление не помогло, значит встроенный репозиторий содержит устаревшую версию пакета. Данное поведение, как правило, характерно для систем на базе DEB. Для обновления, в таком случае, будем использовать репозиторий разработчика:
apt install software-properties-common
apt-add-repository ppa:ansible/ansible
И выполняем обновление:
apt install ansible
Читайте также
Другие инструкции про Ansible:
2. Примеры ролей Ansible для установки сервисов и настройки системы.
3. Как настроить Windows для управления с Ansible.
4. Использование роли и плейбука Ansible на примере установки и настройки NGINX.