【问题标题】:Rolling restart with ansible handlers使用 ansible 处理程序滚动重启
【发布时间】:2020-07-06 21:12:25
【问题描述】:

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

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

我知道这对于具有不同serial 值的不同剧本是可能的。但是如果我走这条路,我看不到如何使用处理程序。而且我买不起像2 这样具有serial 值的单一剧本,因为大多数时候该服务不会有任何改变。

处理程序可以跨越多个播放吗?或者有没有其他方法可以在没有黑客的情况下做到这一点?

【问题讨论】:

  • 您似乎将serial 放入了处理程序重启任务本身。你试过吗?
  • 文档似乎表明serial只能在播放级别使用。但这绝对值得一试。我会告诉你的。
  • 如果您查看文档中的Rolling Updates 部分,您会看到其中包含带有serial 参数的任务示例...
  • 你是在说这个页面docs.ansible.com/playbooks_delegation.html吗?据我所知,serial 属性仅出现在播放级别(并且仅记录了以这种方式工作)。还是我错过了什么?
  • @Mxx 遗憾的是,我认为这回答了您的初始和后续建议:ERROR: serial is not a legal parameter in an Ansible task or handler。不过还是谢谢。

标签: ansible ansible-playbook


【解决方案1】:

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

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

- name: Restart MySQL
  throttle: 1
  service:
    name: mysql
    state: restarted

【讨论】:

    【解决方案2】:

    处理程序只是 Ansible 将在必要时在播放结束时运行的任务。鉴于它们被隐式添加到您的游戏的结尾,就serial 之类的参数而言,它们将被视为与任何其他任务相同。不幸的是,这意味着如果没有 Ansible 开发人员接受的功能请求,您不太可能看到 serial 的行为发生变化以支持您尝试做的事情。

    我知道您提到过要避免黑客攻击,但这是您目前可以执行此类操作的唯一方法。设置一些不是主要 hack 的东西应该不会太难,比如创建一个临时文件来标记重启:

    - 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
    

    【讨论】:

    • 谢谢。这也是我发现的......主要问题是我无法通过这种方法正确使用角色(我希望我的角色同时包含任务和处理程序,具有不同的并行度)。
    【解决方案3】:

    目前不可能。为此有一个issue oppened

    【讨论】:

    • 谢谢!这绝对是转移对话的最佳地点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-29
    • 1970-01-01
    • 1970-01-01
    • 2023-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多