使用 with_dict 的 Ansible jinja 模板

Ansible jinja template using with_dict

所以我对 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 中迭代字典:

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