Что означает «с контекстом» при выполнении импорта?

#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 полезен.