Определите переменную Ansible в роли с заданным по умолчанию ОС, которую можно легко переопределить
Я пишу роль Ansible, которую можно использовать в разных семействах ОС Linux и которая имеет разные значения по умолчанию для переменных в семействе ОС.
Сначала я подумал, что это будет легко настроить с помощью задачи include vars в роли, такой как:
- name: Gather OS family variables
include_vars: "{{ ansible_os_family|lower }}.yml"
с
my_role_variable: "Here is the default for Enterprise Linux"
в myrole/vars/redhat.yml
my_role_variable: "Here is the default for Debian Linux"
в myrole/vars/debian.yml
Однако в моем случае очень важно, чтобы книга воспроизведения, использующая роль, могла легко переопределять значения по умолчанию.
Итак, я пытаюсь найти способ установить другое значение по умолчанию для переменной для семейства ОС, как описано выше, но я хочу, чтобы переменные были переменными роли по умолчанию, а не ролями включения. Есть ли способ сделать это?
1 ответ
Как насчет того, чтобы иметь что-то вроде следующего в вашем файле defaults/main.yml
my_role_variable_default: "global default"
my_role_variable_redhat: "redhat specific default"
my_role_variable: "{{ lookup('vars', 'my_role_variable_'+ansible_os_family|lower, default=my_role_variable_default) }}"
Используйте троичный оператор:
- name: Gather OS family variables
include_vars: "{{ (override_os_family is defined) | ternary(override_os_family,ansible_os_family) | lower }}.yml"
Таким образом, если переменная override_os_family
определено, ваше выражение будет иметь свое значение, если нет, оно будет использовать значение ansible_os_family
,
Пример:
---
- hosts: localhost
connection: local
tasks:
- debug: msg="{{ (override_os_family is defined) | ternary(override_os_family,ansible_os_family) | lower }}.yml"
- hosts: localhost
connection: local
vars:
override_os_family: Lamarck
tasks:
- debug: msg="{{ (override_os_family is defined) | ternary(override_os_family,ansible_os_family) | lower }}.yml"
Результат (отрывок):
...
TASK [debug] *******************************************************************
ok: [localhost] => {
"msg": "darwin.yml"
}
...
TASK [debug] *******************************************************************
ok: [localhost] => {
"msg": "lamarck.yml"