Ansible断言需求:实现script.dest为cron.job的子串匹配
Ansible断言:验证脚本路径是定时任务路径的子串
场景变量
假设我们有以下Ansible变量:
cron_d: script: - src: xfa.sh.j2 dest: /opt/xfb_abc.sh - src: xfa.sh.j2 dest: /opt/xfa_abc.sh cron: - name: agbcc job: /opt/xfa_abc.sh - name: aaaagbcc job: /opt/me.sh
需求
需要确保每个cron_d.script.dest的值至少是一个cron_d.cron.job的子串(即job路径可以包含dest路径内容,dest是job的一部分)。
原有问题
之前的代码仅支持字符串完全匹配,无法实现子串包含的判断:
- name: assert that each script name matches at least once with a job name assert: that: - "'{{ item.dest }}' in job_list" vars: job_list: "{{ cron_d.cron | map(attribute='job') | list }}" loop: "{{ cron_d.script }}"
解决方案
改用Jinja2的any()过滤器结合子串判断,直接检查每个dest是否被至少一个job路径包含:
- name: Assert each script dest is a substring of at least one cron job assert: that: - "{{ item.dest }} in job for job in cron_d.cron | map(attribute='job') | any" loop: "{{ cron_d.script }}"
逻辑说明
cron_d.cron | map(attribute='job')先提取所有定时任务的job路径列表{{ item.dest }} in job判断当前遍历的script的dest是否是某个job路径的子串any()会检查列表中是否存在至少一个满足上述条件的job,只要有一个符合就返回True
比如在给定的变量中:
/opt/xfa_abc.sh这个dest能匹配到对应job,断言通过/opt/xfb_abc.sh找不到包含它的job,断言会失败,符合校验要求
内容的提问来源于stack exchange,提问作者Kevin C
相关产品推荐
相关产品推荐

