Ansible 2.8 Роли - использование каталога vars / main - PullRequest
1 голос
/ 05 октября 2019

Я пытаюсь разделить переменные моей роли Ansible на несколько файлов - согласно этому ответу , должно быть возможно создать каталог vars/main, и все файлы .yml в этом каталоге должны бытьавтоматически загружается.

Однако в моем случае этого не происходит.

Моя структура каталогов:

vars
└── main
    ├── gce_settings.yml
    ├── vsphere_settings.yml
    └── vsphere_zone.yml

Однако, когда я пытаюсь использовать переменную, определенную внутри vsphere_settings. yml, Ansible жалуется, что переменная не определена: {"msg": "The task includes an option with an undefined variable. The error was: 'vsphere_user' is undefined

Если я перемещу объявление переменной в vars/main.yml, все работает как положено. Но, конечно, я бы предпочел разделить мои переменные на несколько файлов.

Мне не удалось найти какую-либо ссылку на эту «функцию» в официальной документации Ansible, и я не знаю, как я мог бы ее устранить. ,Кто-нибудь может указать мне правильное направление?

Моя версия: ansible 2.8.5 в Ubuntu 16.04

И прежде чем вы спросите: да, я действительно убедился, что main.yml не присутствовал, когдапытается загрузить vars/main/*.yml ...

Ответы [ 2 ]

2 голосов
/ 05 октября 2019

Пример ниже

$ cat play.yml 
- hosts: localhost
  roles:
    - role1

$ cat roles/role1/tasks/main.yml 
- debug:
    var: var1

$ cat roles/role1/vars/main/var1.yml 
var1: test_var1

дает

"var1": "test_var1"
2 голосов
/ 05 октября 2019

TL; DR версия: это ошибка в ansible, вызванная наличием пустых файлов .yml в vars/main. Уже есть PR для этого. Смотрите здесь .

Фактический результат (как упомянуто в комментариях) фактически зависит от порядка обработки файлов (по умолчанию мой Ansible обрабатывает их в алфавитном порядке - но это может зависеть от версии илибазовая ОС):

  • Если сначала обрабатывается пустой файл, вы получите сообщение об ошибке: ERROR! failed to combine variables, expected dicts but got a 'NoneType' and a 'AnsibleMapping'
  • Если после других файлов пустой файл обрабатывается, ошибки нетсообщение, но все переменные, которые были установлены до этого момента, уничтожены

Более подробно: так как я не знаю, как решить эту проблему в самом Ansible, я перешел к коду и начал добавлятьprint операторов, чтобы увидеть, что происходит.

В моем случае у меня было несколько пустых файлов .yml в каталоге vars/main (файлы, которые я планировал заполнить позже. Что ж ... похоженапример, когда код встречает такой пустой файл, он уничтожает весь словарь, который он построил до сих пор.

Либо я пропускаю что-то очень важное, либоs ошибка ... Шаги для воспроизведения:

  • создать роль
  • создать каталог vars/main и заполнить его некоторыми файлами .yml
  • добавить пустой файл .yml (названный так, чтобы он обрабатывался после других файлов)
  • попытаться напечатать переменные из первых файлов
    ansible# tree roles 
    roles
    +-- test
        +-- tasks
        ¦   +-- main.yml
        +-- vars
            +-- main
                +-- correct_vars.yml

    4 directories, 2 files

    ansible# cat roles/test/vars/main/correct_vars.yml  myname: bogd

    ansible# ansible-playbook -i inventory.yml test.yml 
    ... 
    ok: [localhost] => {
        "myname": "bogd" } 
    ...

    ansible# echo > roles/test/vars/main/emptyfile.yml

    ansible# ansible-playbook -i inventory.yml test.yml 
    ... ok: [localhost] => {
        "myname": "VARIABLE IS NOT DEFINED!" } 
    ...

Позднее редактировать: да,это ошибка ... См. здесь .

...