Предыдущий урок: 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: Что дальше?