【问题标题】:Ansible jinja template using with_dict使用 with_dict 的 Ansible jinja 模板
【发布时间】:2017-02-23 21:23:51
【问题描述】:

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

}

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

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

任何建议将不胜感激。

谢谢

【问题讨论】:

    标签: ansible ansible-2.x ansible-template


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢斯科特,这是否意味着我必须遍历字典的每一层?还是我仍然可以使用 item.attribute 表示法?
    • 您应该能够使用 item.attribute 表示法。例如,第一次通过,key 将是 windowsvalue 将是一个包含 descriptionnetworksubnet 等的字典。所以你可以引用 value.subnet 而不是 @987654329 @
    • 感谢 Scott,这正是我所追求的。
    • 只有一条评论,因为我使用的是 ansible 2.2 和 python3,它是 .items() 而不是 .iteritems()
    • @Jim python 字典的主要问题是它们的顺序。对于具有相同键顺序的 for 循环的 2 次单独运行,您没有任何保证。如果您希望内容一致,则必须使用列表,否则您可能会失去幂等性或一致性。也许如果你对键的字母数字排序没问题,你可以遍历键,并对它们进行排序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多