Краткое руководство по установке и первоначальной настройке системы управлением конфигурациями Ansible на ОС Debian GNU/Linux 11.6.
Для данного стенда будем использовать три машины:
одна — vm31101 — управляющая и две других — vm31102 и vm31103 — подчинённые. Так как Ansible работает при помощи SSH, то сам Ansible достаточно будет установить только на управляющей машине.
На всех машинах необходимо установить sudo. Про это читаем здесь.
Если в сети нет DNS-сервера, то в файле /etc/hosts необходимо прописать эти машины. На управляющей машине выглядеть он должен будет примерно так:
127.0.0.1 localhost 127.0.1.1 vm31101 172.16.31.101 vm31101 172.16.31.102 vm31102 172.16.31.103 vm31103
На второй и третьей, соответственно, будет меняться вторая строчка:
на vm31102
127.0.1.1 vm31102
на vm31103
127.0.1.1 vm31103
Теперь на первой (управляющей) машине проверяем подключение по SSH к остальным машинам
# ssh username@vm31102
и соответственно
# ssh username@vm31103
Переходим в режим root
# sudo -i
и устанавливаем sshpass и ansible
# apt install sshpass ansible -y
Проверяем
# ansible --version
Консоль должна показать примерно такой результат:
ansible 2.10.8 config file = None configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules'] ansible python module location = /usr/lib/python3/dist-packages/ansible executable location = /usr/bin/ansible python version = 3.9.2 (default, Feb 28 2021, 17:03:44) [GCC 10.2.1 20210110]
Также необходимо будет создать файл со списком хостов
# mkdir /etc/ansible/ # touch /etc/ansible/hosts
Затем переходим в домашнюю директорию
# cd ~
и создадим здесь файл настроек по умолчанию
# touch ansible.cfg
открываем его
# nano ansible.cfg
и пропишем такие настройки по умолчанию:
[defaults] inventory = /etc/ansible/hosts host_key_checking = false
Теперь, если снова запустить проверку версии Ansible
# ansible --version
то в ответе уже будет указан путь к файлу конфигурации:
ansible 2.10.8 config file = /root/ansible.cfg configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules'] ansible python module location = /usr/lib/python3/dist-packages/ansible executable location = /usr/bin/ansible python version = 3.9.2 (default, Feb 28 2021, 17:03:44) [GCC 10.2.1 20210110]
После этого откроем файл со списком хостов
# nano /etc/ansible/hosts
и пропишем туда данные для доступа для всех трёх машин:
vm31101 ansible_host=172.16.31.101 ansible_user=username ansible_ssh_private_key_file=/root/.ssh/id_rsa vm31102 ansible_host=172.16.31.102 ansible_user=username ansible_ssh_private_key_file=/root/.ssh/id_rsa vm31103 ansible_host=172.16.31.103 ansible_user=username ansible_ssh_private_key_file=/root/.ssh/id_rsa
ansible_host — это IP-адреса машин, на которые будут отправляться команды из управляющей машины.
Также не помешает скопировать файл конфигурации в директорию /etc/ansible/
# cp ~/ansible.cfg /etc/ansible/
Далее сгенерируем ключ управляющей машины
# ssh-keygen
и раскидаем его на все три машины
# ssh-copy-id username@vm31101 # ssh-copy-id username@vm31102 # ssh-copy-id username@vm31103
Теперь можно проверить работу Ansible при помощи модуля ping
# ansible all -m ping
то есть на все хосты запустить ping:
vm31103 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python3" }, "changed": false, "ping": "pong" } vm31102 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python3" }, "changed": false, "ping": "pong" } vm31101 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python3" }, "changed": false, "ping": "pong" }
Можно также запустить пинг для одного хоста
# ansible vm31102 -m ping
и ответ консоли будет соответствующий:
vm31102 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python3" }, "changed": false, "ping": "pong" }
Хосты также можно разделить на группы в файле hosts. Открываем его
# nano /etc/ansible/hosts
и прописываем группы машин в квадратных скобках:
[group1] vm31101 ansible_host=172.16.31.101 ansible_user=username ansible_ssh_private_key_file=/root/.ssh/id_rsa vm31102 ansible_host=172.16.31.102 ansible_user=username ansible_ssh_private_key_file=/root/.ssh/id_rsa [group2] vm31103 ansible_host=172.16.31.103 ansible_user=username ansible_ssh_private_key_file=/root/.ssh/id_rsa
Для проверки пропингуем созданную нами группу group1
# ansible group1 -m ping
и получим ответ от машин этой группы:
vm31101 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python3" }, "changed": false, "ping": "pong" } vm31102 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python3" }, "changed": false, "ping": "pong" }
Также ещё можно создать группу из групп. Для примера создадим такую группу с называнием all_groups (то есть допишем в файле хостов):
[all_groups:children] group1 group2
пропингуем её
# ansible all_groups -m ping
и получим соответствующий ответ:
vm31103 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python3" }, "changed": false, "ping": "pong" } vm31102 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python3" }, "changed": false, "ping": "pong" } vm31101 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python3" }, "changed": false, "ping": "pong" }
Здесь также помимо групп можно прописывать ещё машины.
Для того, чтобы запустить команду на подключённых к Ansible машинах, например uptime, необходимо выполнить команду
# ansible all -m shell -a "uptime"
или
# ansible all -m command -a "uptime"
в обоих случаях ответ консоли будет такой:
vm31102 | CHANGED | rc=0 >> 00:14:04 up 10:45, 2 users, load average: 0,00, 0,00, 0,00 vm31101 | CHANGED | rc=0 >> 00:14:04 up 50 min, 2 users, load average: 0,00, 0,01, 0,00 vm31103 | CHANGED | rc=0 >> 00:14:04 up 10:45, 2 users, load average: 0,01, 0,01, 0,00
Ansible можно также использовать для работы с файлами
К примеру, создадим файл example.txt в домашних директориях на всех машинах
# ansible all -m file -a "path=~/example.txt state=touch"
Этот файл будет создан с правами пользователя домашней директории.
Для того, чтобы создать файл в других директориях, необходимы права root. В этом нам поможет ключ -b
# ansible all -m file -a "path=/usr/local/example.txt state=touch" -b
Для копирования файлов также понадобятся права root
# ansible group1 -m copy -a "src=/usr/local/somefile.txt dest=/opt mode=777" -b
В работе с Ansible помимо модулей активно используются так называемые плейбуки. Файлы плейбуков в Ansible создаются в формате yaml и имеют расширение yml. Для создания и использования плейбуков необходимо воспользоваться соответствующей документацией.