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

问题描述 投票:0回答:7

我正在尝试缩小几块类似的代码,如下所示:

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

我遇到了这篇文章,但在这里没有找到任何答案。

是否可以这样做或者有什么解决方法吗?

variables dynamic ansible
7个回答
34
投票

看看这个示例剧本:

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

19
投票

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

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

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

史蒂芬


6
投票

截至 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
投票
- set_fact: '{{ some_var }}={{ some_value }}'

它通过连接 some_var 的值(事实名称)、分隔符

=
some_value
的值(事实值)来创建一个
内联模块参数表达式 
的字符串。


1
投票
- 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 }}"

1
投票

注意 2.9 中的更改 - 行为发生更改,导致所有答案无效。 https://github.com/ansible/ansible/issues/64169


0
投票

我的用例是,迭代字典的所有项目

my_dict
并更新每个项目。

上面的答案都不适合我,但这确实:

- set_fact:
    my_dict:
      first:
        title: "First"
      second:
        title: "Second"

- set_fact:
    my_dict: "{{my_dict | combine({item.key:updated_item}, recursive=true) }}"
  vars:
    updated_item:
      name: "{{item.key}}"
  with_dict: "{{ my_dict }}"

结果:

"my_dict": {
    "first": {
         "name": "first",
         "title": "First"
    },
    "second": {
         "name": "second",
         "title": "Second"
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.