包含Ansible的Alpine镜像升级之后……

Alpine一直以小而美而在docker的镜像被广泛的使用,然而,最近却因为apk的问题,爆出了一个可能被攻击的漏洞,详情请见Docker fave Alpine Linux suffers bug miscreants can exploit to poison containers。不过,Alpine的开发人员已经在最新的3.8.1版本中修复了这个问题。那么剩下的工作就是两个了:升级镜像中的apk工具,或者直接使用最新的Alpine来重新构建镜像。
如果你已经在使用latest来构建应用的镜像,那么恭喜你,升级应该是相对简单的,重新触发一次不使用缓存的构建,部署即可。
然而,如果你和我一样,以Alpine为基础,并且在其中加入了Ansible的一些相关的操作,估计就要多花点时间和功夫了。因为Alpine最新版软件仓库中,默认的ansible版本是2.5.5-r0。而Ansible从2.5开始已经全面改用python3,而非python2。带来的问题就是在Ansible的执行过程中总会导致各种python找不到。这是因为Linux中默认安装的python都是python2,而不是python3。而Alpine中没有python,所以python都是由Ansible依赖安装的,所以到了ansible 2.5之后,都只会有python3,而没有python2了。这也就导致了python命令找不到问题。

包含Ansible的Alpine镜像升级之后……_第1张图片
3.8.1中的ansible版本

解决方法:

  1. 依然使用旧版本的Ansible
    如果只是想升级Alpine,不想改动太大,则可以依然使用旧版本的ansible。不过这里要在Dockerfile中添加旧版本的Alpine的package仓库。
RUN echo "http://dl-cdn.alpinelinux.org/alpine/v3.6/community" >> /etc/apk/repositories
RUN apk --update add ansible=2.3.0.0-r1

只要确保仓库中的Ansible版本低于2.5即可,此处以3.6版本为例。同时,在安装Ansible的时候,指定版本号。

  1. 配置Ansible默认使用python3
    其实官方已经为我们准备好了一个支持python3的文档。
    简单来说就是设置一个变量即可,一般都是放在inventory文件中。
# Example inventory that makes an alias for localhost that uses Python3
localhost-py3 ansible_host=localhost ansible_connection=local ansible_python_interpreter=/usr/bin/python3

# Example of setting a group of hosts to use Python3
[py3-hosts]
ubuntu16
fedora27

[py3-hosts:vars]
ansible_python_interpreter=/usr/bin/python3

这样基本可以保证Alpine升级之后,Ansible依然工作如常。

你可能感兴趣的:(包含Ansible的Alpine镜像升级之后……)