基于给定服务列表查询Windows服务并启动未运行项的Ansible实现咨询
Ansible Windows服务状态检查&自动修复Playbook正确实现
完整修正后的Playbook代码
- name: 检查指定Windows服务的运行状态 ansible.windows.win_service_info: name: "{{ item }}" register: win_service_info with_items: - BrokerInfrastructure # 后台任务基础架构服务 - DcomLaunch # DCOM服务器进程启动器服务 - gpsvc # 组策略客户端服务 - name: 启动未运行的服务并设置开机自启 ansible.windows.win_service: name: "{{ item.item }}" start_mode: auto state: started register: service_startup with_items: "{{ win_service_info.results }}" when: item.exists # 仅当服务存在时执行,避免报错
关键参数说明
- name参数写法:
{{ item.item }}
第一个任务遍历服务列表时注册的win_service_info.results中,每个返回结果的item字段对应最初传入的服务名称,直接调用即可匹配到对应服务。 - when判断条件写法:
item.exists
首先判断目标服务在主机上真实存在,避免操作不存在的服务导致任务失败。ansible.windows.win_service模块本身是幂等的:- 如果服务已经是运行状态、启动模式为自动,任务不会做任何修改
- 如果需要严格限制仅当服务未运行时才执行,可以把条件扩展为
item.exists and item.services[0].state != "running"
额外优化方案
如果不需要单独记录服务初始状态,完全可以省略第一步的查询任务,直接使用更简洁的写法,执行效率更高:
- name: 配置指定Windows服务为自动启动且运行状态 ansible.windows.win_service: name: "{{ item }}" start_mode: auto state: started with_items: - BrokerInfrastructure - DcomLaunch - gpsvc
语法修正提示
原代码中第一个任务的ansible.windows.win_service_info行缩进错误,需要和同级的name参数保持相同缩进,否则会触发YAML语法错误。
内容的提问来源于stack exchange,提问作者alphablack
相关产品推荐
相关产品推荐

