0
因此,我对Ansible仍然很陌生,并且我试图生成一个DHCP配置文件作为我的第一个真实世界Ansible项目。使用with_dict的Ansible jinja模板
我在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剧本本身,我可以使用下面的代码打印每个项目的属性
- 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 }};
}
模板上午我试图解决这个问题的错误的方式?
我已经阅读了一些类似的问题,但它们似乎涉及不得不拼出字典,并且我很乐意尽可能避免这种情况。
任何意见将不胜感激。
感谢
感谢斯科特,就意味着我将不得不通过字典的每一个层次上重复?或者我仍然可以使用item.attribute表示法? – Jim
您应该可以使用item.attribute表示法。例如,第一次传递,'key'将是'windows','value'将是包含'description','network','subnet'等的字典。所以你可以引用'value.subnet'而不是'item.value.subnet' –
谢谢斯科特,那正是我以前的样子。 – Jim