Ansible-переменные
В нашей последней статье мы обсуждали, что такое Playbooks и как создавать и запускать задачи с помощью playbooks. В этой статье мы сделаем еще один шаг вперед и узнаем, как использовать переменные в сборниках сценариев Ansible.
Что такое переменные Ansible?
Переменные — это базовые понятия во всех языках программирования, которые используются для хранения данных и последующего использования в коде. Аналогично, в ansible есть переменные, в которых хранятся некоторые значения, и они позже используются в плейбуке для различной обработки.
Ansible поддерживает объявление переменных в нескольких местах, таких как книги воспроизведения, файлы host_vars и group_vars, а также аргументы командной строки.
В следующих разделах мы обсудим, как определять переменные в разных местах, и узнаем о приоритете переменных.
Переменная — ключ, сопоставление значений
Переменные можно определить на уровне игры и на уровне задачи с помощью ключевого слова «vars
». После ключевого слова vars указывается переменная с ключом и значением. К этим переменным могут получить доступ все задачи в игре.
Я создал одну задачу, которая использует модуль отладки для печати сообщения с использованием значений переменных. Переменные должны быть заключены в двойные фигурные скобки {{ переменная }}.
Как использовать модуль отладки в Ansible Playbooks
- name: Print vars
hosts: m1
gather_facts: false
vars:
os_name: "PoP!_OS Desktop"
version: "21.10"
tasks:
- name: Task1 - Substitute variables
debug:
msg: "My current desktop OS is {{ os_name }} - {{ version }}"
Key-value variable Mapping
Теперь, чтобы запустить книгу воспроизведения, выполните в терминале следующую команду.
ansible-playbook playbook_name.yml
На изображении ниже вы можете видеть, что обе мои переменные заменяются их значениями, когда msg выводится на стандартный вывод.
Вывод задачи
Переменная — список элементов
Вы можете создать список элементов в переменной. Если вы посмотрите на определение ниже, я создал переменную списка двумя способами.
- Стандартный способ определения списка элементов/элементов в формате YAML. Здесь я указал имена переменных как "top_linux_desktops".
- Синтаксис Python для создания списка элементов/элементов. Здесь я указал имена переменных как "top_desktops".
vars:
top_linux_desktops:
- MXlinux
- pop-os
- Linux Mint
- Manjaro
- Fedora
top_desktops: [MXLinux, pop-os, Linux Mint, Manjaro, Fedora]
Вы можете распечатать все элементы из списка, используя имя переменной. Я создал две задачи. Первая задача будет печатать элементы из переменной top_linux_desktops, а вторая задача будет печатать элементы из переменной top_desktops.
tasks:
- name: Task1 - List of elements
debug:
msg: "My fav linux desktops are {{ top_linux_desktops }}"
- name: Task2 - List of elements using Python syntax
debug:
msg: "My fav linux desktops are {{ top_desktops }}"
Список элементов
В списке вы также можете получить доступ к отдельному элементу, используя его позицию индекса, аналогично тому, как вы получаете доступ к элементам из списка Python. Есть два способа сделать это.
- Использование точечной записи (переменная.индекс)
- Нотация Python(переменная[индекс])
Я создал две задачи. Первая задача использует точечную нотацию, а вторая задача использует нотацию Python для печати элемента из первой и второй позиций.
tasks:
- name: Task3 - Accessing List element using dot notation
debug:
msg: "My fav linux desktops are {{ top_linux_desktops.1 }} and {{ top_desktops[2] }}"
- name: Task4 - Accessing List element using python notation(list[i])
debug:
msg: "My fav linux desktops are {{ top_linux_desktops[1] }} and {{ top_desktops[2] }}"
Печать элементов с использованием позиции индекса
Переменная — словарь
Вы можете создать объект словаря и присвоить его переменной. Это похоже на словари Python. Словари можно создавать двумя способами.
- стандартный синтаксис YAML для определения словаря
- Обозначение словаря Python
Если вы видите приведенный ниже фрагмент пьесы, я создал две словарные переменные. Первая переменная "release_info" соответствует синтаксису YAML, а вторая переменная "new_release_info" соответствует синтаксису словаря Python.
vars:
release_info:
name: PoP!_OS Desktop
version: 22.04
release_month: April, 2022
new_release_info: { name: PoP!_OS Desktop, version: 22.04, release_month: "April, 2022"}
Вы можете получить все значения из переменной или определенного элемента словаря, используя его ключ. Подобно списку, словарь также использует нотацию точки и Python для печати значения ключа.
Я создал две задачи: первая задача будет использовать точечную нотацию для извлечения элемента из словаря, а вторая задача будет использовать нотацию Python для захвата элемента.
tasks:
- name: Task1 - Accessing dictionary values using its key with dot notation(dict.key)
debug:
msg: "{{ release_info.name }} version {{ release_info.version }} is released on {{ release_info.release_month }}"
- name: Task2 - Accessing dictionary values using its key with python notation(dict['key'])
debug:
msg: "{{ new_release_info['name'] }} version {{ new_release_info['version'] }} is released on {{ new_release_info['release_month'] }}"
Словарная переменная — вывод
Приоритет уровня игры и задачи
Переменные могут быть определены как на уровне задачи, так и на уровне игры, но переменные, определенные на уровне задачи, имеют более высокий приоритет над переменными, определенными на уровне игры.
В приведенном ниже примере я создал переменные как на уровне игры, так и на уровне задачи с одинаковыми именами переменных. Теперь, когда я запускаю книгу воспроизведения, она будет использовать имена переменных задачи.
vars:
os_name: "PoP!_OS Desktop"
version: "21.10"
tasks:
- name: Task1 - Substitute variables
vars:
os_name: "Linux Mint"
version: "20.03"
debug:
msg: "My current desktop OS is {{ os_name }} - {{ version }}"
Задача против игры - приоритет
Playbook против приоритета аргументов командной строки
Вы можете переопределить переменную, переданную в книге воспроизведения, используя флаг -e
. Более высокий приоритет отдается переменным, переданным через флаг -e
.
Я снова запускаю ту же книгу из предыдущего раздела, переопределяя переменные с помощью флага -e
.
ansible-playbook 4_var_precedence.yml -e "os_name=fedora" -e "version=35"
Переменная с использованием аргумента командной строки
Вы можете передавать переменные в флаг -e
в формате Json
, YAML
или ini
.
INI FORMAT
ansible-playbook 4_var_precedence.yml -e "os_name=fedora" -e "version=35"
JSON FORMAT
ansible-playbook 4_var_precedence.yml -e '{"os_name": "fedora"}' -e '{"version": 35}'
YAML FORMAT
ansible-playbook 4_var_precedence.yml -e "{os_name: fedora}" -e "{version: 35}"
Вы также можете создать отдельный файл для переменной и передать его через флаг -e
. Синтаксис будет следующим. Здесь я создал файл с именем vars.yml
и сгруппировал все свои переменные. Теперь, когда файл передается с флагом -e
, все переменные импортируются в книгу воспроизведения.
ansible-playbook 4_var_precedence.yml -e @vars.yml
Переменный файл
Вместо определения переменной в книге воспроизведения вы можете создать файл и объявить все переменные в нем. Я создал файл с именем vars.yml
и сгруппировал в этом файле все переменные, которые мы обсуждали в предыдущих разделах.
Переменная, объявленная в файле
Вместо использования ключевого слова vars следует использовать vars_files в playbook и передать имя файла. Теперь, когда вы запускаете плейбук, ansible будет выбирать переменные из файла. Файл может находиться по любому пути.
Ключевое слово Var_files в Playbook
Переменные, определенные в файле
Хостовые и групповые переменные
Вы можете определить переменные уровня хоста и группы в файле инвентаризации. Вы можете обратиться к следующей статье, где мы кратко обсудили, как создавать переменные уровня хоста и группы.
Файлы инвентаризации и конфигурации Ansible
Рекомендуется не определять переменные внутри файла инвентаризации, вместо этого вы можете создать каталоги для host_vars
и group_vars
, и ansible автоматически выберет файлы в каталоге. Создайте каталог с именем host_vars
.
mkdir host_vars
Внутри каталога host_vars
вы можете определить переменные уровня хоста, т. е. вы можете создать файл формата INI, YAML или JSON и хранить переменные для конкретного хоста. Если вы посмотрите на мой файл инвентаризации ниже, у меня есть два хоста с именами «ubuntu» и «rocky», и я создал файл переменных для каждого хоста.
Внимание: файлы должны называться так же, как имя хоста/псевдоним в вашем файле инвентаризации.
Inventory file
[m1]
ubuntu ansible_host=ubuntu.anslab.com
[m2]
rocky ansible_host=rocky.anslab.com
mkdir host_vars/ubuntu.yml
echo "message: This variable is read from host_vars/ubuntu.yml file" > host_vars/ubuntu.yml"
mkdir host_vars/rocky.yml
echo "message: This variable is read from host_vars/rocky.yml file" > host_vars/rocky.yml
Я добавил переменную с именем "message
" в оба файла переменных. Теперь, если я запущу свою книгу воспроизведения, переменные будут выбраны из этих двух файлов.
Host_vars — определение переменной
Аналогичным образом вы также можете создавать файлы переменных для групп. Создайте каталог "group_vars
" и создайте файл с именем группы согласно файлу инвентаризации.
[m1]
ubuntu ansible_host=ubuntu.anslab.com
[m2]
rocky ansible_host=rocky.anslab.com
[servers:children]
m1
m2
Я создал дочернюю группу под названием "servers", поэтому я создаю имя файла как servers.yml
.
mkdir group_vars
mkdir group_vars/servers.yml
echo "message: This variable is read from group_vars/servers.yml file" > group_vars/servers.yml
Теперь, если я запущу плейбук, он прочитает servers.yml
из group_vars.
Групповые переменные
Внимание: если у вас есть и host_vars
, и group_vars
, ansible сначала выполнит поиск определений host_vars
, а если нет обнаружил, что он перейдет в group_vars
.
Магические переменные
Ansible предоставляет некоторые внутренние переменные, состояние которых определяется при запуске книги воспроизведения. Мы можем использовать эти переменные через playbook. Чтобы получить список доступных специальных переменных, вы можете перейти по следующей ссылке.
Специальные переменные Ansible
Например, существует переменная inventory_dir
, которая хранит абсолютный путь к файлу инвентаря, используемому книгой воспроизведения.
- name: Magic Variables - Get inventory directory path
debug:
msg: "{{ inventory_dir }}"
Магические переменные
Важная магическая переменная — hostvars
. Эта переменная будет печатать набор некоторых магических переменных в формате json.
- name: Magic Variables - hostvars
debug:
msg: "{{ hostvars }}"
Вывод HostVars
Вывод содержит информацию в формате str, list и словаря. Допустим, я хочу проверить, в какой группе находится мой хост Ubuntu, тогда я могу получить это следующим образом. Здесь я использую синтаксическую нотацию Python.
- name: Magic Variables
debug:
msg: "{{ hostvars['ubuntu']['group_names'] }}"
Имена групп
Не все магические переменные полезны в повседневной работе. Взгляните на все магические переменные и определите, какая из них соответствует вашему варианту использования.
Факты как переменная
Когда вы запускаете плейбук, ansible будет использовать модуль настройки, собирать факты с целевых хостов и сохранять выходные данные в памяти, чтобы их можно было использовать в плейбуке. Факты также называют переменными playbook.
Во-первых, узнайте о выводимых фактах, чтобы вы могли получить определенные атрибуты. Запустите следующую команду, которая соберет выходные данные и сохранит их в файле.
ansible all -m setup --tree /tmp/facts_result
Для каждого хоста будет создан отдельный выходной файл. Если вы посмотрите на вывод, это не что иное, как вывод в формате JSON.
Вывод фактов
Атрибуты в выводе фактов будут иметь формат List, Dictionary и AnsibleUnsafeText. Ниже приведены несколько примеров разных типов.
- name: Facts output - AnsibleUnsafeText
debug:
msg: "{{ discovered_interpreter_python }}"
- name: Facts output - List
debug:
msg: "{{ ansible_all_ipv4_addresses }}"
- name: Facts output - Dictionary
debug:
msg: "{{ ansible_python }}"
Вывод фактов
Существует масса информации, собранной на основе фактов, поэтому не торопитесь, чтобы просмотреть результаты и посмотреть, что соответствует вашим требованиям.
Заключение
В этой статье мы обсудили что такое переменная ansible и как объявлять переменные в разных местах. Приоритет переменных очень важен при объявлении переменных, и это описано в этой статье. Мы также обсудили магические переменные и варианты их использования. Наконец, мы рассмотрели, что такое факты и как использовать вывод фактов в качестве переменных.