EDIT 10OCT2017 grâce à @techraf pour utiliser jinja2 templating J'ai des tâches ansibles qui me rendent fou (BTW j'ai seulement 1 jour d'expérience Ansible pour que je puisse me tromper dans mes tests/façons de penser) . J'essaie de convertir un objet en un objet différent. Mon objet original est comme ceci:Manipuler l'objet dans Ansible
[
{"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"]}
]
et je voudrais le transformer en:
[
{"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 aplatir les protocoles/ports et sourcerange.
J'ai essayé d'utiliser des modèles de jinja2 avec le PlayBook ansible suivant:
#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 }}"
avec mon fichier modèle (même dossier - avec nom de fichier "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 %} } ]
Comme vous pouvez le voir avec le résultat de test3 ci-dessous:
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"
}
Je parviens à regrouper les protocoles/ports et la liste de gamme s Néanmoins, il semble que la sortie du template soit interprétée comme une chaîne et une note comme un objet. J'ai essayé plusieurs tests (mettre "autour de la chaîne n'aide pas depuis leur préfixe avec) et je ne sais pas ce qui se passe
Je me demande s'il y a quelque chose de spécifique à faire pour avoir le résultat du template converti en un objet. .. Je travaille toujours sur elle et mettra à jour la question avec mes progrès Thx @techraf
MISE a jOUR FINAL je l'ai fait ici est le ansible PlayBook (modèle jinja2 intérieur):.
#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 }}"
On dirait une exigence pour un seul modèle Jinja2 avec trois ou quatre boucles for - une tâche plus laborieuse que difficile. Cela pourrait prendre un certain temps avant que quelqu'un ne l'écrive ici pour vous. Voir ceci pour une idée https://stackoverflow.com/q/40034175/2947502 – techraf
Modifiez la question suite à vos commentaires avec les progrès réalisés jusqu'à présent. THX pour l'indice sur les modèles. –
Ça marche. Thx @techraf pour l'indice sur le template. Je posterai la solution finale en guise de réponse. Malheureusement, je ne peux pas accepter le commentaire de techraf même si cela m'aide beaucoup :( –