繁体   English   中英

使用 ansible 处理程序滚动重启

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM