2017-02-23 33 views
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 }}; 

} 

模板上午我试图解决这个问题的错误的方式?

我已经阅读了一些类似的问题,但它们似乎涉及不得不拼出字典,并且我很乐意尽可能避免这种情况。

任何意见将不胜感激。

感谢

回答

1

可以遍历的字典在神社本语法:

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

感谢斯科特,就意味着我将不得不通过字典的每一个层次上重复?或者我仍然可以使用item.attribute表示法? – Jim

+0

您应该可以使用item.attribute表示法。例如,第一次传递,'key'将是'windows','value'将是包含'description','network','subnet'等的字典。所以你可以引用'value.subnet'而不是'item.value.subnet' –

+0

谢谢斯科特,那正是我以前的样子。 – Jim