Что такое циклы в Ansible playbook?

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

Ответ

Циклы (Loops) в Ansible позволяют повторять выполнение задачи для каждого элемента в списке или словаре, что устраняет дублирование кода. Основной и рекомендуемый способ — использование директивы loop.

Основные типы циклов:

  1. loop (современный):
    - name: Ensure multiple users exist
      ansible.builtin.user:
        name: "{{ item }}"
        state: present
        groups: "developers"
      loop:
        - alice
        - bob
        - charlie
  2. Цикл по списку словарей (часто для пакетов):
    - name: Install a list of packages
      ansible.builtin.apt:
        name: "{{ item.name }}"
        state: "{{ item.state | default('present') }}"
      loop:
        - { name: 'nginx', state: 'latest' }
        - { name: 'postgresql', state: 'present' }
        - { name: 'old_package', state: 'absent' }
  3. Цикл с регистрацией результата каждой итерации:

    - name: Create directories for app logs
      ansible.builtin.file:
        path: "/var/log/{{ item }}"
        state: directory
      loop: "{{ ['app1', 'app2', 'app3'] }}"
      register: dir_creation_results
    
    - name: Debug results
      ansible.builtin.debug:
        var: dir_creation_results.results

Управление циклом (loop_control):

- name: Configure services with readable output
  ansible.builtin.service:
    name: "{{ item }}"
    enabled: true
  loop:
    - docker
    - ssh
  loop_control:
    label: "Enabling service: {{ item }}"  # Скрывает содержимое item в выводе
    pause: 2  # Пауза в 2 секунды между итерациями (например, для graceful restarts)

Циклы — фундаментальный инструмент для создания гибких и поддерживаемых плейбуков, особенно при работе с динамическими списками из переменных или результатов предыдущих задач.