Какие элементы вы использовали в Ansible-плейбуках?

«Какие элементы вы использовали в Ansible-плейбуках?» — вопрос из категории Ansible, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В своих Ansible-плейбуках я регулярно использую следующие ключевые элементы:

  • Inventory: YAML-файл или директория с определением целевых хостов и их группировкой (например, [webservers], [dbservers]).
  • Play: Основной блок, определяющий, на каких хостах из inventory и с какими параметрами будут выполняться задачи.
  • Tasks: Конкретные действия, выполняемые с помощью модулей Ansible (например, apt, yum, copy, template, systemd).
  • Handlers: Специальные задачи, которые выполняются только по уведомлению (notify), обычно для перезапуска сервисов после изменения конфигурации.
  • Variables: Данные для параметризации плейбуков. Я определяю их в самом плейбуке (vars:), в отдельных файлах (vars_files:), в group_vars/, host_vars/ или через командную строку (-e).
  • Templates: Файлы Jinja2 (.j2), которые рендерятся с подстановкой переменных и копируются на целевые хосты.
  • Roles: Переиспользуемые компоненты, которые инкапсулируют задачи, обработчики, переменные, шаблоны и файлы для решения конкретной цели (например, роль nginx или postgresql).
  • Tags: Метки, которые позволяют выборочно запускать части плейбука командой --tags или --skip-tags.
  • Conditionals: Условия when:, которые управляют выполнением задачи в зависимости от фактов о хосте или значений переменных.

Пример плейбука для настройки веб-сервера:

---
- name: Configure Nginx on web servers
  hosts: webservers
  become: yes
  vars:
    http_port: 8080
    server_name: example.com

  tasks:
    - name: Ensure Nginx is installed
      apt:
        name: nginx
        state: latest
        update_cache: yes

    - name: Deploy Nginx configuration from template
      template:
        src: nginx.conf.j2
        dest: /etc/nginx/sites-available/default
      notify: Restart Nginx

  handlers:
    - name: Restart Nginx
      systemd:
        name: nginx
        state: restarted
        enabled: yes