Установить факт с динамическим именем ключа в недоступном
Я пытаюсь сжать несколько кусков аналогичного кода, который выглядит так:
- ... 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 }}"