You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Ansible中筛选以cmctl_linux_arm64结尾的校验和条目?

问题描述

需要从指定的checksums.txt文件中筛选出以cmctl_linux_arm64结尾的条目,文件内容示例如下:

ff5e6efc85421bc46975ee60cf71bec1de3f983f27a3ba8e56a0953e8c9b8a07  cmctl_linux_arm64
bb5b8db1da6b4f7f046ebbf0aced0623e1b93990c474beb525296e72076b9421  cmctl_linux_arm64.spdx.sbom
6f903b8554f7e608ba3d156878f3720480b5dd693400e0354f2c88b94e4b9de0  cmctl_linux_arm64.tar.gz

编写的Ansible任务如下:

- name: Set file fact
  ansible.builtin.set_fact:
    release_file: cmctl_linux_arm64
  run_once: true

- name: Set checksums fact
  ansible.builtin.uri:
    url: https://github.com/cert-manager/cmctl/releases/download/v2.1.0/checksums.txt
    return_content: true
  register: checksums
  run_once: true

- name: Set sha256 checksum fact
  ansible.builtin.set_fact:
    sha256_checksum: "{{ item.split(' ')[0] }}"
  loop: "{{ checksums.content.split('\n') }}"
  when: release_file in item
  run_once: true

原条件when: release_file in item会匹配到额外的两个文件条目,尝试用正则限定匹配结尾的字符串,其中when: item | regex_search(release_file + '$')可以解决问题,但when: item | select('search', release_file + '$')和when: item in regex_search(release_file + '$')无法生效,需要确认正确的条件写法。

正确写法说明

有效写法

你找到的when: item | regex_search(release_file + '$')是正确的,原因:

  • regex_search是Ansible针对单个字符串的过滤器,会在item中搜索符合正则表达式的内容
  • release_file + '$'构造了匹配字符串结尾的正则,确保只有完全以cmctl_linux_arm64结尾的条目才会被匹配

错误写法分析

  1. when: item | select('search', release_file + '$')

    • select是用于列表过滤的过滤器,接收一个列表并返回符合条件的元素,不能直接用于单个字符串。对单个item使用select会返回一个生成器对象,在when条件中会被视为布尔值True,无法起到过滤作用。
  2. when: item in regex_search(release_file + '$')

    • 语法逻辑完全错误:regex_search需要接收待搜索的字符串作为输入(即item | regex_search(...)),而这里把release_file + '$'作为待搜索内容,相当于搜索空字符串(因为release_file + '$'是正则规则,不是目标文本),返回结果为空,再判断item是否在空结果里,自然永远不会匹配。

内容的提问来源于stack exchange,提问作者Floren

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 12:42:44