Как и в любых языках программирования при написании Ansible playbook вы можете использовать переменные. Делается это для:
-
Простота замены какого-либо значения. Например, когда у вас встречается одно и то же значение во многих местах Ansible playbook правильней всего будет это значение вывести в отдельную переменную и заменить значение при необходимости достаточно будет всего в одном месте.
-
Использовать отдельные значения для каждой группы хостов. Например, вы можете ставить определённые утилиты для группы
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 чем делать это в файле инвентаризации
- Если у вас есть переменные для определенной роли, то помещайте их в папку с ролью
- Если у вас есть переменные, которые необходимо переопределить в роли описывайте эти переменные в вызове роли
- Не храните пароли в переменных (в открытом виде)
Комментарии