我正在尝试缩小几块类似的代码,如下所示:
- ... 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 }}"
我遇到了这篇文章,但在这里没有找到任何答案。
是否可以这样做或者有什么解决方法吗?
看看这个示例剧本:
---
- 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}}"
以上对我不起作用。最终起作用的是
- set_fact:
example_dict: "{'{{ some var }}':'{{ some other var }}'}"
这最终是显而易见的。您构造一个字符串(外部双引号),然后将其解释为散列。在哈希中,键和值必须是单引号(变量替换周围的内部单引号)。最后,您只需像在任何其他字符串中一样放置变量替换即可。
史蒂芬
截至 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
- set_fact: '{{ some_var }}={{ some_value }}'
它通过连接 some_var
的值(事实名称)、分隔符
=
和 some_value
的值(事实值)来创建一个 内联模块参数表达式的字符串。
- 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 }}"
注意 2.9 中的更改 - 行为发生更改,导致所有答案无效。 https://github.com/ansible/ansible/issues/64169
我的用例是,迭代字典的所有项目
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"
}
}