如何从Ansible多行Fact中提取匹配linux-arm64的校验和并设置为新Fact
如何从Ansible多行Fact中提取匹配linux-arm64的校验和并设置为新Fact
我来帮你搞定这个需求!你已经通过uri模块成功拉取到了Sealed Secrets的校验和文件内容,接下来只需要借助Ansible的字符串处理过滤器,就能轻松提取出对应linux-arm64版本的校验和并设置为新的Fact。
方法一:使用正则表达式提取(推荐)
直接用regex_search过滤器匹配目标行并提取校验和,这种方式精准且高效:
# 保留你原来获取校验和的任务 - name: Fetch Sealed Secrets checksums ansible.builtin.uri: url: https://github.com/bitnami-labs/sealed-secrets/releases/download/v0.24.5/sealed-secrets_0.24.5_checksums.txt return_content: true register: checksums # 新增提取校验和并设置Fact的任务 - name: Extract linux-arm64 checksum to fact ansible.builtin.set_fact: linux_arm64_checksum: "{{ checksums.content | regex_search('^([a-f0-9]+)\\s+kubeseal-.*linux-arm64\\.tar\\.gz$', '\\1', multiline=True) | first }}" # 调试验证结果 - name: Output extracted checksum ansible.builtin.debug: var: linux_arm64_checksum
代码解释:
regex_search启用multiline=True,让^可以匹配每一行的开头- 正则表达式
^([a-f0-9]+)\\s+kubeseal-.*linux-arm64\\.tar\\.gz$会精准匹配包含linux-arm64的校验和行,并用\\1捕获校验和部分 | first用来取出匹配结果列表中的唯一元素(因为只会匹配到一行)
运行后你会看到期望的结果:
TASK [Output extracted checksum] *********
ok: [localhost] =>
linux_arm64_checksum: 6bc27346b2f32c85e230161070ffe5c8502360b94aee4cfcedfc512de32543f8
方法二:按行分割筛选(更直观)
如果你觉得正则有点复杂,也可以用更直观的字符串分割+筛选方式:
- name: Extract linux-arm64 checksum (alternative approach) ansible.builtin.set_fact: linux_arm64_checksum: "{{ checksums.content.splitlines() | select('search', 'linux-arm64') | first | split | first }}"
代码解释:
splitlines()把多行内容拆分成单行列表select('search', 'linux-arm64')筛选出包含目标字符串的行| first取筛选后的第一行(唯一匹配行)split按空格分割该行,再用| first取出第一个元素(即校验和)
两种方法都能完美实现你的需求,你可以根据自己的习惯选择使用~
备注:内容来源于stack exchange,提问作者Floren
相关产品推荐
相关产品推荐

