前言

使用阿里云·云效流水线的部署能力时,由于新机器使用的系统时CentOS8.5默认不带python2,但是在云效添加部署机器的过程,云效的Agent需要依赖python2环境,就必须再安装一个python2,目前python2的最新版本是2.7.18(April 20, 2020)。记录下安装过程和添加Agent时遇到ssl包问题。

准备环境

安装devtoolset

  1. 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 源码压缩文件,下载到部署机器上。
image.png

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 listpip3 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

4. 重新编译 python 见上文