2017-10-10 1 views
0

EDIT 10OCT2017 dank @techraf jinja2 templating verwenden Ich habe eine ansible Aufgaben, die mich verrückt macht (BTW Ich habe nur 1 Tag Ansible Erfahrung, damit ich falsch in meinen Tests/Art des Denkens) . Ich versuche, ein Objekt in ein anderes Objekt umzuwandeln. Meine ursprüngliche Objekt ist wie folgt:Objekt in Ansible manipulieren

[ 
{"allowed":[{"IPProtocol":"tcp","ports":["1234-1235"]},{"IPProtocol":"udp","ports":["1238-1239"]}], 
"description":"hello1", 
"name":"hello1", 
"sourceRanges":["128.0.0.0/16","192.0.0.0/16"]}, 
{"allowed":[{"IPProtocol":"tcp","ports":["2345-2346"]},{"IPProtocol":"udp","ports":["4567-4578"]}], 
"description":"hello2", 
"name":"hello2", 
"sourceRanges":["128.0.0.0/16","192.0.0.0/16"]} 
] 

und ich möchte es in verwandeln:

[ 
{"allowed":"tcp:1234-1235,udp:1238-1239", 
"description":"hello1", 
"name":"hello1", 
"sourceRanges":"128.0.0.0/16,192.0.0.0/16"}, 
{"allowed":"tcp:2345-2346,udp:4567-4578", 
"description":"hello2", 
"name":"hello2", 
"sourceRanges":"128.0.0.0/16,192.0.0.0/16"} 
] 

I m Abflachen der Protokolle/Ports und sourcerange.

Ich versuchte jinja2 Vorlagen mit dem folgende ansible Textbuch mit:

#ansible-playbook issue.yml -i 'local,' --connection=local 
- hosts: 
    - local tasks: 
    - name: setVar 
    set_fact: 
     aOriginal='[{"allowed":[{"IPProtocol":"tcp","ports":["1234-1235"]},{"IPProtocol":"udp","ports":["1238-1239"]}],"description":"hello1","name":"hello1","sourceRanges":["128.0.0.0/16","192.0.0.0/16"]},{"allowed":[{"IPProtocol":"tcp","ports":["2345-2346"]},{"IPProtocol":"udp","ports":["4567-4578"]}],"description":"hello2","name":"hello2","sourceRanges":["128.0.0.0/16","192.0.0.0/16"]}]' 
    - debug: 
     var: aOriginal 
    - name: Populate SubnetIds 
    set_fact: 
     test3: "{{ lookup('template', 'subnet2.j2') }}" 
    vars: 
     rules: "{{ aOriginal }}" 
    - debug: 
     var: test3 
    - name: Create rules 
    shell: gclofud compute firewall-rules create {{ item.name }} --allow {{ item.altIpProtos }} --description {{ item.description }} --source-ranges {{ item.flatSrcRanges }} 
    with_items: "{{ test1 }}" 

mit meiner Vorlagendatei (gleiche Ordner - mit dem Dateinamen "subnet2.j2"):

[ { {% for s in rules %}name:{{s.name}},description:{{s.description}},allowed:{% for aOneAllowedProtoPort in s.allowed %}{{aOneAllowedProtoPort.IPProtocol}}:{% for aOneAllowedPort in aOneAllowedProtoPort.ports %}{{aOneAllowedPort}}{% endfor %}{% if not loop.last %},{% endif %}{% endfor %},sourceRanges:"{% for aOneAllowedSource in s.sourceRanges %}{{aOneAllowedSource}}{% if not loop.last %},{% endif %}{% endfor %}{% endfor %} } ] 

Wie Sie sehen können mit dem test3 ergebnis unten:

ok: [local] => { 
    "test3": "[\"name\":hello1,description:hello1,allowed:tcp:1234-1235,udp:1238-1239,sourceRanges:128.0.0.0/16,192.0.0.0/16\"name\":hello2,description:hello2,allowed:tcp:2345-2346,udp:4567-4578,sourceRanges:128.0.0.0/16,192.0.0.0/16]\n" 
} 

Ich schaffe es, die protocole/ports und liste der reichweite zusammenzufassen s Trotzdem scheint die Ausgabe von Templating als String und Note als Objekt interpretiert zu werden. Ich habe mehrere Tests versucht (Putting "um String nicht helfen, da ansible Präfix ihnen mit) und ich bin mir nicht sicher, was passiert.

Ich frage mich, ob es etwas bestimmtes zu tun, um das Ergebnis der Vorlage in ein Objekt umgewandelt haben. .. noch daran zu arbeiten und wird die Frage mit meinem Fortschritt Thx @techraf

FINAL UPDATE aktualisiert ich habe es hier das ansible Textbuch ist (jinja2 Vorlage innen):.

#ansible-playbook issue.yml -i 'local,' --connection=local 
- hosts: 
    - local 
    tasks: 
    - name: setVar 
    set_fact: 
     aOriginal='[{"allowed":[{"IPProtocol":"tcp","ports":["1234-1235"]},{"IPProtocol":"udp","ports":["1238-1239"]}],"description":"hello1","name":"hello1","sourceRanges":["128.0.0.0/16","192.0.0.0/16"]},{"allowed":[{"IPProtocol":"tcp","ports":["2345-2346"]},{"IPProtocol":"udp","ports":["4567-4578"]}],"description":"hello2","name":"hello2","sourceRanges":["128.0.0.0/16","192.0.0.0/16"]}]' 
    - debug: 
     var: aOriginal 
    - name: Populate SubnetIds 
    set_fact: 
     test3='[ {% for s in rules %} {"name":"{{s.name}}","description":"{{s.description}}","allowed":"{% for aOneAllowedProtoPort in s.allowed %}{{aOneAllowedProtoPort.IPProtocol}}:{% for aOneAllowedPort in aOneAllowedProtoPort.ports %}{{aOneAllowedPort}}{% endfor %}{% if not loop.last %},{% endif %}{% endfor %}","sourceRanges":"{% for aOneAllowedSource in s.sourceRanges %}{{aOneAllowedSource}}{% if not loop.last %},{% endif %}{% endfor %}"}{% if not loop.last %},{% endif %} {% endfor %} ]' 
    vars: 
     rules: "{{ aOriginal }}" 
    - debug: 
     var: test3 
    - name: Create rules 
    shell: gclofud compute firewall-rules create {{ item.name }} --allow {{ item.altIpProtos }} --description {{ item.description }} --source-ranges {{ item.flatSrcRanges }} 
    with_items: "{{ test3 }}" 
+0

Sieht aus wie eine Anforderung für eine einzelne Jinja2 Vorlage mit drei oder vier for-Schleifen - eine Aufgabe mühsamer als anspruchsvoll. Es kann einige Zeit dauern, bis jemand das hier für dich schreibt. Sehen Sie dies für eine Idee https://stackoverflow.com/q/40034175/2947502 – techraf

+0

Bearbeiten Sie die Frage nach Ihrem Feedback mit dem bisherigen Fortschritt. THX für den Hinweis auf Templating. –

+0

Es funktioniert. Thx @ Techraf für den Hinweis über Templating. Ich werde die endgültige Lösung als Antwort veröffentlichen. Leider kann ich den Kommentar von techraf nicht akzeptieren, auch wenn es mir so viel hilft :( –

Antwort

0

ich die Lösung dank gefunden zum Hinweis auf @techraf über jinja2 Vorlage

Ich bin nur hier, um das Ergebnis für den Fall, teilen sie jemand in der Zukunft helfen:

#ansible-playbook issue.yml -i 'local,' --connection=local 
- hosts: 
    - local 
    tasks: 
    - name: setVar 
    set_fact: 
     aOriginal='[{"allowed":[{"IPProtocol":"tcp","ports":["1234-1235"]},{"IPProtocol":"udp","ports":["1238-1239"]}],"description":"hello1","name":"hello1","sourceRanges":["128.0.0.0/16","192.0.0.0/16"]},{"allowed":[{"IPProtocol":"tcp","ports":["2345-2346"]},{"IPProtocol":"udp","ports":["4567-4578"]}],"description":"hello2","name":"hello2","sourceRanges":["128.0.0.0/16","192.0.0.0/16"]}]' 
    - debug: 
     var: aOriginal 
    - name: Populate SubnetIds 
    set_fact: 
     test3='[ {% for s in rules %} {"name":"{{s.name}}","description":"{{s.description}}","allowed":"{% for aOneAllowedProtoPort in s.allowed %}{{aOneAllowedProtoPort.IPProtocol}}:{% for aOneAllowedPort in aOneAllowedProtoPort.ports %}{{aOneAllowedPort}}{% endfor %}{% if not loop.last %},{% endif %}{% endfor %}","sourceRanges":"{% for aOneAllowedSource in s.sourceRanges %}{{aOneAllowedSource}}{% if not loop.last %},{% endif %}{% endfor %}"}{% if not loop.last %},{% endif %} {% endfor %} ]' 
    vars: 
     rules: "{{ aOriginal }}" 
    - debug: 
     var: test3 
    - name: Create rules 
    shell: gclofud compute firewall-rules create {{ item.name }} --allow {{ item.altIpProtos }} --description {{ item.description }} --source-ranges {{ item.flatSrcRanges }} 
    with_items: "{{ test3 }}"