web-dev-qa-db-fra.com

Définir un fait avec un nom de clé dynamique dans ansible

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?

19
Nick Roz

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}}"
20
Konstantin Suvorov

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

7
user2854753

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
3
theenglishway
- 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).

1
czerny
- 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 }}"
0
Arash