gpt4 book ai didi

ansible - 如何配置 "all or nothing"Ansible 剧本?

转载 作者:行者123 更新时间:2023-12-01 00:37:45 27 4
gpt4 key购买 nike

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

我正在为我的剧本考虑的任务是这样的:
1 - 转到所有服务器并拍摄 lvm 快照
2 - IIF 任务 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 将始终失败。问题是救援任务只会为发生故障的主机运行,而不是为所有主机运行(正如人们所期望的那样),并且剧本会继续运行其他任务。

我听说过很多关于 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并忽略错误,如果有的话
  • 使用线性策略,我们将有 command任务在执行下一个任务之前在所有主机上完成
  • 所以我们有 cmd_result为每个主机注册
  • 检查我们是否需要回滚,我们提取 cmd_result当前播放中所有主机的事实,选择带有 failed 的那些定义,将它们转换为列表并计算它们:如果有,回滚。

  • 因此,如果失败,将对所有主机执行回滚任务 cmd_result对于他们中的任何一个。

    您可能希望在回滚任务后添加此任务:
    - fail: msg='Patch command failed!'
    when: cmd_result | failed

    通过这种方式,您将完成回滚任务并将问题主机标记为失败。

    关于ansible - 如何配置 "all or nothing"Ansible 剧本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39300734/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com