前言
使用阿里云·云效流水线的部署能力时,由于新机器使用的系统时CentOS8.5默认不带python2,但是在云效添加部署机器的过程,云效的Agent需要依赖python2环境,就必须再安装一个python2,目前python2的最新版本是2.7.18(April 20, 2020)。记录下安装过程和添加Agent时遇到ssl包问题。
准备环境
安装devtoolset
yum groupinstall "Development tools"
安装编译Python需要的包
yum install zlib-devel
yum install bzip2-devel
yum install openssl-devel
yum install ncurses-devel
yum install sqlite-devel
安装 python2.7
1. 下载
从官网中可以看到 Python 2.7.18 is the last release of Python 2,选择 Gzipped source tarball 源码压缩文件,下载到部署机器上。
2. 解压
将源代码压缩包移动到目录/usr/local/my/
,执行命令解压。
tar -zxf Python-2.7.18.tgz
3. 编译安装
进入到解压之后的文件夹Python-2.7.18
。
./configure --prefix=/usr/local
make && make altinstall
检查编译是否成功。
cd /usr/local/my/Python-2.7.18
./python -V
4. 建立软连接
ln -s /usr/local/my/Python-2.7.18/python /usr/bin/python
如果已经有python的软连接,建议先删掉原来的软连接,再重新建立。
编译安装 pip
安装epel依赖
首先需要安装epel依赖。
sudo yum -y install epel-release
下载编译pip2.7
从 bootstrap.pypa.io
下载2.7版本的pip安装文件。
curl https://bootstrap.pypa.io/pip/2.7/get-pip.py -o get-pip.py
运行该文件
python get-pip.py
可以验证下,pip是否成功安装,使用命令pip list
和 pip3 list
如果都可以正常运行有包内容输出,说明机器上python2和python3环境的pip都是可用的。
ssl 包不可用
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/usr/local/my/Python-2.7.18/Lib/ssl.py", line 98, in <module>
import _ssl # if we can't import it, let the error propagate
ImportError: No module named _ssl
openssl-devel 包缺失,建议您按照 https://help.aliyun.com/document_detail/59302.html 的提示来安装必要工具包
1. 获取openssl
wget http://www.openssl.org/source/openssl-1.0.2a.tar.gz
2. 解压编译
# 解压
tar -xzvf openssl-1.0.2a.tar.gz
# 重命名一下
mv openssl-1.0.2a openssl
# cd到openssl的目录,运行config
./config --prefix=/usr/local --openssldir=/usr/local/my/openssl
# 编译
make && make install
3. 修改python源代码
修改文件 Python-2.7.18/setup.py
#Detect SSL support for the socket module (via _ssl)
search_for_ssl_incs_in = [
'/usr/local/ssl/include',
'/usr/local/include/openssl', #增加该行内容
'/usr/contrib/ssl/include/'
]
# python
修改文件 Python-2.7.18/Modules/Setup
# Socket module helper for socket(2)
_socket socketmodule.c timemodule.c # 取消注释
# Socket module helper for SSL support; you must comment out the other
# socket line above, and possibly edit the SSL variable:
#SSL=/usr/local/ssl
_ssl _ssl.c \ # 取消注释
-DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \
-L$(SSL)/lib -lssl -lcrypto