如何使用Ansible更新Debian/Ubuntu内核并重启等待

时间:2019-11-20 08:54:18  来源:igfitidea点击:

使用DevOps工具和Ansible自动化运维来更新大量云服务器已经很普遍。
安装新内核后,必须重新启动Debian或者Ubuntu 服务器。
本教程将介绍如何使用Ansible playbook来更新Debian/Ubuntu并进行远程重启。

需要使用的Ansible模块

apt–管理Debian/Ubuntu Linux的apt包,例如安装新软件包或者更新软件包。

command或者 shell-使用shell模块在节点中执行命令。使用command模块在远程节点上执行命令。当内核更新时,使用其中1个模块来重新启动机器。

wait_for_connection–等待远程系统可以被访问/可用。

使用Ansible更新Debian/Ubuntu内核更新并重启等待

在Ansible中更新Debian或者Ubuntu服务器

playbook内容:

      - name: Update all packages
        apt:
            update_cache: yes
            upgrade: dist

使用shell模块让Ansible等待服务器重新启动

      - name: Reboot box if kernel/libs updated and requested by the system
        shell: sleep 10 && /sbin/shutdown -r now 'Rebooting box to update system libs/kernel as needed' 
        args:
            removes: /var/run/reboot-required
        async: 300
        poll: 0
        ignore_errors: true

如果在Debian或者Ubuntu中,文件 /var/run/reboot-required 存在。我们需要使用shutdown/reboot命令重新启动Linux服务器。
请注意,在 shutdown -r 之前添加了sleep命令.
然后使用async。它以异步方式执行shell模块。
removes是条件的简短形式。如果文件/var/run/reboot-required不存在,则不会运行shutdown命令。如果内核更新了,我们只需要运行reboot命令或者shutdown命令。

重启,等待重启完成

      - name: Wait for system to become reachable again
        wait_for_connection:
            delay: 60
            timeout: 300

Ansible现在总共等待300秒。同时增加60秒延迟时间。

使用Ansible Playbook远程重启主机

Ansible对Debian/Ubuntu进行内核更新并重新启动等待。完整示例:

update.yml文件

---
- hosts: cluster
  tasks:
      - name: Update all packages on a Debian/Ubuntu
        apt:
            update_cache: yes
            upgrade: dist
      
      - name: Reboot box if kernel/libs updated and requested by the system
        shell: sleep 10 && /sbin/shutdown -r now 'Rebooting box to update system libs/kernel as needed' 
        args:
            removes: /var/run/reboot-required
        async: 300
        poll: 0
        ignore_errors: true
      
      - name: Wait for system to become reachable again
        wait_for_connection:
            delay: 60
            timeout: 300

      - name: Verify new update (optional)
        command: uname -mrs
        register: uname_result
      - name: Display new kernel version
        debug:
            var: uname_result.stdout_lines

hosts文件:

[all:vars]
ansible_user=Hyman
ansible_port=22
ansible_python_interpreter='/usr/bin/env python3'
ansible_become=yes
ansible_become_method=sudo [cluster]
mysql2 ansible_host=192.168.1.100
mysql1 ansible_host=192.168.1.101
mysql3 ansible_host=192.168.1.102

执行ansible任务

$ ansible-playbook -i hosts update.yml