为了安心迎接Python2的结束,我所做的事情
我自己简单介绍一下。
我是在SRE/QA团队担任SRE的@yukin01。
大约半年前,我主要从事使用iOS、Firebase/GCP开发应用程序,但现在我想加强基础设施方面的能力,所以我在现在的工作中在Globis担任SRE角色,涉及AWS和GCP。
Python2 的维护终止
正如您所知,Python2已经宣布在2020年1月1日停止支持,但如果您仍然有依赖于Python2的产品或工具,您肯定希望在EOL之前尽一切所能将其淘汰掉。
(您可以查看EOL倒计时的网站来感受一些紧迫感)
如果我在2020年1月1日前不进行升级,会发生什么?
如果在Python 2中发现灾难性的安全问题,或者在Python 2编写的软件中发现,大多数志愿者将不会帮助解决这些问题。如果需要使用Python 2软件时需要帮助,许多志愿者将不会帮助您,随着时间的推移,愿意提供帮助的志愿者将越来越少。您将失去使用良好工具的机会,因为它们只能在Python 3上运行,并且您将减慢依赖您并与您协作的人的工作速度。
重新审视了一下 Python2 的 EOL,发现即使在2020年1月1日之后,即使发现Python2存在漏洞,基本上也会被忽视,所以继续使用它的风险非常高。
当然,我认为各种供应商可能会继续个别提供支持,但是他们也会逐步停止支持,所以最终还是需要采取某种应对措施。
在我们的基础设施环境中,也发现了几个存在Python2的情况,所以我们希望能够告诉您我们为了脱离Python2所做出的应对措施。
AWS Lambda: 亚马逊云计算服务 Lambda
AWS Lambda支持Python 2.7运行时。
根据运行时支持政策,如果您正在使用即将在60天内被废弃的运行时来运行Lambda函数,他们似乎会通过邮件通知您,但是目前(截至12/6)还没有收到确认,所以在EOL后仍然可以使用。
在我们的团队中,我们使用Lambda的Python/Go/Node.js运行时来进行各种CloudWatch事件的Slack通知和定期执行脚本。不过,关于Python,大部分情况下我们使用的是Python3版本。
只是,我们在Lambda上使用ClamAV作为针对上传到S3的文件的防病毒软件,而且它只能在Python2.7上运行。原因是我们使用了一个名为bucket-antivirus-function的工具来创建Lambda用的zip文件,但它只能生成Python2.7版本的文件。但是,目前已经有一个关于切换到Python3的PR,所以我们决定观察一段时间。
独立的 Python 脚本
在服务器上将一些小任务脚本化成Python非常方便。尽管我之前没有任何Python经验,但现在我意识到用Python编写调用AWS CLI的Shell脚本和使用boto3库并没有太大的差异,学习成本很低。这些脚本都使用了shebang指定为Python3,所以基本上不需要做任何额外的兼容处理。
Ubuntu AMI (Amazon Machine Image) → Ubuntu的亚马逊机器镜像
格罗维斯的产品基本上都在基于 Ubuntu 的 AMI 上运行,并使用 Ansible 和 Packer 进行配置管理。此外,我们使用的 Ubuntu 版本是 16.04 或 18.04,这两个版本都默认没有安装 Python2。
然而,所有运行中的实例(AMI)都已安装了 Python2。
$ which python2.7
/usr/bin/python2.7
由于有几个原因,我们逐一解决了它们。
正在运行 Ansible 的 Python
在使用Packer创建AMI时,我们使用ansible-local作为Provisioner。所以,我们使用shell provisioner事先安装Ansible。但是在这种方法中遇到了问题。
"provisioners": [
{
"type": "shell",
"inline": [
"sudo apt-add-repository -y ppa:ansible/ansible",
"sudo apt-get update",
"sudo apt-get -y install ansible"
]
}
]
由于apt提供的Ansible包本身依赖于Python2,所以通过apt-get安装会导致它在Python2.7上运行。
$ apt-cache depends ansible
ansible
Depends: python-crypto
Depends: python-jinja2
Depends: python-paramiko
Depends: python-pkg-resources
Depends: python-yaml
Depends: <python:any>
python
Depends: <python:any>
python
Depends: python-httplib2
Depends: python-netaddr
Recommends: python-selinux
Suggests: sshpass
$ ansible --version
ansible 2.9.1
config file = /etc/ansible/ansible.cfg
configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/dist-packages/ansible
executable location = /usr/bin/ansible
python version = 2.7.12 (default, Oct 8 2019, 14:14:10) [GCC 5.4.0 20160609]
作为一种对策,我已经根据以下页面进行了修改,建议通过 pip3 进行安装。
"provisioners": [
{
"type": "shell",
"inline": [
"sudo apt-get update",
"sudo apt-get -y install python3-pip",
"sudo pip3 install ansible"
]
}
]
$ ansible --version
ansible 2.9.1
config file = /etc/ansible/ansible.cfg
configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/local/lib/python3.5/dist-packages/ansible
executable location = /usr/local/bin/ansible
python version = 3.5.2 (default, Oct 8 2019, 13:06:37) [GCC 5.4.0 20160609]
确认到Python的路径和版本已更改,因此一切正常。
在 Ansible Playbook 中的任务
由于已经使用了数年,因此检查了通过pip2安装的软件包并迁移到pip3。
另外,还检查了通过apt模块安装的软件包,以确保其中没有依赖于Python2的项。
- name: Install packages from apt
apt:
name:
- python3-pip # OK
- software-properties-common # OK
- htop # OK
- python-pip # NG
- python-properties-common # NG
- dstat # NG
- name: Install packages from pip2
pip:
name:
- boto
- awscli
executable: pip2 # NG
在执行各个任务时使用的 Python
基于之前的更改,我们运行了Packer,但是出现了“/usr/bin/python: not found”错误的任务。
Ansible有一个功能可以指定用于执行任务的Python解释器,但是由于默认情况下指定搜索/usr/bin/python,因此这就是问题的原因。为了解决这个问题,我们明确指定了以下变量。
ansible_python_interpreter=/usr/bin/python3
根据↑的信息,可以将ansible.cfg、清单文件和命令执行时的选项作为指定。
通过以上的处理,已成功将 Python2 从 AMI 中移除。
$ which python2.7
$ which python
Ubuntu对Python2的支持
顺便说一句,Ubuntu自身也在努力剥离对Python2的依赖。
Ubuntu有以下四个软件库,但在16.04和18.04中,Python2本身就包含在主要库中,因此即使在EOL后,仍可以从官方软件库进行安装。
(当然,我认为这并不意味着用户应积极使用Python2…)
- https://help.ubuntu.com/community/Repositories/Ubuntu
四个主要的软件仓库是:
主要(Main)- 官方支持的自由开源软件。
宇宙(Universe)- 社区维护的自由开源软件。
限制(Restricted)- 设备用的专有驱动程序。
多元宇宙(Multiverse)- 受版权或法律问题限制的软件。
据说下一版的长期支持版 Ubuntu 20.04(代号 “Focal Fossa”)将彻底移除 Python2,不过实际上会怎样呢,让人十分好奇呢…!
-
- https://gihyo.jp/admin/clip/01/ubuntu-topics/201911/01
- https://gihyo.jp/admin/clip/01/ubuntu-topics/201911/29