【问题标题】:Anisble script to restart services if failed如果失败则重新启动服务的 Ansible 脚本
【发布时间】:2022-10-09 03:02:03
【问题描述】:

希望有人可以提供帮助。我只是在 Ansible 的世界中找到自己的脚,并尝试创建一个脚本来检查服务是否正在运行,如果它没有启动则启动它。这就是我到目前为止所拥有的。我不确定是否正确。

---
  - hosts: all
    tasks:
      - name: Domain controller checks
        block:
          - name: Check Active Directory Domain Services are running
            become_method: runas
            win_service:
              name: "{{ item }}"
              start_mode: auto
              state: started  
            loop:
              - NTDS
              - ADWS
              - Dfs
              - DFSR
              - DNS
              - Kdc
      tasks:         
          - name: Restart failed services if needed
            failure_actions:
            - type: restart
              delay_ms: 5000

通过 rundeck 运行此脚本时,出现以下错误:

[WARNING]: While constructing a mapping from<br />
<br />/etc/ansible/scripts/Service_ChecksV2.yml, line 2, column 5, found a duplicate
dict key (tasks). Using last defined value only.<br />
<br />ERROR! unexpected parameter type in action: <class 'ansible.parsing.yaml.objects.AnsibleSequence'><br />
<br />The error appears to be in '/etc/ansible/scripts/Service_ChecksV2.yml': line 20, column 13, but may
be elsewhere in the file depending on the exact syntax problem.<br />
<br />The offending line appears to be:
    <br />tasks:
          - name: Restart failed services if needed
            ^ here
Failed: AnsibleNonZero: ERROR: Ansible execution returned with non zero code.<br />

【问题讨论】:

  • 请注意,根据错误信息:“found a duplicate dict key (tasks). Using last defined value only",有一个(某种)错字。至少需要删除第二次出现的剧本关键字tasks
  • 这不是一本有效的剧本,你有一些看起来像是使用不存在模块的任务定义。请查看win_service documentation 和该页面上的示例。我怀疑您要写的是this,但我无法确定,因为您的示例代码中存在太多问题。

标签: ansible rundeck


【解决方案1】:

您可以使用ansible_facts 模块来检查正在运行的服务。

实施如下:

# load service facts
- name: Prepare service facts
  service_facts:

然后,您可以运行任务以使用 when 变量重新启动服务

when: ansible_facts.services["Dfs.service"]["state"] != "running"

【讨论】:

  • 在描述其预期状态启动之前,您无需检查服务是否正在运行。 win_service 是幂等的,只有在需要时才会启动服务。
  • 只是为了在您的编辑后澄清:绝对不需要加载 service_facts 来满足 OP 的要求。加载服务事实很慢,只有在您确实需要它们时才应该这样做(例如,检查服务是否存在以调节其他任务......)。一个例子:检查防火墙服务是否已安装/激活/运行以播放将打开端口的任务,否则不做任何事情。从我们掌握的信息来看,这里绝对没有必要做这样的事情。我在应该完成工作的问题下方的评论中链接了一个示例(如果 OP 确认他的意图)。
  • @Zeitounator 谢谢你指出我正确的方向,我会看看这个。所有这些都是新的,并且正在尝试学习新技能,因此感谢您的所有帮助。
【解决方案2】:

由于剧本中有额外的 tasks 部分,您的脚本失败。

根据您的要求,在第一部分 state: started 就足够了。 因为它会寻找服务状态,如果 ansible 发现服务正在运行,那么它不会做任何事情。否则,如果它发现服务没有运行,那么它将启动该服务。

【讨论】:

    猜你喜欢
    • 2015-07-21
    • 2017-10-18
    • 1970-01-01
    • 1970-01-01
    • 2020-06-28
    • 1970-01-01
    • 2023-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多