Ansible 2.5 service_facts模块结果过滤及运行服务获取方法问询
Ansible 2.5 service_facts模块常见问题解答
Hey there! 作为Ansible新手,这两个关于service_facts模块的问题其实很典型,我结合你给出的输出示例来给你讲清楚怎么解决~
先看你提供的模块输出示例:
{ "ansible_facts.services": { "rsyslog": { "name": "rsyslog", "source": "sysv", "state": "running" }, "rsyslog.service": { "name": "rsyslog.service", "source": "systemd", "state": "running" }, "sendsigs.service": { "name": "sendsigs.service", "source": "systemd", "state": "stopped" } } }
问题1:如何过滤输出,仅获取部分服务或单个服务的结果?
获取单个服务的结果
如果目标是单个明确的服务,直接通过服务名作为键访问ansible_facts.services字典就可以了,非常简单。比如要获取rsyslog的详细信息,playbook可以这么写:
- name: Gather service facts service_facts: - name: Display rsyslog service details debug: var: ansible_facts.services['rsyslog']
获取部分匹配的服务结果
如果要筛选一批相关服务(比如名字包含特定关键词的),可以用Jinja2的selectattr过滤器配合values()来处理。比如要找出所有名字里带rsyslog的服务:
- name: Gather service facts service_facts: - name: Display all rsyslog-related services debug: msg: "{{ ansible_facts.services.values() | selectattr('name', 'search', 'rsyslog') | list }}"
这里的逻辑是:
values():把services字典里的所有服务对象提取出来(因为原数据是键值对,键是服务名,值是详情)selectattr('name', 'search', 'rsyslog'):筛选出name字段包含rsyslog的服务list:把筛选后的结果转换成列表格式,方便查看
问题2:如何获取所有处于运行状态的服务?
要筛选所有state为running的服务,同样用selectattr过滤器,这次匹配state字段等于running的对象:
- name: Gather service facts service_facts: - name: Display all running services (full details) debug: msg: "{{ ansible_facts.services.values() | selectattr('state', 'equalto', 'running') | list }}"
如果只需要拿到运行中服务的名字列表,可以再加个map过滤器提取name字段:
- name: Gather service facts service_facts: - name: Display names of all running services debug: msg: "{{ ansible_facts.services.values() | selectattr('state', 'equalto', 'running') | map(attribute='name') | list }}"
内容的提问来源于stack exchange,提问作者Viktor Saienko
相关产品推荐
相关产品推荐

