如何在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结尾的条目才会被匹配
错误写法分析
when: item | select('search', release_file + '$')select是用于列表过滤的过滤器,接收一个列表并返回符合条件的元素,不能直接用于单个字符串。对单个item使用select会返回一个生成器对象,在when条件中会被视为布尔值True,无法起到过滤作用。
when: item in regex_search(release_file + '$')- 语法逻辑完全错误:
regex_search需要接收待搜索的字符串作为输入(即item | regex_search(...)),而这里把release_file + '$'作为待搜索内容,相当于搜索空字符串(因为release_file + '$'是正则规则,不是目标文本),返回结果为空,再判断item是否在空结果里,自然永远不会匹配。
- 语法逻辑完全错误:
内容的提问来源于stack exchange,提问作者Floren
相关产品推荐
相关产品推荐

