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

时间:2016-07-01 10:56:51

标签: 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...

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

事实上我想这样做:

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

我遇到了this post,但在这里找不到任何答案。

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

5 个答案:

答案 0 :(得分:19)

看看这个示例剧本:

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

答案 1 :(得分:6)

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

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

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

的Stefan

答案 2 :(得分:1)

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

它通过连接some_var(事实名称),分隔符=和值some_value(事实值)的值来创建inline module parameter expression字符串。

答案 3 :(得分:1)

截至2018年,使用ansible v2.7.1,您在帖子中建议的语法效果很好。

至少就我而言,我的角色是“ a”:

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

角色为“ b”的人:

- 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

答案 4 :(得分:0)

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