Мы уже разобрались, что такое Ansible и зачем он нужен. Самое время изучить его практическое применение. Данная статья начинает серию уроков, в которых мы на примерах разберем основные концепции и принцип работы Ansible.
Вся сила Ansible в умении эффективно управлять системой состоящей из большого количества машин, а значит, для наших практических занятий нам потребуется некая имитация такой системы. Даже если у вас есть рабочая инфраструктура, лучше первые шаги осуществлять на тестовом окружении.
Вы можете корректировать тестовое окружение под свои потенциальные нужды, а можете полностью повторять примеры за мной.
Тестовое окружение для изучения Ansible
В Ansible есть два типа хостов: контрольная машина (Control Node) и управляемые машины (Managed Nodes). С помощью Virtual Box, я подготовил три виртуальные машины. Если вы никогда раньше не пользовались Virtual Box, у нас есть отдельные статьи о том, как установить программу и как создавать виртуальные машины.

Первая будет Control, а две другие Managed хосты. В качестве контрольной машины можно использовать свою рабочую станцию, но для полноты погружения сделаем под нее отдельный сервер.
Подготовка окружения
- Шаг 1: Настройка SSH доступа между серверами
- Шаг 2: Проверка/обновление Python на всех серверах
- Шаг 3: Установка Ansible на Control Node
На всех трех виртуалках установлена минимальная комплектация CentOS Stream 9. Тип сетевого подключения у них «Сетевой мост», это позволяет добавлять виртуальные машины к общей сети как отдельные устройства со своим IP адресом. В DHCP настройках роутера закрепил за каждой машиной статический IP, чтобы на протяжении всей практики каждая виртуалка имела постоянный адрес.
Я буду использовать следующие IP:
Control_Node: 192.168.0.150
Managed_Node_1: 192.168.0.151
Managed_Node_2: 192.168.0.152
Подключимся ко всем трем серверам по SSH, можете использовать командную строку или отдельное ПО, например PuTTY. Пора приступать к настройке окружения.

Шаг 1: Настройка SSH доступа между серверами
Ansible осуществляет доступ до управляемых хостов по средствам протокола SSH. Чтобы наш управляющий сервер имел свободный доступ до других серверов нам нужно создать SSH ключ для Control Node и добавить его публичную часть на Managed хосты.
В консоли контрольного сервера выполните следующие команды. Создание SSH ключа (ключевую фразу оставьте пустой):
[root@Control-Node ~]# ssh-keygen -t ed25519 -f /root/.ssh/ansible
Generating public/private ed25519 key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/ansible
Your public key has been saved in /root/.ssh/ansible.pub
The key fingerprint is:
SHA256:gZPd0j3Mv1G7tqQQp7Pb8BYITl+idFNQv3i6CrlW3lM root@Control-Node
The key's randomart image is:
+--[ED25519 256]--+
| .o. |
| + o + .. |
| + + o * ..|
| . * + +..o|
| S =.=oo+ |
| o.++.oE.|
| oo=..++ |
| .o.B+= .|
| .. ++=.. |
+----[SHA256]-----+
[root@Control-Node ~]#
Мы создали пару ключей, закрытый – /root/.ssh/ansibleи публичный – /root/.ssh/ansible.pub.
Проверим наш публичный ключ:
[root@Control-Node ~]# cat /root/.ssh/ansible.pub
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDMWLoS2pvZ+1XVD4rSF7rvCDb/4LM+b9LelAeF+9hfL root@Control-Node
[root@Control-Node ~]#
Теперь добавим публичный ключ на управляемые хосты. На первый:
[root@Control-Node ~]# ssh-copy-id -i /root/.ssh/ansible.pub root@192.168.0.151
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/ansible.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.0.151's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'root@192.168.0.151'"
and check to make sure that only the key(s) you wanted were added.
[root@Control-Node ~]#
На второй:
[root@Control-Node ~]# ssh-copy-id -i /root/.ssh/ansible.pub root@192.168.0.152
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/ansible.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.0.152's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'root@192.168.0.152'"
and check to make sure that only the key(s) you wanted were added.
[root@Control-Node ~]#
Зайдем в консоль управляемых серверов и проверим, что публичный ключ добавлен в авторизованные.
Первый сервер:
[root@Managed-Node-1 ~]# cat .ssh/authorized_keys
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDMWLoS2pvZ+1XVD4rSF7rvCDb/4LM+b9LelAeF+9hfL root@Control-Node
[root@Managed-Node-1 ~]#
Второй сервер:
[root@Managed-Node-2 ~]# cat .ssh/authorized_keys
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDMWLoS2pvZ+1XVD4rSF7rvCDb/4LM+b9LelAeF+9hfL root@Control-Node
[root@Managed-Node-2 ~]#
На обоих Managed Node присутствует ключ, вернемся на Control Node и попробуем подключиться с использованием ключа.
К Managed-Node-1:
[root@Control-Node ~]# ssh -i /root/.ssh/ansible root@192.168.0.151
Last login: Sun Dec 7 14:53:27 2025 from 192.168.0.150
[root@Managed-Node-1 ~]# exit
logout
Connection to 192.168.0.151 closed.
[root@Control-Node ~]#
К Managed-Node-2:
[root@Control-Node ~]# ssh -i /root/.ssh/ansible root@192.168.0.152
Last login: Sun Dec 7 14:53:40 2025 from 192.168.0.150
[root@Managed-Node-2 ~]# exit
logout
Connection to 192.168.0.152 closed.
[root@Control-Node ~]#
Мы настроили надежный и беспрепятственный доступ управляющего сервера до управляемых.
Шаг 2: Проверка/обновление Python на всех серверах
Ansible написан на языке Python. С его помощью он дает команды серверам. Нам нужно убедиться, что Python присутствует на всех нодах, как на контрольной, так и на управляемых.
Ansible работает с python3, скорее всего он установлен на сервере по умолчанию. Проверим, что Python установлен:
[root@Control-Node ~]# python3 --version
Python 3.9.18
[root@Control-Node ~]#
Если в ответ получили текущую версию Python, то он установлен, если же нет, установите его. Если вы никогда не устанавливали Python, у нас есть отдельные статьи, посвященные его установки для CentOS и Ubuntu.
Так как у нас на всех серверах одинаковая ОС, процесс обновления Python будет одинаковым. Привожу пример на контрольном хосте:
[root@Control-Node ~]# dnf update -y python3
Last metadata expiration check: 0:53:18 ago on Sun 07 Dec 2025 06:25:14 PM +10.
Dependencies resolved.
=====================================================================================================================================================================================================
Package Architecture Version Repository Size
=====================================================================================================================================================================================================
Upgrading:
python-unversioned-command noarch 3.9.25-2.el9 appstream 9.1 k
python3 x86_64 3.9.25-2.el9 baseos 26 k
python3-libs x86_64 3.9.25-2.el9 baseos 8.1 M
Transaction Summary
=====================================================================================================================================================================================================
Upgrade 3 Packages
Total download size: 8.1 M
Downloading Packages:
(1/3): python-unversioned-command-3.9.25-2.el9.noarch.rpm 51 kB/s | 9.1 kB 00:00
(2/3): python3-3.9.25-2.el9.x86_64.rpm 73 kB/s | 26 kB 00:00
(3/3): python3-libs-3.9.25-2.el9.x86_64.rpm 395 kB/s | 8.1 MB 00:20
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Total 348 kB/s | 8.1 MB 00:23
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Upgrading : python3-libs-3.9.25-2.el9.x86_64 1/6
Upgrading : python-unversioned-command-3.9.25-2.el9.noarch 2/6
Upgrading : python3-3.9.25-2.el9.x86_64 3/6
Cleanup : python3-3.9.18-3.el9.x86_64 4/6
Cleanup : python-unversioned-command-3.9.18-3.el9.noarch 5/6
Cleanup : python3-libs-3.9.18-3.el9.x86_64 6/6
Running scriptlet: python3-libs-3.9.18-3.el9.x86_64 6/6
Verifying : python3-3.9.25-2.el9.x86_64 1/6
Verifying : python3-3.9.18-3.el9.x86_64 2/6
Verifying : python3-libs-3.9.25-2.el9.x86_64 3/6
Verifying : python3-libs-3.9.18-3.el9.x86_64 4/6
Verifying : python-unversioned-command-3.9.25-2.el9.noarch 5/6
Verifying : python-unversioned-command-3.9.18-3.el9.noarch 6/6
Upgraded:
python-unversioned-command-3.9.25-2.el9.noarch python3-3.9.25-2.el9.x86_64 python3-libs-3.9.25-2.el9.x86_64
Complete!
[root@Control-Node ~]#
Проверим результат:
[root@Control-Node ~]# python3 --version
Python 3.9.25
[root@Control-Node ~]#
Обновите Python на остальных серверах.
Шаг 3: Установка Ansible на Control Node
У нас есть несколько статей, в которых подробно рассмотрен процесс установки Ansible на разные ОС (Ubuntu, CentOS). Здесь мы лишь быстро установим его без лишних рассуждений.
Устанавливаем репозиторий EPEL:
[root@Control-Node ~]# dnf install -y epel-release
Last metadata expiration check: 0:29:15 ago on Sun 07 Dec 2025 06:33:07 PM +10.
Dependencies resolved.
=====================================================================================================================================================================================================
Package Architecture Version Repository Size
=====================================================================================================================================================================================================
Installing:
epel-release noarch 9-7.el9 extras-common 19 k
Installing weak dependencies:
epel-next-release noarch 9-7.el9 extras-common 8.1 k
Transaction Summary
=====================================================================================================================================================================================================
Install 2 Packages
Total download size: 27 k
Installed size: 29 k
Downloading Packages:
(1/2): epel-next-release-9-7.el9.noarch.rpm 33 kB/s | 8.1 kB 00:00
(2/2): epel-release-9-7.el9.noarch.rpm 45 kB/s | 19 kB 00:00
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Total 211 B/s | 27 kB 02:09
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Installing : epel-release-9-7.el9.noarch 1/2
Running scriptlet: epel-release-9-7.el9.noarch 1/2
Many EPEL packages require the CodeReady Builder (CRB) repository.
It is recommended that you run /usr/bin/crb enable to enable the CRB repository.
Installing : epel-next-release-9-7.el9.noarch 2/2
Running scriptlet: epel-next-release-9-7.el9.noarch 2/2
Verifying : epel-next-release-9-7.el9.noarch 1/2
Verifying : epel-release-9-7.el9.noarch 2/2
Installed:
epel-next-release-9-7.el9.noarch epel-release-9-7.el9.noarch
Complete!
[root@Control-Node ~]#
Устанавливаем Ansible:
[root@Control-Node ~]# dnf install -y ansible
Last metadata expiration check: 0:31:44 ago on Sun 07 Dec 2025 06:33:07 PM +10.
Dependencies resolved.
=====================================================================================================================================================================================================
Package Architecture Version Repository Size
=====================================================================================================================================================================================================
Installing:
ansible noarch 1:7.7.0-1.el9 epel 34 M
Installing dependencies:
ansible-core x86_64 1:2.14.18-2.el9 appstream 2.6 M
git-core x86_64 2.47.3-1.el9 appstream 4.7 M
python3-cffi x86_64 1.14.5-5.el9 baseos 253 k
python3-cryptography x86_64 36.0.1-5.el9 baseos 1.2 M
python3-packaging noarch 20.9-5.el9 appstream 77 k
python3-ply noarch 3.11-14.el9 baseos 106 k
python3-pycparser noarch 2.20-6.el9 baseos 135 k
python3-pyparsing noarch 2.4.7-9.el9 baseos 150 k
python3-pyyaml x86_64 5.4.1-6.el9 baseos 205 k
python3-resolvelib noarch 0.5.4-5.el9 appstream 34 k
python3-setuptools noarch 53.0.0-15.el9 baseos 936 k
sshpass x86_64 1.09-4.el9 appstream 28 k
Transaction Summary
=====================================================================================================================================================================================================
Install 13 Packages
Total download size: 45 M
Installed size: 410 M
Downloading Packages:
(1/13): python3-ply-3.11-14.el9.noarch.rpm 158 kB/s | 106 kB 00:00
(2/13): python3-cffi-1.14.5-5.el9.x86_64.rpm 295 kB/s | 253 kB 00:00
(3/13): python3-pycparser-2.20-6.el9.noarch.rpm 244 kB/s | 135 kB 00:00
(4/13): python3-pyparsing-2.4.7-9.el9.noarch.rpm 166 kB/s | 150 kB 00:00
(5/13): python3-pyyaml-5.4.1-6.el9.x86_64.rpm 187 kB/s | 205 kB 00:01
(6/13): python3-cryptography-36.0.1-5.el9.x86_64.rpm 490 kB/s | 1.2 MB 00:02
(7/13): python3-setuptools-53.0.0-15.el9.noarch.rpm 1.0 MB/s | 936 kB 00:00
(8/13): python3-packaging-20.9-5.el9.noarch.rpm 148 kB/s | 77 kB 00:00
(9/13): python3-resolvelib-0.5.4-5.el9.noarch.rpm 268 kB/s | 34 kB 00:00
(10/13): sshpass-1.09-4.el9.x86_64.rpm 214 kB/s | 28 kB 00:00
(11/13): ansible-core-2.14.18-2.el9.x86_64.rpm 551 kB/s | 2.6 MB 00:04
(12/13): git-core-2.47.3-1.el9.x86_64.rpm 487 kB/s | 4.7 MB 00:09
(13/13): ansible-7.7.0-1.el9.noarch.rpm 672 kB/s | 34 MB 00:52
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Total 776 kB/s | 45 MB 00:58
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Installing : sshpass-1.09-4.el9.x86_64 1/13
Installing : python3-resolvelib-0.5.4-5.el9.noarch 2/13
Installing : git-core-2.47.3-1.el9.x86_64 3/13
Installing : python3-setuptools-53.0.0-15.el9.noarch 4/13
Installing : python3-pyyaml-5.4.1-6.el9.x86_64 5/13
Installing : python3-pyparsing-2.4.7-9.el9.noarch 6/13
Installing : python3-packaging-20.9-5.el9.noarch 7/13
Installing : python3-ply-3.11-14.el9.noarch 8/13
Installing : python3-pycparser-2.20-6.el9.noarch 9/13
Installing : python3-cffi-1.14.5-5.el9.x86_64 10/13
Installing : python3-cryptography-36.0.1-5.el9.x86_64 11/13
Installing : ansible-core-1:2.14.18-2.el9.x86_64 12/13
Installing : ansible-1:7.7.0-1.el9.noarch 13/13
Running scriptlet: ansible-1:7.7.0-1.el9.noarch 13/13
Verifying : python3-cffi-1.14.5-5.el9.x86_64 1/13
Verifying : python3-cryptography-36.0.1-5.el9.x86_64 2/13
Verifying : python3-ply-3.11-14.el9.noarch 3/13
Verifying : python3-pycparser-2.20-6.el9.noarch 4/13
Verifying : python3-pyparsing-2.4.7-9.el9.noarch 5/13
Verifying : python3-pyyaml-5.4.1-6.el9.x86_64 6/13
Verifying : python3-setuptools-53.0.0-15.el9.noarch 7/13
Verifying : ansible-core-1:2.14.18-2.el9.x86_64 8/13
Verifying : git-core-2.47.3-1.el9.x86_64 9/13
Verifying : python3-packaging-20.9-5.el9.noarch 10/13
Verifying : python3-resolvelib-0.5.4-5.el9.noarch 11/13
Verifying : sshpass-1.09-4.el9.x86_64 12/13
Verifying : ansible-1:7.7.0-1.el9.noarch 13/13
Installed:
ansible-1:7.7.0-1.el9.noarch ansible-core-1:2.14.18-2.el9.x86_64 git-core-2.47.3-1.el9.x86_64 python3-cffi-1.14.5-5.el9.x86_64 python3-cryptography-36.0.1-5.el9.x86_64
python3-packaging-20.9-5.el9.noarch python3-ply-3.11-14.el9.noarch python3-pycparser-2.20-6.el9.noarch python3-pyparsing-2.4.7-9.el9.noarch python3-pyyaml-5.4.1-6.el9.x86_64
python3-resolvelib-0.5.4-5.el9.noarch python3-setuptools-53.0.0-15.el9.noarch sshpass-1.09-4.el9.x86_64
Complete!
[root@Control-Node ~]#
Проверяем результат:
[root@Control-Node ~]# ansible --version
ansible [core 2.14.18]
config file = /etc/ansible/ansible.cfg
configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python3.9/site-packages/ansible
ansible collection location = /root/.ansible/collections:/usr/share/ansible/collections
executable location = /usr/bin/ansible
python version = 3.9.25 (main, Nov 10 2025, 00:00:00) [GCC 11.5.0 20240719 (Red Hat 11.5.0-14)] (/usr/bin/python3)
jinja version = 3.1.2
libyaml = True
[root@Control-Node ~]#
Итоги:
Мы подготовили окружение. На данном этапе у нас три виртуальные машины, на каждой установлен и обновлен Python. На контрольной машине установлен Ansible. Настроен SSH доступ по ключу контрольной ноды на управляемые серверам.
Следующий урок: Ansible практика – урок №1: Базовая настройка и первый запуск.