You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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}"

方案说明

  1. service_facts模块:收集目标节点的所有服务信息,存储在ansible_facts.services中,格式为字典(key是服务名,value是包含状态、启动设置等的详情)。
  2. dict2items过滤器:将服务字典转换为列表格式,便于json_query进行过滤操作。
  3. json_query过滤逻辑:
    • 使用key in {{ main_services | to_json }}匹配清单中当前主机的main_services列表内的服务
    • 通过.{服务名称: key, 当前状态: value.state, 开机启动状态: value.status}自定义输出字段,按需展示关键信息
  4. 变量处理: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 18:32:58