Урок по треку DevOps: CI/CD, IaC, облака 6 мин

Ansible за 6 минут

Инвентарь, плейбуки, роли, идемпотентность, handlers, переменные и их приоритет, Vault.

Ansible настраивает серверы: ставит пакеты, раскладывает конфиги, перезапускает сервисы. Terraform обычно создаёт инфраструктуру (машины, сети, базы), Ansible настраивает то, что внутри машин. Ansible работает без агента: подключается по SSH и выполняет модули на Python, который должен быть на целевой машине.

Инвентарь

Список хостов и групп. Простейший вариант INI:

[web]
web1.example.ru
web2.example.ru ansible_port=2222

[db]
db1.example.ru

[prod:children]
web
db

[web:vars]
nginx_workers=4

Инвентарь бывает динамическим: плагин запрашивает список машин у облака по тегам.

Плейбук, задачи, модули

- name: Настроить веб-серверы
  hosts: web
  become: true
  vars:
    app_port: 8080
  tasks:
    - name: Установить nginx
      ansible.builtin.apt:
        name: nginx
        state: present
        update_cache: true

    - name: Положить конфиг
      ansible.builtin.template:
        src: nginx.conf.j2
        dest: /etc/nginx/nginx.conf
        validate: nginx -t -c %s
      notify: reload nginx

  handlers:
    - name: reload nginx
      ansible.builtin.service:
        name: nginx
        state: reloaded
  • Модуль делает одно действие: apt, copy, template, service, user, lineinfile.
  • Задача вызывает модуль с параметрами.
  • become повышает права (sudo).
  • Handler выполняется, только если его уведомила задача, которая что-то изменила, и только один раз в конце play (или раньше, по meta: flush_handlers).

Идемпотентность

Главное свойство: повторный запуск ничего не меняет, если система уже в нужном состоянии. Модули вроде apt с state: present проверяют состояние сами. А command и shell выполняются всегда и всегда сообщают changed. Для них задают creates, removes или changed_when, а лучше ищут подходящий модуль.

Проверка: запустить плейбук дважды; во второй раз должно быть changed=0.

Роли

Роль это переиспользуемый пакет: tasks/, handlers/, templates/, files/, defaults/ (переменные по умолчанию, легко переопределить), vars/ (переменные роли с высоким приоритетом), meta/ (зависимости). Готовые роли и коллекции ставят через ansible-galaxy.

Переменные и приоритет

Переменные задаются в десятке мест. Запомнить крайние: defaults роли имеют самый низкий приоритет, -e (extra vars) в командной строке самый высокий. Между ними инвентарь, group_vars, host_vars, переменные плея и vars/ роли. Хорошая практика: значения по умолчанию в defaults, окружения в group_vars.

Полезные режимы запуска

  • --check --diff: сухой прогон с показом изменений в файлах.
  • --limit web1.example.ru: только часть хостов.
  • --tags nginx: только задачи с тегом.
  • serial: 2 в плейбуке: обновлять по 2 хоста за раз (rolling), вместе с max_fail_percentage.
  • forks (по умолчанию 5): сколько хостов обрабатывать параллельно.

Секреты

ansible-vault шифрует файлы или отдельные значения: ansible-vault encrypt group_vars/prod/vault.yml. Пароль от vault передают через файл или скрипт, в CI из хранилища секретов. Чтобы секрет не попал в лог, задаче ставят no_log: true.

Тестирование

ansible-lint для стиля и типичных ошибок, Molecule для прогона роли на одноразовом контейнере или ВМ с проверкой идемпотентности.

Частые ошибки

  • shell: apt-get install -y nginx вместо модуля apt: не идемпотентно и без проверок.
  • Рестарт сервиса задачей в конце, а не через handler: сервис перезапускается при каждом прогоне.
  • Пароли открытым текстом в group_vars.
  • Перезапуск всех серверов разом без serial.
  • Шаблон конфига без validate: битый конфиг уронит nginx.

Что спросят на собесе

  • Чем Ansible отличается от Terraform и когда что использовать.
  • Что такое идемпотентность и как сделать идемпотентной задачу с shell.
  • Как работают handlers.
  • Как обновить 50 серверов, не уронив сервис.
  • Как хранить секреты в Ansible.

Закрепите за 5 минут

После урока в тренажёре 3-5 проверочных вопросов, дальше модуль уходит в повторения.