使用ansible处理程序滚动重启

时间:2014-11-01 01:47:08

标签: ansible ansible-playbook

我想运行一个安装服务的ansible playbook,如果自上次运行以来发生了任何变化(或多或少是ansible处理程序的规范用例),则重新启动它。

但我想要一个不同的并行性来安装而不是重新启动:我想一次安装在所有主机上,但是,如果调用“service-restart”处理程序,我希望它能够运行一次在X主机上。

我知道这可能适用于具有不同serial值的不同播放。但是,如果我走这条路,我无法看到如何利用处理程序。而且我不能拥有像serial这样的2值的单一剧本,因为大部分时间该服务都不会改变。

处理程序可以跨多个游戏吗?或者有没有其他方法可以做到这一点没有黑客?

3 个答案:

答案 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