首页 文章

使用with_dict的Ansible jinja模板

提问于
浏览
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 }};

}

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

我已经阅读了一些类似的问题,但它们似乎涉及到要弄平字典,我很想避免这种情况,如果可能的话 .

任何建议将不胜感激 .

谢谢

1 回答

  • 1

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

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

相关问题