J'essaie de réduire plusieurs morceaux de code similaire qui ressemble à:
- ... multiple things is going here
register: list_register
- name: Generating list
set_fact: my_list="{{ list_register.results | map(attribute='ansible_facts.list_item') | list }}"
# the same code repeats...
En fait, la seule différence entre eux est que j'utilise ici des noms de liste différents au lieu de my_list
En fait, je veux faire ceci:
set_fact:
"{{ some var }}" : "{{ some value }}"
Je suis tombé sur ce post mais je n'ai trouvé aucune réponse ici.
Est-il possible de le faire ou existe-t-il une solution?
jetez un oeil à cet exemple de playbook:
---
- hosts: localhost
vars:
iter:
- key: abc
val: xyz
- key: efg
val: uvw
tasks:
- set_fact: {"{{ item.key }}":"{{ item.val }}"}
with_items: "{{iter}}"
- debug: msg="key={{item.key}}, hostvar={{hostvars['localhost'][item.key]}}"
with_items: "{{iter}}"
Ce qui précède ne fonctionne pas pour moi. Ce qui fonctionne finalement, c'est
- set_fact:
example_dict: "{'{{ some var }}':'{{ some other var }}'}"
Ce qui est finalement évident. Vous construisez une chaîne (les guillemets externes) qui est ensuite interprétée comme un hachage. Dans les hachages, la clé et la valeur doivent être des guillemets simples (les guillemets simples intérieurs autour des remplacements de variables). Et enfin, vous placez simplement vos remplacements de variables comme dans n'importe quelle autre chaîne.
Stefan
Depuis 2018, en utilisant ansible v2.7.1, la syntaxe que vous proposez dans votre article fonctionne parfaitement.
Au moins dans mon cas, j'ai ceci dans le rôle "a":
- name: Set fact
set_fact:
"{{ variable_name }}": "{{ variable_value }}"
Et cela dans le rôle "b":
- debug:
msg: "variable_name = {{ variable_name }}"
Et l'exécution va:
TASK [role a : Set fact] *******************************************************
ok: [Host_name] => {
"ansible_facts": {
"variable_name": "actual value"
},
"changed": false
}
...
TASK [role b : debug] **********************************************************
ok: [Host_name] => {}
MSG:
variable_name = actual value
- set_fact: '{{ some_var }}={{ some_value }}'
Il crée une chaîne de expression de paramètre du module en ligne en concaténant la valeur de some_var
(nom du fait), séparateur =
et la valeur de some_value
(valeur de fait).
- set_fact:
var1={"{{variable_name}}":"{{ some value }}"}
Cela va créer une variable "var1" avec votre clé et valeur de variable dynamique.
Exemple: J'ai utilisé ceci pour créer des balises dynamiques dans le groupe AWS Autoscaling pour créer des balises kubernetes pour les instances comme celle-ci:
- name: Dynamic clustertag set_fact: clustertag={"kubernetes.io/cluster/{{ clustername }}":"owned"}
- name: Create the auto scale group
ec2_asg:
.
.
.
tags:
- "{{ clustertag }}"