jinja2 - saltstack jinja2嵌套模板继承

标签 jinja2 template-engine salt-stack

我在 saltstack 中的嵌套模板继承方面遇到一些问题。

我期望create_mon将字符串“ceph_mon_config”传递给create,然后将“ceph_mon_config”支柱中的cpu、mem等值拉到准备,这是繁重的工作。现在渲染器到达时的情况是:

{% block cpu %}{{ pillar['{% block pillar_id %}{% endblock pillar_id %}']['cpu'] }}{% endblock cpu %}

看起来它是按字面解释的:

Rendering SLS 'base:/apps/ceph/create-mon' failed: Jinja variable 'salt.pillar object' has no attribute '{% block pillar_id %}{% endblock pillar_id %}'

有什么想法吗?

谢谢!

create_mon.sls

{% extends "states/system/vm/create.sls" %}

{% block pillar_id %}ceph_mon_config{% endblock pillar_id %}

virsh create /kvmfs/vms/{{ pillar['ceph_mon_config']['hostname'] }}/config.xml:
  cmd.run:
    - requires:
      - sls: /states/system/vm/create

create.sls

{% extends "states/system/vm/prepare.sls" %}

{% block cpu %}{{ pillar['{% block pillar_id %}{% endblock pillar_id %}']['cpu'] }}{% endblock cpu %}
{% block mem %}{{ pillar['ceph_mon_config']['mem'] }}{% endblock mem %}
{% block network %}{{ pillar['ceph_mon_config']['network'] }}{% endblock network %}
{% block os %}{{ pillar['ceph_mon_config']['os'] }}{% endblock os %}
{% block hostname %}{{ pillar['ceph_mon_config']['hostname'] }}{% endblock hostname %}
{% block disk %}{{ pillar['ceph_mon_config']['disk'] }}{% endblock disk %}

prepare.sls

/kvmfs/vms/{% block hostname %}{% endblock hostname %}/config.xml:
  file.managed:
    - source: https://git.cybbh.space/vta/saltstack/raw/master/apps/virsh/files/common.xml
    - makedirs: True
    - template: jinja
    - skip_verify: True
    - defaults:
        name: {{ self.hostname() }}
        mem: {% block mem %}{% endblock mem %}
        cpu: {% block cpu %}{% endblock cpu %}
        network: {% block network %}{% endblock network %}

/kvmfs/vms/{{ self.hostname() }}/disk0.qcow2:
  file.copy:
    - source: /kvmfs/images/{% block os %}{% endblock os %}-latest

qemu-img resize /kvmfs/vms/{{ self.hostname() }}/disk0.qcow2 {% block disk %}{% endblock disk %}:
  cmd.run:
    - requires:
      - /kvmfs/vms/{{ self.hostname() }}/disk0.qcow2

/kvmfs/vms/{{ self.hostname () }}/data/meta-data:
  file.managed:
    - source: https://git.cybbh.space/vta/saltstack/raw/master/apps/virsh/files/common.metadata
    - makedirs: True
    - template: jinja
    - skip_verify: True
    - defaults:
        hostname: {{ self.hostname() }}

/kvmfs/vms/{{ self.hostname () }}/data/user-data:
  file.managed:
    - source: https://git.cybbh.space/vta/saltstack/raw/master/apps/virsh/files/common.userdata
    - makedirs: True
    - skip_verify: True

genisoimage -o /kvmfs/vms/{{ self.hostname () }}/config.iso -V cidata -r -J /kvmfs/vms/{{ self.hostname () }}/data/meta-data /kvmfs/vms/{{ self.hostname () }}/data/user-data:
  cmd.run:    
    - requires:
      - /kvmfs/vms/{{ self.hostname () }}/data/metadata
      - /kvmfs/vms/{{ self.hostname () }}/data/userdata

最佳答案

Jinja 不允许嵌套计算,但使用“扩展”时,变量也会从模板传递到模板,而不仅仅是 block 。

create_mon

{% set pillar_id = 'ceph_mon_config' %}

创建

...
{% extends "states/system/vm/prepare.sls" %}

{% block cpu %}{{ pillar[pillar_id]['cpu'] }}{% endblock cpu %}
...

这按预期工作。

关于jinja2 - saltstack jinja2嵌套模板继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41412560/

相关文章:

node.js - 模板路径中的通配符在带有 gulp 的 nunjucks 中不起作用

vagrant - 使用带 salt 状态的 ssh 代理转发

python - 如何在 jinja 模板中循环字典

javascript - 动态添加 jinja 模板

没有模板引擎的 Node.js

c# - 什么 C# 模板引擎在 HTML 和控制代码之间有清晰的分离?

salt-stack - 尝试登录远程系统时 salt-ssh 权限被拒绝

salt-stack - 如何在 salt 状态中重新启动?

python - Flask SQLite 查询

python - 如何为 jinja 模板启用 {% trans %} 标签?