Шаблон для расширения переменной роли ansible со значением по умолчанию - PullRequest
1 голос
/ 08 февраля 2020

Интересно, есть ли стандартный / рекомендуемый способ изменить переменную роли в Ansible.

Как автор роли, вы профилируете набор значений по умолчанию для своей роли, и пользователь может свободно переопределять Эти.

Проблема возникает, когда по умолчанию это списки или словари, которые также могут быть большими. Вы не хотите заставлять потребителя копировать / вставлять их, поэтому вы хотите объединить их, позволяя потребителю добавлять дополнительные значения, возможно даже переопределить некоторые ключи для словарей.

Ansible по умолчанию не объединяется , и это хорошо. Я надеюсь, что никто не настолько безумен, чтобы попытаться изменить значение hash_behavior в своей конфигурации.

В дикой природе я вижу, что люди добавляют вторую переменную, например myrole_filelist_extend, которая комбинируется во время выполнения с myrole_filelist, который содержит значения по умолчанию.

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

Мне кажется, что этот подход немного уродлив, поскольку он создает больше переменных, иногда дополнительные шаги set_fact для объединения двух и даже путаницы, когда некоторые люди Мисс, чтобы использовать правильный.

Есть ли более чистый способ сделать это?

1 Ответ

0 голосов
/ 08 февраля 2020

Я не уверен, что приведенное ниже полностью поразит вашу цель, так как все равно потребуется добавить несколько дополнительных переменных. Но это будет работать без лишних set_fact.

. Вы не привели пример списка, которым хотите управлять. Поскольку вы упомянули filelist в имени вашей переменной, я подозреваю, что это простой список строк. Хотя вы можете управлять более сложными списками объектов с одинаковым шаблоном, это может быть немного головной болью.

Тест playbook.yml

---
- hosts: localhost
  gather_facts: false

  roles:
    - role1

В role1/tasks/main.yml

---
- name: Show file list
  debug:
    var: role1_files

В role1/vars/main.yml. Интересной частью этого файла является то, что его сложнее переопределить, чем defaults/main.yml ниже. Так что это несколько защищает переменные, и пользователи не должны связываться с ними. Подробнее см. ansible приоритет переменной .

---
role1_files_default:
  - /home/user/file1.sh
  - /tmp/test.txt
  - /etc/toto.cfg

role1_files: "{{ (role1_files_default | difference(role1_files_blacklist)) + role1_files_add }}"

Наконец, в role1/defaults/main.yml. На самом деле это единственные переменные, которые вы будете выставлять пользователям, которые хотят настроить роль.

---
role1_files_blacklist: []
role1_files_add: []

Теперь вы можете легко заносить файлы в черный список и добавлять файлы в защищенные по умолчанию. Я использую extra_vars для удобства в следующих проверочных тестах, но эти объявления должны go в вашей книге / инвентаре

$ ansible-playbook playbook.yml 

PLAY [localhost] **************************************************************************************************************************************************************************************************

TASK [role1 : Show file list] *************************************************************************************************************************************************************************************
ok: [localhost] => {
    "role1_files": [
        "/home/user/file1.sh",
        "/tmp/test.txt",
        "/etc/toto.cfg"
    ]
}

PLAY RECAP ********************************************************************************************************************************************************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

$ ansible-playbook playbook.yml -e "{'role1_files_blacklist':['/etc/toto.cfg']}" -e "{'role1_files_add':['/some/other/file','/var/lib/supp']}"

PLAY [localhost] **************************************************************************************************************************************************************************************************

TASK [role1 : Show file list] *************************************************************************************************************************************************************************************
ok: [localhost] => {
    "role1_files": [
        "/home/user/file1.sh",
        "/tmp/test.txt",
        "/some/other/file",
        "/var/lib/supp"
    ]
}

PLAY RECAP ********************************************************************************************************************************************************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
...