как обрабатывать импорт файлов с помощью Jinja, которые не существуют - PullRequest
0 голосов
/ 28 июня 2019

В соляных столбах мне нужно загрузить содержимое файла в переменную Jinja.Если файл не существует, Jinja выдает ошибку (TemplateNotFound: ...)

У меня есть несколько папок (компания A, компания B и т. Д.) В моих столбах, которые могут содержать или не содержать файл с именем Default.sls.Если файл существует - он будет загружен в переменную.Проблема возникает, когда файл не существует - в этом случае Jinja генерирует исключение TemplateNotFound.Моя папка Pillar выглядит примерно так:

pillar
|
|-Default.sls
|
|-Company A
| |-Default.sls  <-- This could be missing
| |-init.sls
| |-prod.sls
| |-test.sls
| |-etc...
|
|-Company B
| |-Default.sls  <-- This could be missing
| |-init.sls
| |-prod.sls
| |-test.sls
| |-etc...
|
|-Company C
|...

Я не нашел хорошего способа решить эту проблему.Я использовал следующий код (info: tpldir содержит имя текущего имя папки, в котором находится файл sls (в данном случае init.sls)):

{{Company x}}/init.sls
----------------------
{% from tpldir + '/default.sls' import companyDefaultX with context %}
xx:
  companyDefault: {{ companyDefaultX | yaml }}

Чтобы проверить, есть ли файлсуществует - я использую:

salt['file.file_exists']('/srv/pillar/' + tpldir + "/default.sls")

Это прекрасно работает, пока file_roots, определенный в главной конфигурации Salt, настроен по умолчанию.Теперь мы перешли к использованию gitfs - теперь вышеприведенное использование file.file_exists, очевидно, не работает, поскольку файлы больше не находятся на мастер-соли в /srv/pillar/...!

ПричинаПриведенный выше код заключается в том, что это способ сделать Tiering между конфигурациями по умолчанию и companyDefault.Сначала читается значение по умолчанию (Defalt.sls), затем {{Company X}} / Default.sls объединяется с / по умолчанию.В-третьих, среда (prod.sls, test.sls и т. Д.) Объединяется с новым значением по умолчанию ...

Дополнительный вопрос: как зациклить файлы в папке без использования:

salt['file.readdir']('/srv/pillar/' + tpldir)

Поскольку это та же проблема (/srv/pillar)...

1 Ответ

0 голосов
/ 28 июня 2019

Я нашел решение выше. Единственный способ - использовать include в сочетании с «ignore missing»:

{%- load_yaml as customerDefaultX %}
{% include tpldir + '/default.sls' ignore missing with context %}
{%- endload %}

Переменная customerDefaultX теперь будет содержать содержимое файла {{Company X}} / default.sls ИЛИ Нет, если он не существует ...

Оригинальный бонусный вопрос все еще открыт; -)

...