saltstack jinja2 嵌套模板继承
saltstack jinja2 nested template inheritance
我在 saltstack 中遇到嵌套模板继承问题。
我期待 create_mon 将字符串 'ceph_mon_config' 传递给 create,然后拉取'ceph_mon_config 支柱中 cpu、mem 等的值到 prepare,它完成了繁重的工作。现在当渲染器到达时:
{% 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 不允许嵌套求值,但在使用 'extends' 时变量也会从模板传递到模板,而不仅仅是块。
create_mon
{% set pillar_id = 'ceph_mon_config' %}
创建
...
{% extends "states/system/vm/prepare.sls" %}
{% block cpu %}{{ pillar[pillar_id]['cpu'] }}{% endblock cpu %}
...
这按预期工作。
我在 saltstack 中遇到嵌套模板继承问题。
我期待 create_mon 将字符串 'ceph_mon_config' 传递给 create,然后拉取'ceph_mon_config 支柱中 cpu、mem 等的值到 prepare,它完成了繁重的工作。现在当渲染器到达时:
{% 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 不允许嵌套求值,但在使用 'extends' 时变量也会从模板传递到模板,而不仅仅是块。
create_mon
{% set pillar_id = 'ceph_mon_config' %}
创建
...
{% extends "states/system/vm/prepare.sls" %}
{% block cpu %}{{ pillar[pillar_id]['cpu'] }}{% endblock cpu %}
...
这按预期工作。