"进行上下文"在进行导入时意味着什么?

Son*_*ton 6 salt-stack

我一直在寻找SaltStack文档中有关"上下文"含义的解释.但是只有使用上下文的例子.

什么是'背景'?

它在这做什么?为什么Debianmap.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'
    },
Run Code Online (Sandbox Code Playgroud)

Amp*_*cid 20

由于此页面是“jinja import with context”的顶部搜索结果(另一个答案实际上并没有说明它的作用),并且当我需要弄乱 Salt 时,我每隔几个月就会回到此页面,但是忘记什么with context

当您import foo在 jinja 中时,通常您定义的宏foo无法访问从中导入它的文件中的变量。作为一项优化,如果您稍后在文件中再次导入,Jinja 将会缓存此内容。相反,如果您这样做import foo with context,则 中的宏foo 可以访问从中导入的文件中的变量。代价是 Jinja 不再缓存foo,因此您需要付出渲染时间的代价。

当您这样做时include,您的变量确实会传递到另一个文件中。然后渲染另一个文件的内容并将它们粘贴进去。如果这样做include foo without context,则不会传递当前文件的变量。这很有用,因为 Jinja 会通过缓存 的内容来优化它foo,加快渲染速度。


dah*_*ens 5

with contextjinja模板引擎的一部分.

您可以在jinja文档中阅读更多相关信息:

关于丢失的debian数据 - 这是你的完整map.jinja吗?该片段}, default='Debian') %}根据grain.filter_by错过了

  • 如果您在导入上方的行中添加此 `{% set a = 'foo' %}`,您应该能够从 `map.jinja` 中访问变量 `a` 作为当前模板的 `context` 获取传递给导入。如果您使用“无上下文”,它将不可用。上下文本身是一个可以从模板中访问的数据容器。 (2认同)