Ansible“热身”部署

Ansible“热身”部署

我有下面的剧本(简化)。

它运行得很好,但我希望能够进行预热,只部署到单个主机(如串行: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

相关内容