考虑一个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