我想运行一个安装服务的ansible playbook,如果自上次运行以来发生了任何变化(或多或少是ansible处理程序的规范用例),则重新启动它。
但我想要一个不同的并行性来安装而不是重新启动:我想一次安装在所有主机上,但是,如果调用“service-restart”处理程序,我希望它能够运行一次在X主机上。
我知道这可能适用于具有不同serial
值的不同播放。但是,如果我走这条路,我无法看到如何利用处理程序。而且我不能拥有像serial
这样的2
值的单一剧本,因为大部分时间该服务都不会改变。
处理程序可以跨多个游戏吗?或者有没有其他方法可以做到这一点没有黑客?
答案 0 :(得分:5)
如果需要,处理程序只是Ansible在游戏结束时运行的任务。鉴于它们会隐含地添加到游戏结束时,就像serial
这样的参数而言,它们将被视为与任何其他任务相同。不幸的是,这意味着如果没有功能请求,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
答案 1 :(得分:3)
目前不可能。这有一个issue oppened。
答案 2 :(得分:2)
Ansible 2.9.0引入了throttle
关键字,该关键字可用于任务,块或播放级别,以限制允许的工作人员数量(最多指定的fork或串行设置)。
例如,这可用于重新启动数据库集群中的节点:
- name: Restart MySQL
throttle: 1
service:
name: mysql
state: restarted