在我的剧本中,我创建了一个任务,该任务必须将列表中的每个字符串与字符串相匹配。
- set_fact:
words: ["Today", "lovely"]
- name: Joe's Statement
set_fact:
statement: "Today is a very nice day"
- name: Validate Joe's Statement
assert:
that:
- statement is search "{{ item }}"
fail_msg: "FAILED"
success_msg: "PASSED"
loop:
- "{{ words }}"
对于成功的案例,我希望我的任务将列表 words
中的每个项目与 statement
中的字符串相匹配。虽然我的任务Validate Joe's Statement
不起作用,但结果应该是FAILED
,因为Today
在声明中,但是lovely
不是。
最佳答案
尽管您的问题在于您正在循环参数中创建自己的列表列表:
loop:
- "{{ words }}"
快速修复可能是将循环编写为
loop: "{{ words }}"
有一些解决方案可以在没有循环的情况下整理您的输出,例如, select
filter 可以帮助您对列表的每个元素应用测试。
通过该过滤器,您甚至可以起草更好的失败消息,向最终用户列出语句中未出现的所有元素。
给定:
- assert:
that: missing_words | length == 0
fail_msg: |-
List of words from `{{ words }}` not found
in the statement `{{ statement }}`: {{ missing_words }}
vars:
missing_words: "{{ words | difference(words | select('in', statement)) }}"
words:
- "Today"
- "lovely"
statement: "Today is a very nice day"
该任务将产生:
fatal: [localhost]: FAILED! => changed=false
assertion: missing_words | length == 0
evaluated_to: false
msg: |-
List of words from `['Today', 'lovely']` not found
in the statement `Today is a very nice day`: ['lovely']
关于ansible - 将列表中的每个项目与字符串匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77412242/