2017-02-23 3 views
0

Also ich bin noch ziemlich neu in Ansible, und ich versuche, eine DHCP-Konfigurationsdatei als meine erste reale Ansible Projekt zu generieren.Ansible Jinja Vorlage mit with_dict

Ich benutze ansible 2.2.1.0 auf RHEL7.

Ich komme unstuck wie ich alle meine config in yaml gespeichert haben

--- 
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" 

Im ansible Textbuch selbst ich den folgenden Code verwenden, um die Attribute der einzelnen Elemente drucken

- debug: 
    msg: "{{item.value.description}}" 

with_dict: "{{ dhcp_subnets }}" 

tags: 
    - debug 

Da ich dies jedoch verwende, um eine Konfigurationsdatei zu erstellen, die diese Attribute enthält, habe ich keine Ahnung, wie das geht. Ich kann die Option with_dict für jinja2 nicht sehen.

hatte ich gehofft, die Vorlage innerhalb einer with_dict Schleife zu verwenden und eine Vorlage ähnlich der folgenden

############################################################### 
# 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 }}; 

} 

haben Versuche ich dieses Problem in die falsche Art und Weise zu lösen?

Ich habe einige der ähnlichen Fragen gelesen, aber sie scheinen zu beinhalten, die Wörterbücher zu verflachen, und ich bin daran interessiert, das wenn möglich zu vermeiden.

Jeder Rat würde sehr geschätzt werden.

Dank

Antwort

1

Sie können mit dieser Syntax ein dict in Jinja iterieren:

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

Dank Scott, würde das bedeuten, ich muss durch jede Ebene des Wörterbuchs laufen würde? oder kann ich noch die Item.Attributnotation verwenden? – Jim

+0

Sie sollten die item.attribute-Notation verwenden können. Zum Beispiel wäre der erste Schlüssel 'key'' windows' und 'value' wäre ein dict, das' description', 'network',' subnet', usw. enthält. Sie könnten also auf 'value_net' verweisen anstatt auf 'item.value.sub'' –

+0

Danke Scott, genau das wollte ich. – Jim

Verwandte Themen