Хостинг SpaceWeb
Серверы Дизайн Сайты Безопасность Домены PHP Кейсы клиентов

Ansible для администраторов: автоматизация серверов

Управлять множеством серверов вручную становится всё сложнее: это отнимает много времени и повышает риск ошибок. Настройки на разных машинах нередко расходятся, а рутинные операции отнимают силы, которые можно было бы потратить на более важные задачи.

Поэтому администратору нужен инструмент, который ускорит работу и сделает её предсказуемой. Чтобы развёртывание сред занимало минуты, конфигурации оставались идентичными, а любые изменения можно было легко повторить.

Для этого и создан Ansible.

Что такое Ansible и где применяется

Ansible — это инструмент автоматизации ИТ-процессов, который позволяет управлять серверами, настраивать инфраструктуру и разворачивать приложения с помощью простых YAML-файлов. Проект был создан компанией Red Hat и сегодня входит в экосистему решений для управления инфраструктурой.

Ansible работает по принципу Infrastructure as Code: вместо того чтобы настраивать серверы вручную, администратор просто пишет сценарий (playbook). В нём инструмент указывает, что нужно сделать: какие программы установить, какие службы включить и какие настройки поменять. Потом достаточно запустить Ansible — и он сам выполнит все эти действия на нужных серверах.

Ansible применяется для:

Его используют системные администраторы, DevOps-инженеры и SRE-специалисты для ускорения внедрения изменений, снижения количества ошибок и обеспечения воспроизводимости конфигураций.

Возможности Ansible

Возможности Ansible охватывают почти весь цикл работ с инфраструктурой и приложениями. Включая:

За счёт этих возможностей Ansible подходит как для небольших проектов, так и для крупных инфраструктур с большим количеством серверов.

Базовые термины

Чтобы понимать, как работает Ansible, важно разобраться в основных понятиях:

Установка Ansible

Разберёмся, как установить Ansible на виртуальный сервер с Ubuntu 24.04.

Установка выполняется на управляющем сервере (control node), с которого в дальнейшем будет происходить подключение к другим хостам.

1. Обновите систему:

sudo apt update
sudo apt upgrade -y

2. Установите необходимые пакеты:

sudo apt install software-properties-common -y

3. Добавьте репозиторий с актуальными версиями:

sudo add-apt-repository --yes --update ppa:ansible/ansible

Система автоматически обновит список пакетов.

4. Установите Ansible:

sudo apt install ansible -y

5. Проверьте установку:

ansible --version

Также можно проверить работу Ansible на самом сервере (локально):

ansible localhost -m ping

Если всё настроено правильно, в ответ появится:

localhost | SUCCESS => {
    "ping": "pong"
}

Настройка Ansible

Далее важно правильно настроить проект — тогда все команды будут работать одинаково. Нужно задать серверы, вывод, логи и SSH.

Ansible ищет конфигурационный файл в следующем порядке:

  1. ./ansible.cfg — в текущей директории проекта
  2. ~/.ansible.cfg — в домашнем каталоге пользователя
  3. /etc/ansible/ansible.cfg — глобальный системный файл

Если файл лежит в каталоге проекта (например, /srv/ansible/ansible.cfg), у него приоритет. Так настройки хранятся рядом с playbook и не влияют на другие проекты.

Создать базовый файл можно вручную:

touch ansible.cfg

Пример конфигурации ansible.cfg:

[defaults]
inventory = ./hosts.yaml
host_key_checking = False
log_path = /var/log/ansible.log
vault_password_file = ./vault.key
force_color = 1
callback_result_format = yaml

[ssh_connection]
timeout = 10
retries = 2
server_alive_interval = 60
pipelining = True
ssh_args = -o StrictHostKeyChecking=no
scp_if_ssh = True
allow_world_readable_tmpfiles = True

Посмотрим на ключевые параметры:

Раздел [defaults]

Раздел [ssh_connection]

Часть настроек можно задавать через окружение, например:

export ANSIBLE_CONFIG=/srv/ansible/ansible.cfg
export ANSIBLE_FORCE_COLOR=1

Также inventory и другие опции можно переопределить на уровне команды (часто удобно в CI):

ansible-playbook playbooks/site.yaml -i hosts.yaml

В этом случае используется конкретный inventory-файл, независимо от того, что указано в ansible.cfg.

В файле ansible.cfg фиксируйте основные настройки: список управляемых серверов, формат вывода, логирование и параметры SSH. Если нужно что‑то изменить ненадолго — используйте переменные окружения или аргументы при запуске.

Инструкция по работе

Давайте разберёмся, как работать с Ansible:

Шаг 1. Подготовьте каталог проекта

Создайте отдельную папку, где будут лежать конфигурация, inventory и playbook:

mkdir -p /srv/ansible
cd /srv/ansible

Как правило, минимальный набор файлов: ansible.cfg, hosts.yaml, playbooks/.

mkdir -p playbooks
touch ansible.cfg hosts.yaml

Шаг 2. Настройте ansible.cfg

Если вы уже сделали файл конфигурации ранее — пропустите шаг. Главное, чтобы Ansible видел inventory по умолчанию.

Шаг 3. Заполните inventory

Если вы используете формат YAML, пример hosts.yaml может выглядеть так:

all:
  children:
    web:
      hosts:
        web1:
          ansible_host: 203.0.113.10
    db:
      hosts:
        db1:
          ansible_host: 203.0.113.20
  vars:
    ansible_user: root

Где:

Если вы подключаетесь не под root, укажите другого пользователя, например:

ansible_user: ubuntu

При необходимости можно добавить путь к SSH-ключу:

ansible_ssh_private_key_file: /root/.ssh/id_rsa

После сохранения файла проверьте, что Ansible корректно его читает:

ansible-inventory --list

Если структура YAML верная, вы увидите список групп и хостов.

Шаг 4. Проверьте доступ к серверам

Далее нужно убедиться, что Ansible может подключиться к серверам по SSH и выполнять команды.

Самый простой способ — использовать встроенный модуль ping. Это не обычный сетевой ping, а проверка того, что Ansible может подключиться к хосту и запустить Python:

ansible all -m ping

Если всё настроено правильно, в ответ вы увидите:

web1 | SUCCESS => {
    "ping": "pong"
}

Шаг 5. Создайте первый playbook

Создайте файл playbooks/nginx.yaml:

mkdir -p playbooks
nano playbooks/nginx.yaml

Добавьте содержимое:

- name: Install and start nginx
  hosts: web
  become: true
  tasks:
    - name: Update apt cache
      ansible.builtin.apt:
        update_cache: true

    - name: Install nginx
      ansible.builtin.apt:
        name: nginx
        state: present

    - name: Enable and start nginx
      ansible.builtin.service:
        name: nginx
        state: started
        enabled: true

Где hosts: web означает, что сценарий выполнится только на серверах из группы web в вашем hosts.yaml. А become: true включает выполнение задач с повышенными правами (через sudo).

Проверьте синтаксис:

ansible-playbook playbooks/nginx.yaml --syntax-check

Запустите playbook:

ansible-playbook playbooks/nginx.yaml

Если inventory не задан в ansible.cfg, укажите его явно:

ansible-playbook playbooks/nginx.yaml -i hosts.yaml

Шаг 6. Запускайте безопаснее: check mode и diff

Чтобы выполнить playbook в режиме проверки без внесения изменений, используйте --check:

ansible-playbook playbooks/nginx.yaml --check

В этом режиме Ansible анализирует текущее состояние системы и показывает, какие задачи были бы выполнены. Реальных изменений на сервере не происходит. Это удобно перед обновлениями или при работе в продакшене.

Чтобы дополнительно увидеть различия в конфигурационных файлах, используйте --diff:

ansible-playbook playbooks/nginx.yaml --diff

Если playbook изменяет шаблоны или конфигурационные файлы, Ansible покажет разницу между текущей и новой версией.

Можно объединить оба режима:

ansible-playbook playbooks/nginx.yaml --check --diff

Шаг 7. Используйте Vault для секретов

Ansible Vault нужен, чтобы хранить секреты (пароли, токены, ключи) в зашифрованном виде. Это удобнее и безопаснее, чем держать такие данные в открытых переменных в playbook или inventory.

Создайте зашифрованный файл с переменными:

ansible-vault create group_vars/all/vault.yaml

Добавьте туда, например:

db_password: "S3cret!"

Запуск playbook с вводом пароля:

ansible-playbook playbooks/nginx.yaml --ask-vault-pass

Если в ansible.cfg задан vault_password_file, пароль можно не вводить вручную.

Полезные команды Ansible

Команда Что делает
ansible --version Показывает установленную версию Ansible, путь к ansible.cfg и информацию о Python.
ansible-inventory --list Отображает структуру inventory и все доступные хосты и группы.
ansible all -m ping Проверяет подключение ко всем хостам из inventory.
ansible web --list-hosts Показывает, какие серверы входят в группу web.
ansible all -a "uptime" Выполняет команду uptime на всех серверах (ad-hoc режим).
ansible-playbook playbook.yaml Запускает playbook.
ansible-playbook playbook.yaml -i hosts.yaml Запускает playbook с указанием конкретного inventory.
ansible-playbook playbook.yaml --syntax-check Проверяет playbook на ошибки синтаксиса без выполнения.
ansible-playbook playbook.yaml --check Запускает playbook в режиме проверки (без внесения изменений).
ansible-playbook playbook.yaml --diff Показывает изменения в файлах, если playbook их вносит.
ansible-vault create file.yaml Создаёт зашифрованный файл с помощью Vault.
ansible-vault edit file.yaml Редактирует зашифрованный файл.
ansible-vault view file.yaml Просматривает содержимое зашифрованного файла.

Заключение

Подведём итог: Ansible существенно упрощает жизнь системного администратора. Вместо того чтобы вручную подключаться к каждому серверу, вы описываете нужные действия в playbook — и система автоматически применяет их на всех целевых машинах. Это экономит массу времени, снижает риск ошибок и делает процессы предсказуемыми. Освоив базовые принципы, вы сможете управлять целой инфраструктурой так же легко, как одним сервером.

Перейти на оригинал