什么与上下文'进口时的意思是什么?

时间:2016-10-17 00:33:23

标签: salt-stack

我一直在SaltStack文档中寻找有关上下文'的内容的解释。手段。但是只有使用上下文的例子。

什么是' context'?

它在这做什么?为什么在Debian文件中忽略了map.jinja? (例如map.log_dir似乎"跳过" a level)

# 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'
    },

2 个答案:

答案 0 :(得分:5)

with contextjinja template engine

的一部分

您可以在jinja docs中阅读更多相关内容:

关于丢失的debian数据 - 这是你的完整map.jinja吗?该代码段根据grains.filter_by

错过了}, default='Debian') %}

答案 1 :(得分:2)

因为这个页面是“jinja import with context”的最高搜索结果(而另一个答案实际上并没有说明它的作用),所以当我需要弄乱时,我每隔几个月就会回到这个页面使用 Salt 但忘记了 with context 的作用:

当您在 jinja 中 import foo 时,通常您在 foo 中定义的宏无法访问您从中导入它的文件中的变量。作为优化,如果您稍后在文件中再次导入,Jinja 将缓存它。如果您改为执行 import foo with context,则 foo 中的宏可以访问从中导入的文件中的变量。权衡是 Jinja 不再缓存 foo,因此您需要支付渲染时间。

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