我有以下剧本~ # cat demo.yml
:
- name: demo
hosts: localhost
gather_facts: no
vars:
set:
task:
type: var1
task:
- type: var1
- type: var2
- type: var3
tasks:
- debug:
var: set
- debug:
var: task
- set_fact:
task:
type: "{{set.task.type if item.type is search(set.task.type|join('|')) else 'absent'}}"
loop: "{{task}}"
- debug:
var: task
输出:
PLAY [demo] ************************************************************************************************************************************************************************************************
TASK [debug] ***********************************************************************************************************************************************************************************************
ok: [localhost] => {
"set": {
"task": {
"type": "var1"
}
}
}
TASK [debug] ***********************************************************************************************************************************************************************************************
ok: [localhost] => {
"task": [
{
"type": "var1"
},
{
"type": "var2"
},
{
"type": "var3"
}
]
}
TASK [set_fact] ********************************************************************************************************************************************************************************************
ok: [localhost] => (item={'type': 'var1'})
ok: [localhost] => (item={'type': 'var2'})
ok: [localhost] => (item={'type': 'var3'})
TASK [debug] ***********************************************************************************************************************************************************************************************
ok: [localhost] => {
"task": {
"type": "var1"
}
}
PLAY RECAP *************************************************************************************************************************************************************************************************
localhost : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
正如你所看到的,这对于变量来说效果很好并且具有新的价值task.type
设置为变量1。
然而问题是当我提供set.task.type: var4
或任何其他变量时。
比task.type
设置为变量4代替缺席的。
问题:
task.type: absent
如果set.task.type
与数组中的任何值都不匹配,如何设置新值?
答案1
对我来说,也不清楚你想要实现什么目标,但是,关于你的问题
task.type: absent
如果set.task.type
与数组中的任何值都不匹配,如何设置新值?
和
这很好,直到我提供了
set.task.type
不存在的价值task.type
数组(注:列表)
这似乎是因为| join('|')
字典上的过滤器,以及这loop
对我来说似乎是不必要的。那么对于如何
验证变量是否
set.task.type
在 的列表中task.type
。如果值存在,那么我需要更新task.type
为 的值set.task.type
。
不循环执行
---
- hosts: localhost
become: false
gather_facts: false
vars:
# dictionary
set:
task:
type: var4
# list
task:
- type: var1
- type: var2
- type: var3
tasks:
- debug:
msg: "{{ set.task.type if task | join('|') is search(set.task.type) else 'absent' }}"
这只会导致输出
TASK [debug] *****
ok: [localhost] =>
msg: absent
请注意,您是不设置新值而是创建一个新对象。之后不会有列表task[*].type
,只有字典task.type
。
进一步的文档
-
变量不会就地修改,而是由模块返回。