Установить факт с динамическим именем ключа в недоступном

Я пытаюсь сжать несколько кусков аналогичного кода, который выглядит так:

- ... 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...

Фактически, единственная разница между ними заключается в том, что я использую здесь разные имена списков вместо my_list

На самом деле я хочу сделать это:

set_fact:
  "{{ some var }}" : "{{ some value }}"

Я наткнулся на этот пост, но не нашел ответа здесь.

Можно ли это сделать или есть ли способ обхода?

Ответ 1

взгляните на эту тестовую книгу:

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

Ответ 2

Вышеупомянутое не работает для меня. Что в конечном итоге работает

- set_fact:
    example_dict: "{'{{ some var }}':'{{ some other var }}'}"

Это, в конце концов, очевидно. Вы строите строку (внешние двойные кавычки), которая затем интерпретируется как хэш. В хэшах ключ и значение должны быть одинарные кавычки (внутренние одинарные кавычки вокруг переменных замен). И, наконец, вы просто поместите свои замены переменных, как в любой другой строке.

Стефан

Ответ 3

- set_fact: '{{ some_var }}={{ some_value }}'

Он создает строку выражения встроенного модуля, путем конкатенации значения some_var (имя факта), separator = и значение some_value (значение факта).

Ответ 4

С 2018 года, используя ansible v2.7.1, синтаксис, который вы предлагаете в своем посте, работает отлично.

По крайней мере, в моем случае у меня есть это в роли "а":

- name: Set fact
  set_fact: 
     "{{ variable_name }}": "{{ variable_value }}"

И это в роли "б":

- debug:
  msg: "variable_name = {{ variable_name }}"

И исполнение идет:

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

Ответ 5

- set_fact:
    var1={"{{variable_name}}":"{{ some value }}"}

Это создаст переменную " var1 " с ключом и значением динамической переменной.


Пример: я использовал это для создания динамических тегов в группе AWS Autoscaling для создания тегов kubernetes для таких экземпляров, как это:

- name: Dynamic clustertag
  set_fact:
    clustertag={"kubernetes.io/cluster/{{ clustername }}":"owned"}
- name: Create the auto scale group
  ec2_asg:
    .
    .
    .
    tags:
      - "{{ clustertag }}"