Ansible практика – урок №9: Как использовать переменные в playbook.

Предыдущий урок: Ansible практика – урок №8: Использование notify и handler.

Ansible отлично работает с переменными. Мы видели это на примере переменной дистрибутива (ansible_distribution). Но мы можем использовать не только переменные собранные Ansible, но и свои.

Зачем переменные в playbook?

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

Как использовать переменные в playbook.

В урокe №7 мы копируем файл logs.cnf на управляемые хосты, но проблема в том, что на серверах CentOS и Ubuntu у файла разная локация. Из-за этого нам пришлось дублировать таску для разных версий дистрибутива. Используем переменные, чтобы упростить данную задачу.

Шаг 1: Вводим переменные

Если переменных будет немного, их можно прописать прямо в файле инвентори.

Приведем файл inventory к виду:

Managed-Node-1 ansible_host=192.168.0.151 mariadb_log_conf_file=/etc/my.cnf.d/logs.cnf
Managed-Node-2 ansible_host=192.168.0.152 mariadb_log_conf_file=/etc/my.cnf.d/logs.cnf
Managed-Node-3 ansible_host=192.168.0.153 mariadb_log_conf_file=/etc/mysql/mariadb.conf.d/logs.cnf

Для всех трех хостов мы задали переменную mariadb_log_conf_file, содержащую путь до файла. Первые две ноды – CentOS, у них один путь. Третья – Ubuntu, и путь другой.

Шаг 2: Используем переменные в плейбуке.

Отредактируем роль mariadb, уберем дублирование таски по копированию файла, уберем проверку дистрибутива и заменим путь в назначении(dest) на переменную. Файл roles/mariadb/tasks/main.yml примет вид:

---
- name: "Role: MariaDB | Block: Installation"
  tags:
    - installation
    - mariadb
  block:
    - name: "Install MariaDB on CentOS"
      ansible.builtin.dnf:
        name: mariadb-server
        state: latest
      when: ansible_distribution == "CentOS"

    - name: "Install MariaDB on Ubuntu"
      ansible.builtin.apt:
        name: mariadb-server
        state: latest
      when: ansible_distribution == "Ubuntu"

- name: "Ensure MariaDB is started and enabled"
  ansible.builtin.service:
    name: mariadb
    state: started
    enabled: true
  tags:
    - start
    - mariadb

- name: "Copy custom config file to Managed Node"
  ansible.builtin.copy:
    src: logs.cnf
    dest: "{{ mariadb_log_conf_file }}"
    owner: root
    group: root
    mode: '0644'
  notify: restart_mariadb
  tags:
    - mariadb

Осталось испытать обновленный плейбук.

Шаг 3: Проверяем на практике

Запустим Ansible максимально ограничив таски к исполнению тегами:

[root@Control-Node ansible]# ansible-playbook install_lemp.yml --tags mariadb --skip-tags installation,start

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

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

TASK [mariadb : Copy custom config file to Managed Node] ********************************************************************************************************************************************
ok: [Managed-Node-2]
ok: [Managed-Node-1]
ok: [Managed-Node-3]

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

[root@Control-Node ansible]#

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

Удалим копируемый файл с управляемых нод:

Для хостов CentOS:

[root@Managed-Node-1 ~]# rm -f /etc/my.cnf.d/logs.cnf
[root@Managed-Node-1 ~]#

Для Ubuntu:

root@Managed-Node-3:~# rm -f /etc/mysql/mariadb.conf.d/logs.cnf
root@Managed-Node-3:~#

Запустим плейбук еще раз:

[root@Control-Node ansible]# ansible-playbook install_lemp.yml --tags mariadb --skip-tags installation,start

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

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

TASK [mariadb : Copy custom config file to Managed Node] ********************************************************************************************************************************************
ok: [Managed-Node-2]
changed: [Managed-Node-1]
changed: [Managed-Node-3]

RUNNING HANDLER [mariadb : restart_mariadb] *********************************************************************************************************************************************************
changed: [Managed-Node-1]
changed: [Managed-Node-3]

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

[root@Control-Node ansible]#

Удаленные файлы снова скопированы.

Итог:

Сегодня мы научились задавать и использовать свои переменные в Ansible. Применение переменных открывает огромный потенциал  для нашего плейбука. В дальнейшем вы еще добавим переменные в playbook.

Следующий урок: в процессе