Определите переменную 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"
Другие вопросы по тегам