如何使用Ansible apt更新Ubuntu/Debian Linux上的所有包

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

使用Ansible的apt模块可以批量管理很多Ubuntu和debian的apt包。
该模块可以在远程服务器上使用aptitude或者apt-get命令进行包管理。
本教程将介绍如何使用Ansible进行系统更新,并在内核升级时重新启动设备?

Ansible使用apt模块更新所有包

通常使用apt-get命令或者apt命令来更新软件包缓存:

sudo apt-get update

如果是使用Ansible更新存储库缓存,操作如下:

    - name: Update apt-get repo and cache
      apt: update_cache=yes force_apt_get=yes cache_valid_time=3600

其中

update_cache=yes在所有服务器上运行相当于apt-get update的命令
force_apt_get=yes不要使用aptitude命令,而是在Debian/Ubuntu中使用apt-get命令
cache_valid_time=3600如果apt缓存的时间早于缓存有效时间,则更新该缓存。以秒为单位。

使用Ansible升级所有apt包

将所有包升级到最新版本。
语法是:

   - name: Upgrade all apt packages
      apt: upgrade=dist force_apt_get=yes

其中,

upgrade=dist在所有Ubuntu或者Debian Linux服务器上运行等效于“apt-get upgrade”的命令。
force_apt_get=yes使用apt-get,而不是aptitude。

检查是否需要重启服务器

如果文件/var/run/reboot-required存在,我们需要重新启动Debian或者Ubuntu Linux机器。
如果系统上存在文件/var/run/reboot-required,则注册一个新变量,如下所示:

    - name: Check if a reboot is needed for Debian and Ubuntu boxes
      register: reboot_required_file
      stat: path=/var/run/reboot-required get_md5=no

其中

register: reboot_required_fileregister关键字决定将结果保存在哪个变量中
stat: path=/var/run/reboot-required判断文件(/var/run/reboot-required)是否存在
get_md5=no判断文件的算法。我们可以使用md5、sha1、sha224、sha256、sha384和sha512.

安装新内核后重新启动服务器

内核更新后可以使用命令或者shell模块重新启动Linux服务器:

    - name: Reboot the Debian or Ubuntu server
      reboot:
        msg: "Reboot initiated by Ansible due to kernel updates"
        connect_timeout: 5
        reboot_timeout: 300
        pre_reboot_delay: 0
        post_reboot_delay: 30
        test_command: uptime
      when: reboot_required_file.stat.exists

其中

test_command: uptime在重新启动的服务器上执行uptime命令
when: reboot_required_file.stat.exists使用reboot_required_file变量检查/var/run/reboot required文件是否存在。只有在该文件存在,reboot模块才会工作。

使用Ansible进行系统更新,必要时重启Linux服务器

我们已经了解了基本逻辑,让我们创建一个新的主机文件:

vi hosts

添加以下内容:

## 设置ssh登录的用户名,python3的路径 ##
[all:vars]
ansible_user='ubuntu'
ansible_become=yes
ansible_become_method=sudo
ansible_python_interpreter='/usr/bin/env python3' 
##########################
## servers中添加服务器名
## 和/etc/hosts中列表对应
## 或者直接写ip
###########################
[servers]
oit-server-1
oit-server-2
192.168.1.100

创建playbook

创建一个新文件update.yml

添加以下Ansbile代码:

---
- hosts: servers
  become: true
  become_user: root
  tasks:
    - name: Update apt repo and cache on all Debian/Ubuntu boxes
      apt: update_cache=yes force_apt_get=yes cache_valid_time=3600

    - name: Upgrade all packages on servers
      apt: upgrade=dist force_apt_get=yes

    - name: Check if a reboot is needed on all servers
      register: reboot_required_file
      stat: path=/var/run/reboot-required get_md5=no

    - name: Reboot the box if kernel updated
      reboot:
        msg: "Reboot initiated by Ansible for kernel updates"
        connect_timeout: 5
        reboot_timeout: 300
        pre_reboot_delay: 0
        post_reboot_delay: 30
        test_command: uptime
      when: reboot_required_file.stat.exists

执行ansible命令:

# ansible-playbook -i hosts update.yml

总结

我们学习了如何使用Ansible更新Debian和UbuntuLinux设备上的所有软件包。