Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ansible jinja模板使用_Ansible_Ansible 2.x_Ansible Template - Fatal编程技术网

Ansible jinja模板使用

Ansible jinja模板使用,ansible,ansible-2.x,ansible-template,Ansible,Ansible 2.x,Ansible Template,所以我对Ansible还是相当陌生的,我正在尝试生成一个DHCP配置文件,作为我的第一个现实世界Ansible项目 我在RHEL7上使用ansible 2.2.1.0 我的所有配置文件都存储在yaml中,所以我要松开了 --- dhcp_subnets: windows: description: "Windows Hosts" network: 10.33.7.0 subnet: 255.255.255.0 interface_name: eth0.152

所以我对Ansible还是相当陌生的,我正在尝试生成一个DHCP配置文件,作为我的第一个现实世界Ansible项目

我在RHEL7上使用ansible 2.2.1.0

我的所有配置文件都存储在yaml中,所以我要松开了

---
dhcp_subnets:
  windows:
    description: "Windows Hosts"
    network: 10.33.7.0
    subnet: 255.255.255.0
    interface_name: eth0.152
    range_start: 10.33.7.32
    range_end:  10.33.7.250
    gateway:  10.33.7.254
    domain_name: "testlab.home"
    domain_name_servers:
      - 10.33.11.21
    ntp_servers:
      - 10.33.11.1
    hosts:
      152-rhevm:
        - description: "RHEV-M"
        - mac: "00:30:48:30:5B:1A"
        - address: "10.33.7.20"

  Linux:
    description: "Linux Hosts"
    network: 10.33.7.0
    subnet: 255.255.255.0
    interface_name: eth0.152
    range_start: 10.33.7.32
    range_end:  10.33.7.250
    gateway:  10.33.7.254
    domain_name: "testlab.home"
    domain_name_servers:
      - 10.33.11.21

    ntp_servers:
      - 10.33.11.1
    hosts:
      152-rhevm:
        - description: "RHEV-M"
        - mac: "00:30:48:30:5B:1A"
        - address: "10.33.7.20"
在ansible playbook中,我可以使用以下代码打印每个项目的属性

- debug:
  msg: "{{item.value.description}}"

with_dict: "{{ dhcp_subnets }}"

tags:
  - debug
然而,当我使用它来生成包含这些属性的配置文件时,我不知道如何做到这一点。我看不到jinja2的with_dict选项

我曾希望在with_dict循环中使用该模板,并有一个类似于以下内容的模板

###############################################################
# DHCP client file - Managed by Ansible
###############################################################

ddns-update-style interim;
ignore client-updates;

{# Here I want to iterate over dhcp_subnets #}
subnet {{ item.value.network }} netmask {{ item.value.subnet }} {
    # {{ item.value.description }}

    interface "{{ item.value.interface_name }}";
    range               {{ item.value.range_start }} {{ item.value.range_end }};

        option subnet-mask              {{ item.value.subnet }};
        option routers                  {{ item.value.gateway }};

        option domain-name              "{{ item.value.domain_name }}";
        option domain-name-servers      {{ item.value.domain_name_servers }};
    option ntp-servers              {{ item.value.ntp_servers }};

}
我想用错误的方法解决这个问题吗

我读过一些类似的问题,但它们似乎涉及到必须把字典弄平,如果可能的话,我希望避免这样做

如有任何建议,将不胜感激


谢谢

您可以使用以下语法在Jinja中迭代dict:

{% for (key,value) in dhcp_subnets.iteritems() %}
    {{key}}={{value}}
{% endfor %}

您可以使用以下语法在Jinja中迭代dict:

{% for (key,value) in dhcp_subnets.iteritems() %}
    {{key}}={{value}}
{% endfor %}

谢谢Scott,这是否意味着我必须反复阅读字典的每一个层次?或者我仍然可以使用item.attribute符号吗?您应该能够使用item.attribute符号。例如,第一次通过时,
将是
窗口
将是一个包含
说明
网络
子网
等的dict。因此,您可以引用
值.子网
,而不是
项.值.子网
,谢谢,这正是我想要的。只有一条注释,因为我使用的是ansible 2.2和python3,它是.items()而不是.iteritems()@Jim python字典的主要问题是它们的顺序。对于具有相同密钥顺序的两次单独的for循环运行,您没有任何担保。如果希望内容一致,则必须使用列表,否则可能会失去幂等性或一致性。如果你对键的字母数字排序没问题的话,你可以迭代键,然后对它们进行排序。谢谢Scott,这是否意味着我必须迭代字典的每一个级别?或者我仍然可以使用item.attribute符号吗?您应该能够使用item.attribute符号。例如,第一次通过时,
将是
窗口
将是一个包含
说明
网络
子网
等的dict。因此,您可以引用
值.子网
,而不是
项.值.子网
,谢谢,这正是我想要的。只有一条注释,因为我使用的是ansible 2.2和python3,它是.items()而不是.iteritems()@Jim python字典的主要问题是它们的顺序。对于具有相同密钥顺序的两次单独的for循环运行,您没有任何担保。如果希望内容一致,则必须使用列表,否则可能会失去幂等性或一致性。如果你对键的字母数字排序没问题,你可以迭代键,然后对它们进行排序。