使用 with_dict 的 Ansible jinja 模板
Ansible jinja template using with_dict
所以我对 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 }};
}
我是不是试图以错误的方式解决这个问题?
我读过一些类似的问题,但它们似乎涉及到必须将字典弄平,我希望尽可能避免这种情况。
如有任何建议,我们将不胜感激。
谢谢
您可以使用以下语法在 Jinja 中迭代字典:
{% for (key,value) in dhcp_subnets.iteritems() %}
{{key}}={{value}}
{% endfor %}
所以我对 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 }};
}
我是不是试图以错误的方式解决这个问题?
我读过一些类似的问题,但它们似乎涉及到必须将字典弄平,我希望尽可能避免这种情况。
如有任何建议,我们将不胜感激。
谢谢
您可以使用以下语法在 Jinja 中迭代字典:
{% for (key,value) in dhcp_subnets.iteritems() %}
{{key}}={{value}}
{% endfor %}