ansible - 将列表中的每个项目与字符串匹配

标签 ansible yaml

在我的剧本中,我创建了一个任务,该任务必须将列表中的每个字符串与字符串相匹配。

- 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/

相关文章:

ansible - 获取 Ansible 目录中的最新文件名

kubernetes - 为什么 pod yaml 文件中的容器对象具有 "list value"而不是 "map value"

python - yaml.dump 在 Python 中的对象的 numpy.array 类型属性上抛出错误

python - 标准标签的 PyYAML 替代构造函数

来自 YAML 文件的 Jenkins 管道

linux - Shell如何杀死一个进程并返回0

python - Ansible mysql_user 与 Percona 57 和 RHEL7

json - 使用JMESPath,如何过滤至少定义了一个标签的Consul服务?

linux - ansible 启动进程,如果没有使用 ps 运行

azure - 通过 REST API 处理 Azure DevOps 管道资源