Ansible — система автоматизации настройки и развертывания ПО
Ansible — система управления конфигурациями, написанная на языке программирования Python, с использованием декларативного языка разметки для описания конфигураций. Применяется для автоматизации настройки и развёртывания программного обеспечения. Обычно используется для управления Linux-узлами, но Windows также поддерживается. Поддерживает работу с сетевыми устройствами, на которых установлен Python версии 2.4 и выше по SSH- или WinRM соединению.
Пользователь Ansible создаёт определённые сценарии («плейбуки», англ. playbooks) в формате YAML с описанием требуемых состояний управляемой системы. Сценарий — это описание состояния ресурсов системы, в котором она должна находиться в конкретный момент времени, включая установленные пакеты, запущенные службы, созданные файлы и многое другое. Ansible проверяет, что каждый из ресурсов системы находится в ожидаемом состоянии и пытается исправить состояние ресурса, если оно не соответствует ожидаемому.
Тестовый стенд окружение с доступом в интернет
| hostname | OS | Kernel | ip a |
| astra17-1 | Astra Linux Special Edition 1.7 (Debian 10) | 6.1 | 152 |
| astra17-2 | Astra Linux Special Edition 1.7 (Debian 10) | 6.1 | 218 |
| astra18-3 | Astra Linux Special Edition 1.8 (Debian 12) | 6.12 | 202 |
| astra17-ansible | Astra Linux Special Edition 1.7 (Debian 10) | 6.12 | 92 |
| RedOS8 | RedOS 8 (rpm) | 6.12 | 59 |
Подключение управляемых узлов пк Обзор и настройка SSH
В большинстве дистрибутивов OpenSSH-сервер уже предустановлен. Если OpenSSH отсутствует в системе, его можно установить вручную deb/rpm:
sudo apt update
sudo apt install -y openssh-server
sudo dnf install -y openssh-server
После установки службу требуется запустить и включить автозапуск.
sudo systemctl enable ssh --now
sudo systemctl enable sshd --now
sudo systemctl status ssh
sudo systemctl status sshd
Проверим подключение к серверам по ssh ,при запросе написать yes
andrey@ansible:~$ ssh 192.168.122.59
The authenticity of host ‘192.168.122.59 (192.168.122.59)’ can’t be established.
ECDSA key fingerprint is SHA256:I5odTkEZcGaMEWn38eh1LgEA5IyzwKYoZNpvkwLOn8k.
Are you sure you want to continue connecting (yes/no/[fingerprint])?
Необходимо сгенерировать и распространить ключ на все управляемые узлы. Для генерации ключа используется следующая команда с указанием пароля и пути по умолчанию:
ssh-keygen -t ed25519 -C "andrey default"
ls -la .ssh
cat .ssh/id_ed25519.pub
Далее нужно распространить публичный ключ id_ed25519.pub на все подключенные хосты. Распространить ключи на хосты можно командой, указав запрашиваемый пароль пользователя или ключа:
ssh-copy-id -i ~/.ssh/id_ed25519.pub 192.168.122.152
ssh-copy-id -i ~/.ssh/id_ed25519.pub 192.168.122.218
ssh-copy-id -i ~/.ssh/id_ed25519.pub 192.168.122.202
ssh-copy-id -i ~/.ssh/id_ed25519.pub 192.168.122.59
Проверка добавленного ssh ключа на удаленном узле в файле ~/.ssh/authorized_keys
ssh 192.168.122.59
Enter passphrase for key '/home/andrey/.ssh/id_ed25519':
Last login: Wed Jan 14 18:11:54 2026 from 192.168.122.92
[andrey@redos8 ~]$ls -la .ssh
cat .ssh/authorized_keys
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAII5uDo0UvaMR+QEtfyROUEAMPWvheXr/pagYtKM+PJPu andrey default
Для ansible необходимо сгенерировать и распространить ключ на все управляемые узлы. Для генерации ключа используется следующая команда без указания пароля, с указанием пути сохранения:
ssh-keygen -t ed25519 -C "ansible"
/home/andrey/.ssh/ansible
Далее нужно распространить публичный ключ ansible.pub на все подключенные хосты. Распространить ключи на хосты можно командой, указав запрашиваемый пароль ключа:
ssh-copy-id -i ~/.ssh/ansible.pub 192.168.122.152
ssh-copy-id -i ~/.ssh/ansible.pub 192.168.122.218
ssh-copy-id -i ~/.ssh/ansible.pub 192.168.122.202
ssh-copy-id -i ~/.ssh/ansible.pub 192.168.122.59
Подключение по SSH с использованием конкретного файла ключа ansible без пароля
ssh -i ~/.ssh/ansible 192.168.122.59
Кэшируем в памяти парольную фразу, для ssh в менеджере ключей ssh-agent
eval $(ssh-agent)
ps aux | grep ssh-agent
ssh-add
Создание псевдонима алиаса, для команды ssh-agent, на текущий сеанс или добавить строку в файл
alias ssha='eval $(ssh-agent) && ssh-add'
nano .bashrc
Установка ansible и Выполнение специальных команд
nano /etc/apt/sources.list
sudo apt update
sudo apt install ansible
ansible --version
ansible 2.10.17
Создаём файл инвентаризации, для ansible и добавим построчно ip адреса хостов
cd ~
mkdir ansible_tutorial
cd ansible_tutorial
nano inventory
ls
Проверка подключения управляемых узлов используя файл ключа ssh и списка ip из файла inventroy в ansible
ansible all --key-file ~/.ssh/ansible -i inventory -m ping
192.168.122.202 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": false,
"ping": "pong"
}
Создаем файл конфигурационный фал ansible.cfg по умолчанию имя файла inventroy и ключ ssh ansible
cd ~/ansible_tutorial
nano ansible.cfg
[defaults]
inventory = inventory
private_key_file = ~/.ssh/ansible
Просто опрос пинг. Ко всем хостам (all) применяется модуль ping (-m ping)
ansible -m ping all
192.168.122.152 | SUCCESS => {
«ansible_facts»: {
«discovered_interpreter_python»: «/usr/bin/python»
},
«changed»: false,
«ping»: «pong»
}
Показать список хостов из файла inventory
ansible all --list-hosts
hosts (3):
192.168.122.152
192.168.122.218
192.168.122.202
Модуль сбора фактов — параметров и переменных управляемого сервера
ansible all -m gather_facts
ansible -m shell -a 'cat /etc/astra_version' all
Вывод фактов (системная информация) с одного хоста
ansible all -m gather_facts --limit 192.168.122.218
192.168.122.218 | SUCCESS => {
"ansible_facts": {
"ansible_all_ipv4_addresses": [
"192.168.122.218"
],
Запуск команд с повышенными правами ansible
Запуск специальных команд с повышенными sudo привилегиями, apt обновить кэш списка доступных приложений на всех хостах
ansible all -m apt -a update_cache=true --become --ask-become-pass
192.168.122.202 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"cache_update_time": 1768411269,
"cache_updated": true,
"changed": true
}
Изменение в файле /etc/apt/sources.list убрать символ комментариев # и откл. deb cdrom
ansible all -m replace -a "path=/etc/apt/sources.list regexp='^#\s*(deb .*)' replace='\1'" --become --ask-become-pass && \
ansible all -m replace -a "path=/etc/apt/sources.list regexp='^(deb cdrom.*)' replace='# \1'" --become --ask-become-pass
192.168.122.152 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"msg": "5 replacements made"
}
Установка пакета htop, на все сервера используя ansible и apt с правами sudo
ansible all -m apt -a name=htop --become --ask-become-pass
192.168.122.202 | CHANGED => {
"ansible_facts": {
192.168.122.202 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"cache_update_time": 1768412228,
"cache_updated": false,
"changed": false
}
andrey@astra1:~$ apt search htop
Сортировка… Готово
Полнотекстовый поиск… Готово
aha/stable,stable 0.5-1+b3 amd64
ANSI color to HTML converter
htop/stable,stable,now 2.2.0-1+b3 amd64 [установлен]
interactive processes viewer
Установим повторно пакет tmux на все сервера используя ansible
ansible all -m apt -a name=tmux --become --ask-become-pass
192.168.122.202 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"cache_update_time": 1768412228,
"cache_updated": false,
"changed": false
}
Просмотр журнала истории установки пакетов apt на хосте
/var/log/apt
cat history.log
Обновление пакета на серверах хостах используя ansible отобразим список пакетов для хоста
sudo apt update
sudo apt dist-upgrade
sudo apt dist-upgrade | grep unrar
ansible all -m apt -a name=unrar --become --ask-become-pass
Смотрим, что пакет уже установлен — нет изменений
192.168.122.202 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"cache_update_time": 1768412228,
"cache_updated": false,
"changed": false
}
Обновим пакет urar до последний версии на всех серверах
ansible all -m apt -a "name=unrar state=latest" --become --ask-become-pass
192.168.122.152 | CHANGED => {
Установить обновления пакетов на сервер 192.168.122.152 дол актуальной версии, займет время
ansible 192.168.122.152 -m apt -a "upgrade=dist" --become --ask-become-pass
Пишем наш первый плейбук playbook ansible
Установка apache на все хосты с повышением прав, yaml чувствительный к пробелам
nano install_apache.yml
---
- hosts: all
become: true
tasks:
- name: install apache2 package
apt:
name: apache2
Запуск файла плейбук playbook install_apache.yml
ansible-playbook --ask-become-pass install_apache.yml
ok: [192.168.122.152]
TASK [install apache2 package] ***********************************************************************
changed: [192.168.122.152]
changed: [192.168.122.218]
changed: [192.168.122.202]
PLAY RECAP *******************************************************************************************
192.168.122.152 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.122.202 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.122.218 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
changed=1 что-то изменилось на хосте ; unreachable=0 сервер доступен, skipped=0 не пропущено,rescued=0 запускалась ли резервная задача, ignored=0 не игнорировалась задача
Добавим новую задачу — обновить репозитории пакетов на хостах
---
- hosts: all
become: true
tasks:
- name: update repository index
apt:
update_cache: yes
- name: install apache2 package
apt:
name: apache2
Проверка синтаксиса файла ansible yml и повторынй запуск сценария
ansible-playbook --syntax-check install_apache.yml
ansible-playbook --ask-become-pass install_apache.yml
TASK [update repository index] ***********************************************************************
ok: [192.168.122.202]
ok: [192.168.122.218]
ok: [192.168.122.152]
TASK [install apache2 package] ***********************************************************************
ok: [192.168.122.152]
ok: [192.168.122.218]
ok: [192.168.122.202]
Добавим установка дополнительного пакета php for apache последней версии в playbook yml
---
- hosts: all
become: true
tasks:
- name: update repository index
apt:
update_cache: yes
- name: install apache2 package
apt:
name: apache2
state: latest
- name: add php support for apache
apt:
name: libapache2-mod-php
state: latest
TASK [add php support for apache] ********************************************************************
changed: [192.168.122.218]
changed: [192.168.122.152]
changed: [192.168.122.202]
Удалене пакета используя ansible playbook yml
nano remove_apache.yml
---
- hosts: all
become: true
tasks:
- name: remove apache2 package
apt:
name: apache2
state: absent
- name: remove php support for apache
apt:
name: libapache2-mod-php
state: absent