Как и в любых языках программирования при написании Ansible playbook вы можете использовать переменные. Делается это для:

  1. Простота замены какого-либо значения. Например, когда у вас встречается одно и то же значение во многих местах Ansible playbook правильней всего будет это значение вывести в отдельную переменную и заменить значение при необходимости достаточно будет всего в одном месте.

  2. Использовать отдельные значения для каждой группы хостов. Например, вы можете ставить определённые утилиты для группы web хостов и уже совсем другие утилиты для группы db хостов.

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

Как задать переменную

Для того, чтобы задать значение переменной используя синтаксис YAML:

my_var: my_value

Правила наименования

Как и во многих языках программирования Ansible имеет правила, описывающие стили наименования переменных. Например, имя переменной должно содержать только буквы, цифры и знак _, также имя переменной должно начинаться либо с буквы, либо со знака _.

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

Использование переменной

Для использования переменной её достаточно вызвать в нужном вам месте помещая в "{{ }}". Использовать переменную можно в параметрах задач (tasks), в шаблонах (templates), названиях задач (name) и т.д.

- name: Debug {{ my_var }}
  debug:
	msg: "My variable value is {{ my_var }}"

Приоритет переменных

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

В этом списке будет указаны приоритет от самого высокого приоритета к меньшему.

категория описание
extra vars ansible-playbook -e “user=my_user”
role params переменные описанные в роли
set_facts / registered vars переменные описанные в playbook используя set_facts
include_vars добавляется указанием файла с переменными и списка переменных
task vars переменные только для задачи
block vars переменные только для блока
role vars описываются в папке роли roles/role/vars/main.yml
play vars_files добавляется указанием файла с переменными
play vars_prompt вбивается вручную на запрос
play vars указывается в playbook используя vars:
host facts ansible facts
playbook host_vars описываются в одноимённой директории с файлом именем хоста
inventory host_vars описывается в файле инвентаризации
playbook group_vars описываются в одноимённой директории с файлом именем группы хостов
inventory group_vars описывается в файле инвентаризации
playbook group_vars/all описываются в одноимённой директории с файлом all.yml
inventory group_vars/all описывается в файле инвентаризации
role defaults описываются в папке роли roles/role/defaults/main.yml

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

playbook host_vars

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

Благодаря этому можно менять значение одной и той же переменной для каждого хоста.

Например, представим, что у нас есть хост mylab-vm-2.dc2.my.local и зададим для него значение переменной my_var - my_value.

mkdir host_vars
vim host_vars/mylab-vm-2.dc2.my.local.yml
my_var: "my_value"

playbook group_vars

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

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

Например, представим, что у нас есть группа web и опишем для нее переменную.

mkdir group_vars 
vim group_vars/web.yml
my_var: "my_value1"

set_facts

Используется как отдельная задача (task) в Ansible Playbook перед задачей, в которой используется переменная.

- set_facts:
	my_var: "my_value3"

- debug:
	msg: "Value is {{ my_var }}"

registered vars

Вывод задачи можно записать в переменную используя register. Далее можно использовать эту переменную в своих целях.

- name: Create file
  file:
    path: /tmp/my.txt
    state: absent
  register: my_var

- debug:
    msg: "{{ my_var }}"

"msg": "{'path': '/tmp/my.txt', 'changed': True, 'diff': {'before': {'path': '/tmp/my.txt', 'state': 'file'}, 'after': {'path': '/tmp/my.txt', 'state': 'absent'}}, 'state': 'absent', 'failed': False}"

inventory host_vars

Описывает переменную для хоста в файле инвентаризации.

web:
  hosts:
    mylab-vm-2.dc2.my.local:
      my_var: "my_value"

inventory group_vars

Описывает переменную для группы хостов в файле инвентаризации.

web:
  vars:
    my_var: "my_value"
  hosts:
    mylab-vm-2.dc2.my.local:

role vars

Описывает переменные, которые будут видны только внутри этой роли. Файл создаётся в директории роли, в подпапке vars.

mkdir roles/role/vars
vim roles/role/vars/main.yml
my_var: "my_value"

task vars

Переменные описываются в определённой задаче (task) используя vars.

- debug:
    msg: "Value is {{ my_var }}"
  vars:
    my_var: "adssadas"

play vars_prompt

Перед выполнением задач (tasks) вам будет предоставлена возможность ввести вручную значение для переменной.

Описывается в основном Ansible Playbook.

- hosts: all
  vars_prompt:

    - name: my_var
      prompt: Write here
      private: no

  tasks:
	
	- debug:
		msg: "Value is {{ my_var }}"

extra vars

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

ansible-playbook play1.yml -i inventory\static.yml -e "my_var=my_value"

Специальные переменные (Special vars)

Во многих языках программирования есть уже специальные зарезервированные переменные и конечно Ansible в этом случае не исключение. В Ansible существует несколько типов специальных переменных: магические переменные, переменные соединения и факты (magic variables, connection variables, and facts). Логично что такие переменные зарезервированы и использовать такие имена переменных не рекомендуется.

Благодаря этим переменным Ansible даёт нам возможность получить информацию о наших хостах, группах, ролях и другого благодаря магическим переменным (magic variables). Список всех этих магических переменных можно получить по ссылке.

Под фактами подразумеваются переменные, благодаря которым вы можете получить максимум информации о хосте, на котором вы выполняете задачи с помощью Ansible. Для того чтобы получить список всех возможных переменных можно выполнить команду: ansible <hostname> -m ansible.builtin.setup

Также вам понадобятся еще и переменные соединения (connection variables). Они используются для того чтобы задать параметры подключения к вашим хостам. Наиболее востребованные используются для установки пользователя, повышения привилегий, ip-адреса и т.д.

Best Practices

Прочитав всё выше изложенное проведу несколько заметок:

  • Всегда при создании переменных задавайте имя, которое максимально описывает назначение переменной
  • Если у вас есть переменные со значениями по умолчанию помещайте их в group_vars/all
  • Предпочтительное описывать переменные в group_vars и host_vars чем делать это в файле инвентаризации
  • Если у вас есть переменные для определенной роли, то помещайте их в папку с ролью
  • Если у вас есть переменные, которые необходимо переопределить в роли описывайте эти переменные в вызове роли
  • Не храните пароли в переменных (в открытом виде)