Ansible практика – урок №16: loop – циклы в плейбуке.

Предыдущий урок: Ansible практика – урок №15: Использование vault для хранения секретов.

Мы уже довольно много взаимодействовали с переменными и отдельными значениями. Умеем с ними работать и знаем, как их использовать в тасках. Сегодня мы разберем, как работать с несколькими значениями, объединенными в список.

Зачем нужен цикл loop?

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

loop – циклы в плейбуке

Сегодня мы будем работать с ролью php. В ней мы устанавливаем целую пачку пакетов, это отличный пример, где и как использовать циклы.

Шаг 1: Создаем список

Недавно мы научились использовать defaults, сегодня нам пригодится это знание. Вынесем названия PHP пакетов в дефолты. Создадим поддиректорию:

[root@Control-Node ansible]# mkdir roles/php/defaults
[root@Control-Node ansible]#

Добавим файл roles/php/defaults/main.yml со следующим содержанием:

---
php_packages:
  - php
  - php-cli
  - php-fpm
  - php-common
  - php-mbstring
  - php-curl
  - php-mysqlnd
  - php-json
  - php-xml
  - php-phar
  - php-pdo
  - php-gd

Список готов.

Шаг 2: Редактируем роль

Внесем изменения в роль php. Вставим цикл loop по списку php_packages. Модифицированный файл roles/php/tasks/main.yml примет вид:

---
- name: "Role: PHP | Block: Installation"
  tags:
    - installation
    - php
  block:
    - name: "Install PHP on CentOS"
      ansible.builtin.dnf:
        name: "{{ item }}"
        state: latest
      loop: "{{ php_packages }}"
      when: ansible_distribution == "CentOS"

    - name: "Install PHP on Ubuntu"
      ansible.builtin.apt:
        name: "{{ item }}"
        state: latest
      loop: "{{ php_packages }}"
      when: ansible_distribution == "Ubuntu"

С изменениями закончили, осталось проверить плейбук.

Шаг 3: Проверяем изменения

Запустим Ansible ограничившись тегом php:

[root@Control-Node ansible]# ansible-playbook install_lemp.yml --tags php

PLAY [all] ******************************************************************************************************************************************************************************************

TASK [Gathering Facts] ******************************************************************************************************************************************************************************
ok: [Managed-Node-2]
ok: [Managed-Node-1]
ok: [Managed-Node-3]

TASK [php : Install PHP on CentOS] ******************************************************************************************************************************************************************
skipping: [Managed-Node-3] => (item=php)
skipping: [Managed-Node-3] => (item=php-cli)
skipping: [Managed-Node-3] => (item=php-fpm)
skipping: [Managed-Node-3] => (item=php-common)
skipping: [Managed-Node-3] => (item=php-mbstring)
skipping: [Managed-Node-3] => (item=php-curl)
skipping: [Managed-Node-3] => (item=php-mysqlnd)
skipping: [Managed-Node-3] => (item=php-json)
skipping: [Managed-Node-3] => (item=php-xml)
skipping: [Managed-Node-3] => (item=php-phar)
skipping: [Managed-Node-3] => (item=php-pdo)
skipping: [Managed-Node-3] => (item=php-gd)
skipping: [Managed-Node-3]
ok: [Managed-Node-2] => (item=php)
ok: [Managed-Node-1] => (item=php)
ok: [Managed-Node-1] => (item=php-cli)
ok: [Managed-Node-2] => (item=php-cli)
ok: [Managed-Node-2] => (item=php-fpm)
ok: [Managed-Node-1] => (item=php-fpm)
ok: [Managed-Node-1] => (item=php-common)
ok: [Managed-Node-2] => (item=php-common)
ok: [Managed-Node-2] => (item=php-mbstring)
ok: [Managed-Node-1] => (item=php-mbstring)
ok: [Managed-Node-2] => (item=php-curl)
ok: [Managed-Node-1] => (item=php-curl)
ok: [Managed-Node-2] => (item=php-mysqlnd)
ok: [Managed-Node-1] => (item=php-mysqlnd)
ok: [Managed-Node-2] => (item=php-json)
ok: [Managed-Node-1] => (item=php-json)
ok: [Managed-Node-2] => (item=php-xml)
ok: [Managed-Node-1] => (item=php-xml)
ok: [Managed-Node-2] => (item=php-phar)
ok: [Managed-Node-1] => (item=php-phar)
ok: [Managed-Node-2] => (item=php-pdo)
ok: [Managed-Node-1] => (item=php-pdo)
ok: [Managed-Node-2] => (item=php-gd)
ok: [Managed-Node-1] => (item=php-gd)

TASK [php : Install PHP on Ubuntu] ******************************************************************************************************************************************************************
skipping: [Managed-Node-1] => (item=php)
skipping: [Managed-Node-1] => (item=php-cli)
skipping: [Managed-Node-1] => (item=php-fpm)
skipping: [Managed-Node-1] => (item=php-common)
skipping: [Managed-Node-1] => (item=php-mbstring)
skipping: [Managed-Node-1] => (item=php-curl)
skipping: [Managed-Node-2] => (item=php)
skipping: [Managed-Node-2] => (item=php-cli)
skipping: [Managed-Node-1] => (item=php-mysqlnd)
skipping: [Managed-Node-2] => (item=php-fpm)
skipping: [Managed-Node-2] => (item=php-common)
skipping: [Managed-Node-1] => (item=php-json)
skipping: [Managed-Node-1] => (item=php-xml)
skipping: [Managed-Node-2] => (item=php-mbstring)
skipping: [Managed-Node-1] => (item=php-phar)
skipping: [Managed-Node-1] => (item=php-pdo)
skipping: [Managed-Node-1] => (item=php-gd)
skipping: [Managed-Node-2] => (item=php-curl)
skipping: [Managed-Node-1]
skipping: [Managed-Node-2] => (item=php-mysqlnd)
skipping: [Managed-Node-2] => (item=php-json)
skipping: [Managed-Node-2] => (item=php-xml)
skipping: [Managed-Node-2] => (item=php-phar)
skipping: [Managed-Node-2] => (item=php-pdo)
skipping: [Managed-Node-2] => (item=php-gd)
skipping: [Managed-Node-2]
ok: [Managed-Node-3] => (item=php)
ok: [Managed-Node-3] => (item=php-cli)
ok: [Managed-Node-3] => (item=php-fpm)
ok: [Managed-Node-3] => (item=php-common)
ok: [Managed-Node-3] => (item=php-mbstring)
ok: [Managed-Node-3] => (item=php-curl)
ok: [Managed-Node-3] => (item=php-mysqlnd)
ok: [Managed-Node-3] => (item=php-json)
ok: [Managed-Node-3] => (item=php-xml)
ok: [Managed-Node-3] => (item=php-phar)
ok: [Managed-Node-3] => (item=php-pdo)
ok: [Managed-Node-3] => (item=php-gd)

PLAY RECAP ******************************************************************************************************************************************************************************************
Managed-Node-1             : ok=2    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0
Managed-Node-2             : ok=2    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0
Managed-Node-3             : ok=2    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0

[root@Control-Node ansible]#

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

Итоги:

Мы вынесли список в отдельную переменную и запустили цикл loop по этому списку. Вынесение повторяющегося списка пакетов позволило сократить плейбук.

Следующий урок: Ansible практика – урок №17: Что дальше?