使用“序列”和未知库存大小,使用ansible进行手动分阶段卷展

使用“序列”和未知库存大小,使用ansible进行手动分阶段卷展,ansible,Ansible,考虑一个Ansible资源清册,其中节点中的服务器数量未知 我正在编写的脚本应该可以用于不同的清单,这些清单应该尽可能简单,并且不受我的控制,因此我不知道提前的节点数 我运行剧本的命令非常简单,我可以自由更改它。两个卷展栏阶段可能有两个单独的命令 ansible-playbook -i $INVENTORY_PATH playbooks/example.yml 剧本也很标准,可以调整: - hosts: nodes vars: ... remote_user: '{{ sudo

考虑一个Ansible资源清册,其中
节点中的服务器数量未知

我正在编写的脚本应该可以用于不同的清单,这些清单应该尽可能简单,并且不受我的控制,因此我不知道提前的节点数

我运行剧本的命令非常简单,我可以自由更改它。两个卷展栏阶段可能有两个单独的命令

ansible-playbook -i $INVENTORY_PATH playbooks/example.yml
剧本也很标准,可以调整:

- hosts: nodes
  vars:
    ...
  remote_user: '{{ sudo_user }}'
  gather_facts: no
  tasks:
    ...

我如何在不更改库存的情况下执行分阶段执行?

我想先运行一个命令来执行50%库存的playbook。这里的结果需要人工检查。然后我想使用另一个命令来执行另一半的剧本。清单的作者不必担心这一点。
节点下的所有机器都是相同的

我已经研究过了,但似乎不能在一个批处理之后自动结束执行,然后再回来继续下半部分


也许可以通过将变量传递给ansible playbook来做一些创造性的事情?我只是想知道,这不是一个常见的用例吗?是否所有分阶段的推出都应该是完全自动化的?

甚至不使用
序列
这里有一个可能非常简单的场景

首先,通过检查库存本身,计算库存的
$half
。下面是为ad hoc命令启用
json
回调插件,并确保它是唯一启用的插件。它还使用
jq
解析结果。您可以适应任何其他json解析器(如果愿意,甚至可以将yaml回调与yaml解析器一起使用)。无论如何,要适应你自己的需要

half=$(\
ANSIBLE\u LOAD\u CALLBACK\u PLUGINS=1\
ANSIBLE_STDOUT_CALLBACK=json\
ANSIBLE_回调_白名单=json\
ansible localhost-i yourvinventory.yml-m debug-a“msg={{(组['nodes']|长度/2)| round(0,'ceil')| int}”\
|jq-r“。播放[0]。任务[0]。主机。本地主机。消息”\
)
然后启动您的playbook,将其限制在第一个
$half
节点上,并使用人工检查所需的变量,然后在未检查的情况下再次启动其余节点的playbook

ansible playbook-i yourinventory.yml示例\u playbook.yml-l节点[0:$($half-1))]-e human\u check=true
ansible playbook-i yourinventory.yml示例_playbook.yml-l节点[$half:]-e human\u check=false

太好了,谢谢!我必须使用
ceil
而不是
floor
,使其能够处理2和3个节点。我认为这通常适用于任意数量的节点>1,对吗?我修复了这个示例(实际上也可以在命令中使用
$half
$((half+1))
)。是的,这个想法是为了让它适用于任何规模的团队。同时,我在stop上写了这篇文章,并没有测试所有的边缘情况(正如您所经历的;)