将ansible用于使用"序列"和未知库存大小的手动分阶段推出



考虑一个nodes密钥中服务器数量未知的Ansible清单。

我正在编写的脚本应该可以与不同的清单一起使用,这些清单应该尽可能简单,并且超出了我的控制范围,所以我不知道节点的数量。

我运行剧本的命令很普通,我可以自由更改。两个推出阶段可能有两个单独的命令。

ansible-playbook -i $INVENTORY_PATH playbooks/example.yml

剧本也很标准,可以调整:

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

在不更改库存的情况下,我该如何实施分阶段执行

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

我已经研究了serial关键字,但似乎无法在一个批处理后自动结束执行,然后再回来继续下半部分。

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

在不使用serial的情况下,这可能是一个非常简单的场景。

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

half=$( 
ANSIBLE_LOAD_CALLBACK_PLUGINS=1 
ANSIBLE_STDOUT_CALLBACK=json 
ANSIBLE_CALLBACK_WHITELIST=json 
ansible localhost -i yourinventory.yml -m debug -a "msg={{ (groups['nodes'] | length / 2) | round(0, 'ceil') | int }}" 
| jq -r ".plays[0].tasks[0].hosts.localhost.msg" 
)

然后启动您的剧本,将其限制为具有人工检查所需的任何变量的第一个$half节点,并在没有检查的情况下为其余节点再次启动它。

ansible-playbook -i yourinventory.yml example_playbook.yml -l nodes[0:$(($half-1))] -e human_check=true
ansible-playbook -i yourinventory.yml example_playbook.yml -l nodes[$half:] -e human_check=false

最新更新