使用ansible处理程序滚动重启

Cos*_*atu 8 ansible ansible-playbook

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

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

我知道这对于具有不同serial值的不同游戏是可能的.但是,如果我走这条路,我无法看到如何利用处理程序.我不能拥有一个serial像这样的价值的单一剧本2,因为大多数时候该服务没有任何改变.

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

fnk*_*nkr 7

Ansible 2.9.0 引入了throttle关键字,可以在任务、块或播放级别使用该关键字来限制允许的工作线程数量(最多为指定的分叉或串行设置)。

例如,这可以用于一一重启数据库集群中的节点:

- name: Restart MySQL
  throttle: 1
  service:
    name: mysql
    state: restarted
Run Code Online (Sandbox Code Playgroud)


Bru*_*e P 6

如果需要,处理程序只是Ansible在游戏结束时运行的任务.鉴于它们被隐含地添加到你的游戏结束时,就像serialgo 等参数一样,它们将被视为与任何其他任务一样.不幸的是,这意味着如果没有功能请求,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
Run Code Online (Sandbox Code Playgroud)