Ansible编写服务故障自动重启脚本执行报错问题咨询
问题排查
你的Playbook执行失败有两个核心语法错误,还有一处逻辑冗余:
- 重复定义
tasks键:同一个play层级下写了两次tasks,YAML语法中字典的键唯一,Ansible解析时会直接丢弃第一个tasks下的所有服务检查逻辑,只读取最后一个tasks的内容,这也是警告信息found a duplicate dict key (tasks)的来源。 - 模块参数误用:
failure_actions是win_service模块的内置配置参数,不是独立的Ansible任务模块。你把它作为单独任务写,Ansible找不到对应的合法模块,就会抛出unexpected parameter type in action的错误。 - 逻辑冗余:
win_service模块本身是幂等的,当你配置state: started时,模块会自动检查服务运行状态,服务未运行时会直接执行启动操作,不需要额外编写“检查状态再启动”的判断逻辑。
修正后的Playbook
--- - hosts: all tasks: - name: 确保AD核心服务运行并配置失败自动重启策略 become: yes become_method: runas win_service: name: "{{ item }}" start_mode: auto state: started failure_actions: - type: restart delay_ms: 5000 loop: - NTDS - ADWS - Dfs - DFSR - DNS - Kdc
改动说明
- 删除了重复的
tasks定义,所有任务统一放在同一个tasks列表下 - 将
failure_actions参数直接合并到win_service模块配置中,遍历每个服务时会同时完成启动类型校验、服务状态检查拉起、失败恢复策略配置三个动作 - 补充了
become: yes参数:Windows环境使用runas提权时必须配置该参数,否则会因权限不足导致服务操作失败 - 执行时如果服务已经处于正常运行状态、配置符合要求,模块不会做任何变更,满足幂等性要求。
内容的提问来源于stack exchange,提问作者steh88
相关产品推荐
相关产品推荐

