Ansible jinja模板使用
所以我对Ansible还是相当陌生的,我正在尝试生成一个DHCP配置文件,作为我的第一个现实世界Ansible项目 我在RHEL7上使用ansible 2.2.1.0 我的所有配置文件都存储在yaml中,所以我要松开了Ansible jinja模板使用,ansible,ansible-2.x,ansible-template,Ansible,Ansible 2.x,Ansible Template,所以我对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
---
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中迭代dict:
{% for (key,value) in dhcp_subnets.iteritems() %}
{{key}}={{value}}
{% endfor %}
您可以使用以下语法在Jinja中迭代dict:
{% for (key,value) in dhcp_subnets.iteritems() %}
{{key}}={{value}}
{% endfor %}
谢谢Scott,这是否意味着我必须反复阅读字典的每一个层次?或者我仍然可以使用item.attribute符号吗?您应该能够使用item.attribute符号。例如,第一次通过时,
键
将是窗口
,值
将是一个包含说明
,网络
,子网
等的dict。因此,您可以引用值.子网
,而不是项.值.子网
,谢谢,这正是我想要的。只有一条注释,因为我使用的是ansible 2.2和python3,它是.items()而不是.iteritems()@Jim python字典的主要问题是它们的顺序。对于具有相同密钥顺序的两次单独的for循环运行,您没有任何担保。如果希望内容一致,则必须使用列表,否则可能会失去幂等性或一致性。如果你对键的字母数字排序没问题的话,你可以迭代键,然后对它们进行排序。谢谢Scott,这是否意味着我必须迭代字典的每一个级别?或者我仍然可以使用item.attribute符号吗?您应该能够使用item.attribute符号。例如,第一次通过时,键
将是窗口
,值
将是一个包含说明
,网络
,子网
等的dict。因此,您可以引用值.子网
,而不是项.值.子网
,谢谢,这正是我想要的。只有一条注释,因为我使用的是ansible 2.2和python3,它是.items()而不是.iteritems()@Jim python字典的主要问题是它们的顺序。对于具有相同密钥顺序的两次单独的for循环运行,您没有任何担保。如果希望内容一致,则必须使用列表,否则可能会失去幂等性或一致性。如果你对键的字母数字排序没问题,你可以迭代键,然后对它们进行排序。