在ansible中使用动态键名设置事实

Nic*_*Roz 20 variables dynamic ansible

我试图收缩几个类似代码的块,看起来像:

- ... 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...
Run Code Online (Sandbox Code Playgroud)

事实上,它们之间的唯一区别是我在这里使用不同的列表名称而不是 my_list

事实上我想这样做:

set_fact:
  "{{ some var }}" : "{{ some value }}"
Run Code Online (Sandbox Code Playgroud)

我遇到过这篇文章,但在这里找不到任何答案.

是可以这样做还是有任何解决方法?

Kon*_*rov 22

看看这个样本剧本:

---
- 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}}"
Run Code Online (Sandbox Code Playgroud)

  • 实际上,简化的答案是`set_fact:{"{{key}}":"{{val}}"}` (6认同)

小智 7

以上对我不起作用.最终有效的是

- set_fact:
    example_dict: "{'{{ some var }}':'{{ some other var }}'}"
Run Code Online (Sandbox Code Playgroud)

这到底是显而易见的.您构造一个字符串(外部双引号),然后将其解释为哈希.在哈希键和值必须是单引号(变量替换周围的内部单引号).最后,您只需将变量替换放在任何其他字符串中.

斯特凡

  • 在这里,`example_dict` 最终成为一个字符串,而不是一个字典。 (3认同)

the*_*way 5

截至 2018 年,使用 ansible v2.7.1,您在帖子中建议的语法非常有效。

至少在我的情况下,我在角色 "a" 中有这个:

- name: Set fact
  set_fact: 
     "{{ variable_name }}": "{{ variable_value }}"
Run Code Online (Sandbox Code Playgroud)

而在角色 "b" 中:

- debug:
  msg: "variable_name = {{ variable_name }}"
Run Code Online (Sandbox Code Playgroud)

然后执行:

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
Run Code Online (Sandbox Code Playgroud)