[英]Rolling restart with ansible handlers
我想运行一个安装服务的 ansible playbook,如果自上次运行以来发生任何变化,则重新启动它(或多或少是 ansible 处理程序的规范用例)。
但是我想要一个与重新启动不同的并行安装:我想一次安装在所有主机上,但是,如果调用了“service-restart”处理程序,我希望它一次在 X 主机上运行。
我知道这对于具有不同serial
值的不同剧本是可能的。 但是如果我走这条路,我看不到如何使用处理程序。 而且我无法负担像2
这样的serial
值的单一剧本,因为大多数情况下该服务不会发生任何变化。
处理程序可以跨多个播放吗? 或者有没有其他方法可以在没有黑客的情况下做到这一点?
处理程序只是 Ansible 将在必要时在播放结束时运行的任务。 鉴于它们被隐式添加到您的游戏末尾,就serial
go 之类的参数而言,它们将被视为与任何其他任务相同。 不幸的是,这意味着如果没有 Ansible 开发人员接受的功能请求,您不太可能看到serial
行为的变化以支持您正在尝试做的事情。
我知道您提到要避免黑客攻击,但这将是您目前可以执行此类操作的唯一方法。 设置一些不是主要黑客的东西应该不会太难,比如创建一个临时文件来标记重新启动:
- hosts: some_hosts
name: install service
serial: 10
- handlers:
- name: schedule restart
command: touch /tmp/restart_flag
- tasks:
- name: install service
action: whatever...
notify: schedule restart
- hosts: some_hosts
name: restart service
serial: 2
- handlers:
- name: perform restart
service: name=foo state=restarted
- tasks:
- name: Delete /tmp/restart_flag. Restart service if file is deleted.
file: path=/tmp/restart_flag state=absent
notify: perform restart
目前是不可能的。 为此存在一个问题。
Ansible 2.9.0推出了throttle
关键字,它可以在任务,块,或打出水平来工人的数量限制(最多到指定的叉或串行设置)允许的。
例如,这可以用于一一重启数据库集群中的节点:
- name: Restart MySQL
throttle: 1
service:
name: mysql
state: restarted
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.