我有下面的剧本(简化)。
它运行得很好,但我希望能够进行预热,只部署到单个主机(如串行:1),然后暂停,这样我就可以检查日志以验证一切正常,然后再发布到占我所有服务的 33% 的规模。
Ansible 有没有一种简单的方法可以让你做到这一点?
我现在有一个非常棘手的解决方案,基本上就是复制和粘贴带有 serial: 1 的代码、一个失败语句、一堆 when 检查和命令行参数。一定有比毁掉一本干净易读的剧本更好的方法。我只是不确定它会是什么。
- name: 33% at a time max-analytics deploy
hosts: role_max_logger
serial: 33%
tasks:
- name: take out of lb analytics
shell: haproxy stuff
- pause:
seconds: 5
- name: gracefulReloading max-analytics
shell: reload stuff
- name: add back to lb analytics
shell: haproxy stuff
答案1
从 Ansible 2.2 开始,你可以设置动态批次大小。
---
- hosts: mygroup
serial:
- 1
- 33%
tasks:
- shell: date
- pause:
prompt: check if everything ok
when: ansible_play_hosts.index(inventory_hostname) == 0
这将在第一批中仅占用一个主机,在该主机上执行 date 命令,如果当前主机是播放主机中的第一个,则暂停。因此它只会暂停一次,然后 33% 的批次将不暂停地进行。
答案2
您可以将序列设为变量,并传入希望剧本运行的数量。例如,您可以传入“1”作为序列,在剧本结束时,如果变量为“1”,则退出剧本。
如果变量不是“1”,剧本将继续在其他服务器上执行。您的第一台服务器可能会再次部署,但没问题,因为您的更改应该已经是最新的。
更多信息请见此处:http://docs.ansible.com/ansible/playbooks_variables.html#passing-variables-on-the-command-line
如果变量为“1”,则使用失败模块退出:http://docs.ansible.com/ansible/fail_module.html