如何配置";要么全有,要么全无”;Ansible剧本?

如何配置";要么全有,要么全无”;Ansible剧本?,ansible,Ansible,我有一堆服务器需要经常修补。我计划使用Ansible来协调修补过程。这里的要点是,它必须是一个“要么全有,要么全无”的补丁。要么所有服务器都打了补丁,要么没有 我在剧本中考虑的任务如下: 1-转到所有服务器并拍摄lvm快照 2-如果任务1适用于所有服务器,则应用更改 3-如果其中一台主机因任何原因出现故障,请回滚所有节点上的快照 问题是我是Ansible的新手,我无法在剧本上表达这一点。我已经写了这个简单的测试剧本: --- - hosts: all strategy: linear

我有一堆服务器需要经常修补。我计划使用Ansible来协调修补过程。这里的要点是,它必须是一个“要么全有,要么全无”的补丁。要么所有服务器都打了补丁,要么没有

我在剧本中考虑的任务如下: 1-转到所有服务器并拍摄lvm快照 2-如果任务1适用于所有服务器,则应用更改 3-如果其中一台主机因任何原因出现故障,请回滚所有节点上的快照

问题是我是Ansible的新手,我无法在剧本上表达这一点。我已经写了这个简单的测试剧本:

---
- hosts: all
  strategy: linear

  tasks:
  - block:
      - debug: msg='Testing on {{ inventory_hostname }}...'
      - command: /home/amirsamary/activity.sh
        changed_when: false
    rescue:
      - debug: msg='Rollback of {{ inventory_hostname }}...'
  - debug: msg='I continued running tasks on {{ inventory_hostname }}...'
我的清单上有两台主机。在第一个节点上,activity.sh返回true,在第二个节点上,activity.sh返回false。因此,node2总是会失败。问题是,救援任务将只针对发生故障的主机运行,而不是针对所有主机运行(正如人们所期望的那样),playbook将继续运行其他任务


我听说过很多关于Ansible在数千台服务器上协调复杂任务的好方法。但我似乎找不到一种安全实施“要么全有要么全无”战略的方法。我遗漏了什么?

我打赌有很多方法可以实现这一点,下面是其中之一:

---
- hosts: all
  strategy: linear

  tasks:
    - debug: msg='Testing on {{ inventory_hostname }}...'
    - command: /home/amirsamary/activity.sh
      register: cmd_result
      ignore_errors: true
    - debug: msg='Rollback of {{ inventory_hostname }}...'
      when: play_hosts | map('extract', hostvars, 'cmd_result') | selectattr('failed','defined') | list | count > 0
这里做了什么

  • 我们将脚本执行结果注册到
    cmd_result
    中,并忽略错误(如果有)
  • 使用线性策略,在执行下一个任务之前,我们将在所有主机上完成
    命令
    任务
  • 因此,我们为每个主机注册了
    cmd\u result
  • 为了检查是否需要回滚,我们提取当前播放中所有主机的
    cmd_result
    事实,选择那些定义了
    失败的主机,将它们转换为列表并计数:如果有,回滚
因此,如果任何主机出现故障
cmd\u result
,则将对所有主机执行回滚任务

您可能希望在回滚任务之后添加此任务:

- fail: msg='Patch command failed!'
  when: cmd_result | failed

这样,您将完成回滚任务,并将问题主机标记为失败。

谢谢您,康斯坦丁!这正是我需要的!感谢您花时间发布此消息。