如何从Ansible scan_services/service_facts模块输出中筛选运行中服务?
如何从Ansible的service_facts模块输出中筛选运行状态的服务
嘿,我来帮你搞定这个需求!在Ansible 2.5及以上版本,**service_facts**是官方推荐用来收集系统服务信息的模块(替代了旧的scan_services),它会把服务数据存放在ansible_facts.services字典里。下面给你两种实用的方法来筛选出处于running状态的服务:
方法1:使用Jinja2原生过滤器(无需额外依赖)
这种方法用Ansible内置的Jinja2过滤器处理,不需要安装额外工具,兼容性最好。
首先收集服务事实,再通过过滤器筛选:
- name: 收集并筛选运行中的服务 hosts: your_target_hosts tasks: - name: 获取所有服务状态 ansible.builtin.service_facts: - name: 输出所有运行中服务的完整信息 ansible.builtin.debug: msg: "{{ ansible_facts.services | dict2items | selectattr('value.state', 'equalto', 'running') | list }}" - name: 仅输出运行中服务的名称(更简洁) ansible.builtin.debug: msg: "{{ ansible_facts.services | dict2items | selectattr('value.state', 'equalto', 'running') | map(attribute='key') | list }}"
过滤器说明:
dict2items:把services字典转换成键值对列表(每个元素是{key: 服务名, value: 服务详情}的结构)selectattr('value.state', 'equalto', 'running'):筛选出value.state等于running的项map(attribute='key'):如果只需要服务名称,用这个提取每个项的key(即服务名)list:把筛选后的结果转换成列表格式
方法2:使用json_query(更简洁,需依赖jmespath)
如果你偏好更简洁的语法,可以用json_query,但需要在控制节点安装jmespath库(执行pip install jmespath即可)。
示例代码:
- name: 用json_query筛选运行中服务 hosts: your_target_hosts tasks: - name: 获取所有服务状态 ansible.builtin.service_facts: - name: 输出运行中服务的完整信息 ansible.builtin.debug: msg: "{{ ansible_facts.services | json_query('* | [?state == `running`]') }}" - name: 仅输出运行中服务的名称 ansible.builtin.debug: msg: "{{ ansible_facts.services | json_query('* | [?state == `running`].name') }}"
json_query语法说明:
*:遍历services字典的所有值(即每个服务的详情)[?state ==running]:筛选出state字段等于running的服务.name:提取筛选结果中的name字段(即服务名)
关于旧的scan_services模块
如果你还在使用旧的scan_services模块,输出结构和service_facts基本一致,只需把模块名替换成scan_services,上面的筛选方法完全适用。
内容的提问来源于stack exchange,提问作者stevansv
相关产品推荐
相关产品推荐

