【发布时间】:2022-12-13 12:00:01
【问题描述】:
在一个可靠的剧本中,我想仅当用户名或后跟后缀“.A”的用户名出现在另一个列表中时,才对一个列表中的一组用户名循环执行任务。
失败的示例剧本:
---
- hosts: localhost
vars:
- users1:
- alice
- alice.A
- bob
- santa
- users2:
- alice
tasks:
- debug:
msg: "Do something for {{ item }} realname {{ item | regex_replace('^([a-z]+)\\.[aA]$', '\\1') }}"
loop: "{{ users1 }}"
when:
- "item | regex_replace('^([a-z]+)\\.[aA]$', '\\1') in users2"
此版本跳过 alice.A,而任务本身中的 regex_replace 过滤器按预期返回 alice。
实际输出:
TASK [debug] ***************
ok: [localhost] => (item=alice) => {}
MSG:
Do something for alice realname alice
skipping: [localhost] => (item=alice.A)
skipping: [localhost] => (item=bob)
skipping: [localhost] => (item=santa)
期望的输出:
TASK [debug] ***************
ok: [localhost] => (item=alice) => {}
MSG:
Do something for alice realname alice
Do something for alice.A realname alice
skipping: [localhost] => (item=bob)
skipping: [localhost] => (item=santa)
是否可以对要测试的项目应用过滤器?
如果没有,有没有办法使用map()之类的东西来复制users2列表中的条目,并为每个项目附加“.A”后缀?
当我尝试过的条件都失败时:
when: ("item in users2 | flatten(1)") or
("item|regex_search('\.A$')")
when:
- "item | regex_replace('^([a-z]+\\.[a-z]+).[aA]$', '\\1') in users | flatten(1)"
when:
- "item in users | flatten(1) | map('regex_replace','^([a-z]+\\.[a-z]+)$', '\\1.A')"
when:
- "item | map('regex_replace','^([a-z]+\\.[a-z]+).[aA]$', '\\1') in users | flatten(1)"
when:
- "item|map('upper') in users | flatten(1)"
最后一个只是检查测试的项目是否被过滤器修改。 (这不是 AFAICT。)
【问题讨论】:
标签: filter ansible conditional-statements