如何配置";要么全有,要么全无”;Ansible剧本?
我有一堆服务器需要经常修补。我计划使用Ansible来协调修补过程。这里的要点是,它必须是一个“要么全有,要么全无”的补丁。要么所有服务器都打了补丁,要么没有 我在剧本中考虑的任务如下: 1-转到所有服务器并拍摄lvm快照 2-如果任务1适用于所有服务器,则应用更改 3-如果其中一台主机因任何原因出现故障,请回滚所有节点上的快照 问题是我是Ansible的新手,我无法在剧本上表达这一点。我已经写了这个简单的测试剧本:如何配置";要么全有,要么全无”;Ansible剧本?,ansible,Ansible,我有一堆服务器需要经常修补。我计划使用Ansible来协调修补过程。这里的要点是,它必须是一个“要么全有,要么全无”的补丁。要么所有服务器都打了补丁,要么没有 我在剧本中考虑的任务如下: 1-转到所有服务器并拍摄lvm快照 2-如果任务1适用于所有服务器,则应用更改 3-如果其中一台主机因任何原因出现故障,请回滚所有节点上的快照 问题是我是Ansible的新手,我无法在剧本上表达这一点。我已经写了这个简单的测试剧本: --- - hosts: all strategy: linear
---
- 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
这样,您将完成回滚任务,并将问题主机标记为失败。谢谢您,康斯坦丁!这正是我需要的!感谢您花时间发布此消息。