Предыдущий урок: 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.
Следующий урок: в процессе