Ansible первые базовые шаги Уроки Linux ч.1

Автор: | 14 января, 2026

Ansible — система автоматизации настройки и развертывания ПО

Ansible — система управления конфигурациями, написанная на языке программирования Python, с использованием декларативного языка разметки для описания конфигураций. Применяется для автоматизации настройки и развёртывания программного обеспечения. Обычно используется для управления Linux-узлами, но Windows также поддерживается. Поддерживает работу с сетевыми устройствами, на которых установлен Python версии 2.4 и выше по SSH- или WinRM соединению.

Пользователь Ansible создаёт определённые сценарии («плейбуки», англ. playbooks) в формате YAML с описанием требуемых состояний управляемой системы. Сценарий — это описание состояния ресурсов системы, в котором она должна находиться в конкретный момент времени, включая установленные пакеты, запущенные службы, созданные файлы и многое другое. Ansible проверяет, что каждый из ресурсов системы находится в ожидаемом состоянии и пытается исправить состояние ресурса, если оно не соответствует ожидаемому.

Тестовый стенд окружение с доступом в интернет

hostnameOSKernelip a
astra17-1Astra Linux Special Edition 1.7 (Debian 10)6.1152
astra17-2Astra Linux Special Edition 1.7 (Debian 10)6.1218
astra18-3Astra Linux Special Edition 1.8 (Debian 12)6.12202
astra17-ansibleAstra Linux Special Edition 1.7 (Debian 10)6.1292
RedOS8RedOS 8 (rpm)6.1259

Подключение управляемых узлов пк Обзор и настройка 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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *