Это часть:
vars_files:
- vars/vars.default.yml
- vars/vars.yml
Если файл vars/vars.yml
не существует - здесь ошибка.
ERROR: file could not read: /.../vars/vars.yml
Как я могу загрузить дополнительные переменные из этого файла, только если он существует? (без ошибок)
По словам разработчиков Ansible , правильный способ решить эту проблему - использовать что-то вроде:
Кроме того, они говорят :
источник
include_vars
в задании будет дан высокий приоритет переменных по сравнению с рольюdefaults
илиvars
Я столкнулся с этой проблемой в установке, где мне нужно было создать несколько сред развертывания (live, demo, sandbox) на одном физическом сервере (здесь не разрешено использование виртуальных машин), а затем скрипт для развертывания произвольных репозиториев SVN.
Для этого требовалось дерево каталогов (необязательных) файлов variable.yml, которые сливались бы друг с другом и не создавали исключение, если таковое отсутствует
Начните с включения слияния переменных в ansible - обратите внимание, что это делает мелкое слияние хешей (1 уровень в глубину) и не полностью рекурсивное глубокое слияние
ansible.cfg
Разборчивый макет каталога
Роли / развернуть / задачи / includes.yml
Это основная логика для дерева каталогов необязательных переменных файлов.
group_vars / all.yml
Настройте переменные по умолчанию для проекта и различных пользователей и сред
Роли / развернуть / вары / main.yml
проект по умолчанию
Роли / развернуть / вары / project_1.yml
значения по умолчанию для project_1
Роли / развернуть / вары / живой / main.yml
значения по умолчанию для живой среды, переопределяет значения по умолчанию проекта
Роли / развернуть / вары / живой / project_1.yml
окончательные переопределения для project_1 в живой среде
playbooks / demo.yml
Настроить отдельные книги для каждой среды
ПРЕДУПРЕЖДЕНИЕ. Поскольку все среды находятся на одном хосте, все playbook-ы должны запускаться по отдельности, в противном случае Ansible будет безуспешно пытаться запустить все сценарии как первый пользователь ssh и будет использовать переменные только для первого пользователя. Если вам нужно запустить все сценарии последовательно, используйте xargs для запуска каждого из них в виде отдельных команд.
источник
Примечание. Тесты пути (это файл, существует, ...) работают только с абсолютными путями или путями относительно текущего рабочего каталога при выполнении команды ansible-playbook. Это причина, по которой мы использовали поиск. поиск принимает пути относительно каталога playbook и возвращает абсолютный путь, когда файл существует.
источник
Или в более ярком смысле:
То есть вместо записи массива в одну строку в квадратных скобках, например:
Используйте способ yaml для записи значений массива в несколько строк, например:
Как уже упоминалось, это ищет файл vars с именем
{{ ansible_hostname }}.yml
, и если он не существует, используетdefault.yml
источник
{{ ansible_hostname }}.yml
имя файла вместо../path/to/file1
. В чем смысл? Можно добавить неограниченное количество имен входных файлов.Соединение различных частей вместе ... include_vars с предложением when, которое имеет значение true, когда файл существует. т.е.
источник
Новый ответ, основанный на последних версиях Ansible - в основном, вы должны использовать
with_first_found
наряду сskip: true
пропуском задачи, если файл не найден.Это позволяет вам не иметь запасного файла vars в этом списке.
Смотрите связанные: /programming//a/39544405/100134
источник