Ansible
Установка
Выполним как саму установку ansible, так и дополнительные коллекции.
Установка ansible на Linux
Установка для различных дистрибутивов Linux выполняется, немного, по-разному. Рассмотрим варианты.
Ubuntu / Debian / Astra
Выполняем команды:
apt update
apt install ansible
CentOS / Rocky
По умолчанию Ansible нет в репозитории CentOS — устанавливаем EPEL:
yum install epel-release
После устанавливаем сам сервер управления:
yum install ansible
* система автоматически обновит список пакетов с учетом нового репозитория и начнет установку Ansible. Если появится запрос на подтверждение, отвечаем Y.
РЕД ОС Устанавливаем ансибл командой:
dnf install ansible
Установка и обновление коллекций
Рекомендуется сразу установить или обновить стандартные коллекции для задач 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
server03:
ansible_connection: local
* в данном примере также создана группа серверов test_servers, в которую добавлены три сервера server01 и server02 с IP-адресами 192.168.1.100 и 192.168.1.101, а также server03, который является локальным сервером с типом подключения local. Адреса не обязательно писать, если имя машины разрешается с помощью 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, то вводим:
shell ansible -i /etc/ansible/inventory/test_servers.yml -m ping test_servers -u root -kK* мы должны указать путь до файла inventory с помощью опции -i.Если мы хотим выполнить сценарий, подключившись к локальному компьютеру, то выполняем:
shell ansible -m ping localhost --connection=localЕсли подключение не local, будет запрошен пароль от учетной записи (в нашем случае, 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для нужного пользователя. Например:shell mkdir /root/.sshshell vi /root/.ssh/authorized_keys* в данном примере мы сможем подключиться к компьютеру с нашим сертификатом под пользователм root.
Готово. Попробуем подключиться по SSH без пароля к любому из серверов:
ssh root@192.168.1.100
Мы должны подключиться к серверу без запроса пароля.
Теперь можно попробовать запустить наш ансибл без ввода паролей:
ansible -m ping test_servers -u root
Или с использованием инвентарного файла yml:
shell 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.