0

所以我对 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 }};

}

我是否试图以错误的方式解决这个问题?

我已经阅读了一些类似的问题,但它们似乎涉及必须整理字典,如果可能的话,我很想避免这种情况。

任何建议将不胜感激。

谢谢

4

1 回答 1

2

您可以使用以下语法遍历 Jinja 中的 dict:

{% for (key,value) in dhcp_subnets.iteritems() %}
    {{key}}={{value}}
{% endfor %}
于 2017-02-23T21:43:08.103 回答