如何在Ansible中通过main_services变量过滤指定服务状态?
过滤Linux节点指定服务状态的Ansible Playbook方案
需求说明
在Linux节点上仅展示清单中指定的2-3个服务状态,避免获取所有服务的冗余信息,利用inventory中已定义的main_services变量通过json_query实现过滤。
现有清单与问题
清单文件(inventory)
[Site1] AWS-APPA ansible_host=ip-172-33-53-87.eu-west-1.compute.internal main_services='["httpd.service", "postfix.service"]' AWS-APPB ansible_host=ip-172-33-53-89.eu-west-1.compute.internal main_services='["httpd.service", "postfix.service"]' AWS-DB01 ansible_host=ip-172-33-29-194.eu-west-1.compute.internal main_services='["mariadb.service", "sshd.service"]'
原Playbook问题
原Playbook会收集所有服务状态并提取正在运行的服务,但未利用main_services变量过滤,导致输出冗余,且存在拼写错误(services_runnig应为services_running)。
修改后的Playbook
- hosts: all tasks: - name: 收集系统服务状态 service_facts: - name: 展示指定服务的状态详情 debug: msg: "{{ ansible_facts.services | dict2items | json_query(query) }}" vars: query: "[?key in {{ main_services | to_json }}].{服务名称: key, 当前状态: value.state, 开机启动状态: value.status}"
方案说明
service_facts模块:收集目标节点的所有服务信息,存储在ansible_facts.services中,格式为字典(key是服务名,value是包含状态、启动设置等的详情)。dict2items过滤器:将服务字典转换为列表格式,便于json_query进行过滤操作。json_query过滤逻辑:- 使用
key in {{ main_services | to_json }}匹配清单中当前主机的main_services列表内的服务 - 通过
.{服务名称: key, 当前状态: value.state, 开机启动状态: value.status}自定义输出字段,按需展示关键信息
- 使用
- 变量处理:
main_services | to_json将清单中的列表变量转换为JSON格式,确保json_query能正确识别。
可选简化输出
如果仅需要展示服务名和运行状态,可以简化查询语句:
- name: 展示指定服务的运行状态 debug: msg: "{{ ansible_facts.services | dict2items | json_query('[?key in {{ main_services | to_json }}].{服务名: key, 状态: value.state}') }}"
内容的提问来源于stack exchange,提问作者Peter Jackson
相关产品推荐
相关产品推荐

