2017-10-10 2 views
0

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 }}" 
+0

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

+0

Modifiez la question suite à vos commentaires avec les progrès réalisés jusqu'à présent. THX pour l'indice sur les modèles. –

+0

Ç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 :( –

Répondre

0

J'ai trouvé la grâce de solution à l'indice de @techraf à propos du modèle jinja2

Je m juste partage ici le résultat dans le cas où il aider quelqu'un à l'avenir:

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