saltstack jinja2嵌套模板继承

时间:2017-01-01 00:31:07

标签: jinja2 template-engine salt-stack

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

我希望 create_mon 将字符串'ceph_mon_config'传递给 create ,然后在'ceph_mon_config支柱中提取cpu,mem等的值准备,这是繁重的工作。现在,当渲染器到达时:

completionHandler(sampleJSON(airbnbUS: airbnbUS, airbnbLocal: airbnbLocal))

看起来它正在逐字地解释它:

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

有什么想法吗?

谢谢!

create_mon.sls

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

create.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

prepare.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 %}

1 个答案:

答案 0 :(得分:1)

Jinja不允许嵌套评估,但是当使用' extends'而不仅仅是块时,变量也会从模板传递到模板。

create_mon

{% set pillar_id = 'ceph_mon_config' %}

创建

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

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

这可以按预期工作。