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 }}"
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
Bearbeiten Sie die Frage nach Ihrem Feedback mit dem bisherigen Fortschritt. THX für den Hinweis auf Templating. –
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 :( –