#salt-stack
#солевой стек
Вопрос:
Я искал объяснение в документах SaltStack о том, что означает «с контекстом». Но есть только примеры использования контекста.
Что такое «контекст»?
Что он здесь делает? И почему это Debian
игнорируется в map.jinja
файле? (например map.log_dir
, кажется, что он «прыгает вниз» на уровень)
# config.sls
{% from "bind/map.jinja" import map with context %}
include:
- bind
{{ map.log_dir }}:
file.directory:
- user: root
- group: {{ salt['pillar.get']('bind:config:group', map.group) }}
- mode: 775
- require:
- pkg: bind
# map.jinja
{% set map = salt['grains.filter_by']({
'Debian': {
'pkgs': ['bind9', 'bind9utils', 'dnssec-tools'],
'service': 'bind9',
'config_source_dir': 'bind/files/debian',
'zones_source_dir': 'zones',
'config': '/etc/bind/named.conf',
'local_config': '/etc/bind/named.conf.local',
'key_config': '/etc/bind/named.conf.key',
'options_config': '/etc/bind/named.conf.options',
'default_config': '/etc/default/bind9',
'default_zones_config': '/etc/bind/named.conf.default-zones',
'named_directory': '/var/cache/bind/zones',
'log_dir': '/var/log/bind9',
'user': 'root',
'group': 'bind',
'mode': '644'
},
'RedHat': {
'pkgs': ['bind'],
'service': 'named',
'config_source_dir': 'bind/files/redhat',
'zones_source_dir': 'zones',
'config': '/etc/named.conf',
'local_config': '/etc/named.conf.local',
'default_config': '/etc/sysconfig/named',
'named_directory': '/var/named/data',
'log_dir': '/var/log/named',
'user': 'root',
'group': 'named',
'mode': '640'
},
Ответ №1:
Поскольку эта страница является лучшим результатом поиска для «импорта jinja с контекстом» (а в другом ответе на самом деле не сказано, что он делает), и я продолжаю возвращаться на эту страницу каждые пару месяцев, когда мне нужно возиться с солью, но забываю, что with context
делает:
Когда вы import foo
работаете в jinja, обычно макросы, в которых вы определили, foo
не имеют доступа к переменным в файле, из которого вы его импортируете. В качестве оптимизации Jinja затем кэширует это, если вы снова импортируете файл позже. Если вместо этого вы это сделаете import foo with context
, то макросы в foo
могут обращаться к переменным в файле, из которого они импортируются. Компромисс заключается в том, что Jinja больше не кэширует foo
, поэтому вы платите за время рендеринга.
Когда вы это делаете include
, ваши переменные передаются в другой файл. Затем вы отображаете содержимое другого файла и вставляете его. Если вы это сделаете include foo without context
, вы не передадите переменные текущего файла. Это полезно, потому что Jinja оптимизирует это, кэшируя содержимое foo
, ускоряя ваш рендеринг.
Ответ №2:
with context
является частью шаблонизатора jinja.
Вы можете прочитать больше об этом в документах jinja docs:
Что касается отсутствующих данных debian — это ваша полная карта.jinja? фрагмент не }, default='Debian') %}
соответствует зернам.filter_by
Комментарии:
1. Спасибо @dahrens. Я все еще не понимаю, что такое контекст на самом деле, но я предполагаю, что это похоже на переменные пространства имен. Мне еще предстоит достичь просветления в SaltStack… Это просто фрагмент map.jinja.
2. Если вы добавите это
{% set a = 'foo' %}
в строку над импортом, вы сможете получить доступ к переменнойa
изнутриmap.jinja
, посколькуcontext
ваш текущий шаблон передается в импорт. если вы используетеwithout context
вместо этого, он будет недоступен. сам контекст является контейнером для данных, к которым можно получить доступ из вашего шаблона.3. Спасибо, похоже, это стандартная видимость переменной / пространство имен.
4. Понижающий голос, поскольку это не пытается ответить на вопрос.
5. Я проголосовал против, потому что, если я могу понять, что написано в руководстве, мне не нужно спрашивать о stackoverflow. пример в комментарии @dahrens полезен.