【问题标题】:Ansible way to stop a service only if it needs to be upgraded仅在需要升级时才停止服务的 Ansible 方法
【发布时间】:2017-07-20 20:02:49
【问题描述】:

在 ansible playbook 中,如果需要升级,我想停止 MariaDB(在我的情况下,从 RPM 包重新启动并不总是有效)。我对 ansible 很陌生。

我想出了这个:

- name: "Check if MariaDB needs to be upgraded"
  shell: "yum check-update MariaDB-server|grep MariaDB|wc -l"
  register: needs_update

- name: "Stop mysql service"
  service:
  name: mysql
  state: stopped
when: needs_update.stdout == "1"

有没有更好的方法通过执行 shell 命令来做到这一点?运行时我收到警告:

TASK [mariadb_galera : Check if MariaDB needs to be upgraded]    ******************
changed: [139.162.220.42] => {"changed": true, "cmd": "yum check-update MariaDB-server|grep MariaDB|wc -l", "delta": "0:00:00.540862", "end": "2017-03-01 13:03:34.415272", "rc": 0, "start": "2017-03-01 13:03:33.874410", "stderr": "", "stdout": "0", "stdout_lines": ["0"], "warnings": ["Consider using yum module rather than running yum"]}
 [WARNING]: Consider using yum module rather than running yum

谢谢!

【问题讨论】:

    标签: ansible mariadb centos7


    【解决方案1】:

    您可以使用以下命令隐藏警告:

    - name: "Check if MariaDB needs to be upgraded"
      shell: "yum check-update MariaDB-server|grep MariaDB|wc -l"
      args:
        warn: false
      register: needs_update
    

    或者你可以欺骗 Ansible 在check_mode 中执行yum 任务:

    - name: "Check if MariaDB needs to be upgraded (CHECK MODE!)"
      yum:
        name: MariaDB-server
        state: latest
      check_mode: yes
      register: needs_update_check
    
    - name: "Stop mysql service"
      service:
        name: mysql
        state: stopped
      when: needs_update_check | changed
    

    请在使用前测试此代码。

    【讨论】:

    • 不幸的是,这不起作用。 check_mode 命令不会显示为已更改,而旧命令确实显示为已更改。当我执行旧命令时,它确实显示为可升级: [root@li1383-42 my.cnf.d]# yum check-update MariaDB-server|grep MariaDB|wc -l 1
    • 一些角落案例?刚刚用 vagrant box bento/centos-6.7 (virtualbox, 2.2.7)curl 包检查了它——按预期工作。我正在使用 ansible 2.2.1.0(以防万一)。
    • 我运行 CentOS Linux 版本 7.3.1611 (Core),我也运行 2.2.1.0。我很高兴在某处报告此错误,但我不知道从哪里开始。
    【解决方案2】:

    处理此问题的最佳方法是使用“处理程序” 例如类似于

    tasks:
      - name: Update db
        yum: name=MariaDB-server state=latest
        notify:
          - stop db
    
    handlers:
      -  name: stop db  
         service: name=MariaDB-server state=stopped
    

    如果你需要做多个事情,你可以指定多个处理程序,但如果你只是想重启数据库,使用restarted而不是stopped

    http://docs.ansible.com/ansible/playbooks_best_practices.html

    【讨论】:

    • 不要忘记刷新处理程序,否则您将在剧本结束时停止服务器。
    • 这不是 OP 要求的。他要求停止服务如果需要升级。这个答案在升级后停止服务,大概是在自动重启后。
    • True @Konstantin Suvorov 但这可能只是沟通不畅,因为没有人提到处理程序,所以值得放在那里。
    猜你喜欢
    • 2018-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-20
    • 2021-03-02
    • 1970-01-01
    • 2010-12-01
    相关资源
    最近更新 更多