Skip to content Skip to main navigation Skip to footer

Linux系统下批量升级LXD容器里的虚拟机的方法

本文将会讲述如何在linux 系统下自动升级LXD容器里的所有的虚拟机。
下面我们通过两种方法实现自动升级所有虚拟机:

方法一:使用shell 脚本来升级

手动的升级命令是:

/usr/bin/lxc exec 虚拟机名 -- /usr/bin/apt-get -y upgrade (ubuntu系统)
/usr/bin/lxcexec 虚拟机名  -- /usr/bin/yum -y update    (centos 系统)

下面来创建bash shell 脚本来自动升级所有的虚拟机:

#!/bin/bash
#脚本名:vmUpgrade.sh
#--------------------------------
cmd="$@"for i in 虚机1 虚机2 虚机3 虚机4
do
echo "[*** $i ***]"
/usr/bin/lxc exec $i -- $cmd
done

下面就可以调用脚本来升级vm了,执行下面的命令:
Ubuntu 系统:

$ ./vmUpgrade.sh /usr/bin/apt-get update
$ ./vmUpgrade.sh /usr/bin/apt-get -y upgrade

Centos 系统:

$ ./vmUpgrade.sh /usr/bin/yum -y update

方法二:使用Ansible 自动化工具

1# 安装ansible 工具
执行命令:

$ sudo apt-get install ansible

命令输出:

正在读取软件包列表... 完成
正在分析软件包的依赖关系树
正在读取状态信息... 完成
下列软件包是自动安装的并且现在不需要了:
gyp javascript-common libjs-inherits libjs-jquery libjs-node-uuid libjs-underscore libnvpair1linux libssl-dev libssl-doc libuutil1linux libuv1-dev
libzfs2linux libzpool2linux zfs-doc zlib1g-dev
使用'apt autoremove'来卸载它(它们)。
将会同时安装下列软件:
ieee-data libyaml-0-2 python-crypto python-ecdsa python-httplib2 python-jinja2 python-markupsafe python-netaddr python-paramiko python-selinux
python-six python-yaml
建议安装:
sshpass python-crypto-dbg python-crypto-doc python-jinja2-doc ipython python-netaddr-docs
下列【新】软件包将被安装:
ansible ieee-data libyaml-0-2 python-crypto python-ecdsa python-httplib2 python-jinja2 python-markupsafe python-netaddr python-paramiko python-selinux
python-six python-yaml
升级了 0 个软件包,新安装了 13 个软件包,要卸载 0 个软件包,有 5 个软件包未被升级。
需要下载 2,903 kB 的归档。
解压缩后会消耗 17.6 MB 的额外空间。
您希望继续执行吗? [Y/n] y
获取:1 http://archive.ubuntu.com/ubuntu xenial/main amd64 libyaml-0-2 amd64 0.1.6-3 [47.6 kB]
获取:2 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 python-crypto amd64 2.6.1-6ubuntu0.16.04.2 [246 kB]
获取:3 http://archive.ubuntu.com/ubuntu xenial/main amd64 python-markupsafe amd64 0.23-2build2 [15.5 kB]
获取:4 http://archive.ubuntu.com/ubuntu xenial/main amd64 python-jinja2 all 2.8-1 [109 kB]
获取:5 http://archive.ubuntu.com/ubuntu xenial/main amd64 python-six all 1.10.0-3 [10.9 kB]
获取:6 http://archive.ubuntu.com/ubuntu xenial/main amd64 python-ecdsa all 0.13-2 [34.0 kB]
获取:7 http://archive.ubuntu.com/ubuntu xenial/main amd64 python-paramiko all 1.16.0-1 [109 kB]
获取:8 http://archive.ubuntu.com/ubuntu xenial/main amd64 python-yaml amd64 3.11-3build1 [105 kB]
获取:9 http://archive.ubuntu.com/ubuntu xenial/main amd64 python-httplib2 all 0.9.1+dfsg-1 [34.2 kB]
获取:10 http://archive.ubuntu.com/ubuntu xenial/main amd64 ieee-data all 20150531.1 [830 kB]
获取:11 http://archive.ubuntu.com/ubuntu xenial/main amd64 python-netaddr all 0.7.18-1 [174 kB]
获取:12 http://archive.ubuntu.com/ubuntu xenial-updates/universe amd64 ansible all 2.0.0.2-2ubuntu1 [1,016 kB]
获取:13 http://archive.ubuntu.com/ubuntu xenial/universe amd64 python-selinux amd64 2.4-3build2 [173 kB]
已下载 2,903 kB,耗时 10秒 (287 kB/s)
正在选中未选择的软件包 libyaml-0-2:amd64。
(正在读取数据库 ... 系统当前共安装有 69061 个文件和目录。)
正准备解包 .../libyaml-0-2_0.1.6-3_amd64.deb  ...
正在解包 libyaml-0-2:amd64 (0.1.6-3) ...
正在选中未选择的软件包 python-crypto。
正准备解包 .../python-crypto_2.6.1-6ubuntu0.16.04.2_amd64.deb  ...
正在解包 python-crypto (2.6.1-6ubuntu0.16.04.2) ...
正在选中未选择的软件包 python-markupsafe。
正准备解包 .../python-markupsafe_0.23-2build2_amd64.deb  ...
正在解包 python-markupsafe (0.23-2build2) ...
正在选中未选择的软件包 python-jinja2。
正准备解包 .../python-jinja2_2.8-1_all.deb  ...
正在解包 python-jinja2 (2.8-1) ...
正在选中未选择的软件包 python-six。
正准备解包 .../python-six_1.10.0-3_all.deb  ...
正在解包 python-six (1.10.0-3) ...
正在选中未选择的软件包 python-ecdsa。
正准备解包 .../python-ecdsa_0.13-2_all.deb  ...
正在解包 python-ecdsa (0.13-2) ...
正在选中未选择的软件包 python-paramiko。
正准备解包 .../python-paramiko_1.16.0-1_all.deb  ...
正在解包 python-paramiko (1.16.0-1) ...
正在选中未选择的软件包 python-yaml。
正准备解包 .../python-yaml_3.11-3build1_amd64.deb  ...
正在解包 python-yaml (3.11-3build1) ...
正在选中未选择的软件包 python-httplib2。
正准备解包 .../python-httplib2_0.9.1+dfsg-1_all.deb  ...
正在解包 python-httplib2 (0.9.1+dfsg-1) ...
正在选中未选择的软件包 ieee-data。
正准备解包 .../ieee-data_20150531.1_all.deb  ...
正在解包 ieee-data (20150531.1) ...
正在选中未选择的软件包 python-netaddr。
正准备解包 .../python-netaddr_0.7.18-1_all.deb  ...
正在解包 python-netaddr (0.7.18-1) ...
正在选中未选择的软件包 ansible。
正准备解包 .../ansible_2.0.0.2-2ubuntu1_all.deb  ...
正在解包 ansible (2.0.0.2-2ubuntu1) ...
正在选中未选择的软件包 python-selinux。
正准备解包 .../python-selinux_2.4-3build2_amd64.deb  ...
正在解包 python-selinux (2.4-3build2) ...
正在处理用于 man-db (2.7.5-1) 的触发器 ...
正在设置 libyaml-0-2:amd64 (0.1.6-3) ...
正在设置 python-crypto (2.6.1-6ubuntu0.16.04.2) ...
正在设置 python-markupsafe (0.23-2build2) ...
正在设置 python-jinja2 (2.8-1) ...
正在设置 python-six (1.10.0-3) ...
正在设置 python-ecdsa (0.13-2) ...
正在设置 python-paramiko (1.16.0-1) ...
正在设置 python-yaml (3.11-3build1) ...
正在设置 python-httplib2 (0.9.1+dfsg-1) ...
正在设置 ieee-data (20150531.1) ...
正在设置 python-netaddr (0.7.18-1) ...
正在设置 ansible (2.0.0.2-2ubuntu1) ...
正在设置 python-selinux (2.4-3build2) ...
正在处理用于 libc-bin (2.23-0ubuntu9) 的触发器 ...

2# 创建一个yml个格式的ansible playbook 文件(update.yml),加入下面的内容

# Update host running on Debian/Ubuntu
- name: Updating host using apt
apt:
update_cache: yes
upgrade: dist
#
# Now update VMs powered by Debian/Ubuntu Linux
#
- name: Run lxc to update debian/ubuntu vms repo
command: /usr/bin/lxc exec {{ item }} -- /usr/bin/apt-get -y update
with_items:
- ubuntuvm1
- debianvm2
- ubuntuvm3
- name: Run lxc to upgrade debian/ubuntu vms pacakges
command: /usr/bin/lxc exec {{ item }} -- /usr/bin/apt-get -y upgrade
with_items:
- ubuntuvm1
- debianvm2
- ubuntuvm3
#
# Now update VMs powered by CentOS 7 Linux
#
- name: Run lxc to upgrade centos vms
command: /usr/bin/lxc exec {{ item }} -- /usr/bin/yum -y update
with_items:
- centosvm4
- centosvm5
- centosvm6

3# 执行下面的ansible-playbook命令,执行升级操作

$ ansible-playbook -i /etc/ansible/hosts update.yml