如何在按主机和标签过滤时排除不匹配的Ansible Playbook
仅返回Ansible匹配的Play的方法
Ansible原生没有直接只输出匹配主机/任务的Play的参数,但可以通过命令行文本过滤工具实现需求,以下是具体方案:
方法:结合awk过滤输出
执行原命令后,通过awk脚本筛选出包含有效主机(数量≥1)或有效任务的Play:
ansible-playbook <mybook.yml> -l <myhost> -t <mytag> -D -C --list-hosts --list-tasks | awk '/^ play #/{p=1; buf=$0; next} p{buf=buf"\n"$0; if (/hosts \([1-9]/ || /tasks:\n - /) {print buf; p=0} else if (/^ play #/) {p=1; buf=$0}}'
脚本逻辑说明
- 检测到
play #开头的行时,标记开始缓存当前Play的内容 - 持续缓存直到满足任一条件:
- 匹配到
hosts ([1-9]:表示该Play有至少1个匹配的主机 - 匹配到
tasks:\n -:表示该Play有至少1个匹配的任务
- 匹配到
- 满足条件则输出缓存的Play内容,否则跳过空匹配的Play
替代方案:自定义回调插件(进阶)
如果需要更灵活的输出控制,可以编写Ansible回调插件,在插件中判断Play是否有匹配的主机/任务,仅输出符合条件的内容。该方案需要修改Ansible配置,适合长期复用场景。
内容的提问来源于stack exchange,提问作者puravidaso
相关产品推荐
相关产品推荐

