Неизвестная переменная, определенная в group_vars/all не найдена

Предположим, что Ansible структура:

.
├── group_vars
│   └── all
└── site.yml

Где all содержит my_test_variable: yes, а site.yml:

- hosts: all

  tasks:
    - name: Variable test
      debug: msg={{ my_test_variable }}

Я использую Vagrant для его локального запуска, поэтому команда выглядит так:

$ ansible-playbook site.yml -i/path-to-vagrant/.vagrant/provisioners/ansible/inventory/vagrant_ansible_inventory --private-key=/path-to-vagrant/.vagrant/machines/default/virtualbox/private_key -u vagrant

Vagrant сгенерированный инверторный файл:

# Generated by Vagrant

default ansible_ssh_host=127.0.0.1 ansible_ssh_port=2222

И выход:

PLAY: ***************************************************************************

TASK [setup] ********************************************************************
ok: [default]

TASK [Variable test] ************************************************************
fatal: [default]: FAILED! => {"msg": "ERROR! the field 'args' has an invalid value, which appears to include a variable that is undefined. The error was: 'my_test_variable' is undefined", "failed": true}

PLAY RECAP **********************************************************************
default                    : ok=1    changed=0    unreachable=0    failed=1 

Я знаю, что этот бродячий инвентарь не находится внутри какой-либо группы - потому что его нет, но все группы наследуют от всех, не так ли?

Почему это не работает? Что я упустил?


Я совершенно новый для Ansible. Прочитайте много документов, несколько примеров и даже некоторые SO-вопросы, такие как Ansible, не захватывают group_vars, не загружая его вручную - не совсем моя проблема - и не может получить возможность распознавать групповые переменные - закрыть, но не там,


редактировать

Я следую рекомендуемой структуре проекта из Ansible doc, а в записи doc переменных они упоминают global_vars/all:

Полные значения по умолчанию для сайта должны быть определены как параметр "group_vars/all".

Несмотря на отсутствие прямой ссылки на то, как загрузить эти значения по умолчанию, я предполагаю, что мне не нужно явно добавлять их (как это было предложено в ответе @thiago-borges). Или я?

Причиной этого является то, что я намереваюсь иметь групповые вары, наследующие от всех, например:

.
├── group_vars
│   └── all
│   └── production
│   └── staging
└── site.yml

И когда я выполняю загружаемую книгу для каждого из них, разные файлы загружаются без явного указания их в файле воспроизведения, например:

ansible-playbook -i production site.yml


Изменить 2

Проблема была ошибкой в вопросе. После обновления он работал как задокументированный.

Должен ли я удалить этот вопрос?

Ответы

Ответ 1

В структуре или коде не было ничего плохого. Причиной неработоспособности была ошибка в вопросе.

Однако я не смог найти отчет об ошибке, соответствующий этой проблеме, но я считаю, что эта проблема Ansible неправильно создает пути при запуске playbook в подкаталоге, и эта другая проблема, о которой я сообщил сам, может быть связана.

В настоящее время работает от версии a1948dd1c151f01ce93d0b76745469a7065ef45e, и он отлично работает:

PLAY ***************************************************************************

TASK [setup] *******************************************************************
ok: [default]

TASK [Variable test] ***********************************************************
ok: [default] => {
    "changed": false, 
    "msg": true
}

PLAY RECAP *********************************************************************
default                    : ok=2    changed=0    unreachable=0    failed=0 

Ответ 2

Из официального руководства Ansible:

Помимо хранения переменных непосредственно в INI файле, переменные хоста и группы могут храниться в отдельных файлах относительно файла инвентаризации.

Поскольку Vagrant создает свой файл инвентаризации в ./.vagrant/provisioners/ansible/inventory/ вам нужно поместить символическую ссылку на group_vars в этот каталог.

Предположим, у вас есть group_vars в том же каталоге, что и Vagrantfile и .vagrant:

cd ./.vagrant/provisioners/ansible/inventory; ln -sf ../../../../group_vars; cd -

Ответ 3

На вашем сайте.yml попробуйте настроить конфигурацию var_files.

- hosts: all
  vars_files:
    - group_vars/all
  tasks:
    - name: Variable test
      debug: msg={{ my_test_variable }}