Неизвестная переменная, определенная в 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 }}