升级ansible版本【转】

背景:
被控端(包括管理端,客户端,被管理端)的python升级到新版本之后,使用ansible报错
内网机器无法连接网络,需要使用pip离线安装的方式
原因:
默认使用yum安装的ansible是基于python2.7版本,很多功能指令都是调用python完成的,默认情况下会调用/usr/bin/python下的版本。
python升级至新的版本之后,会增加新的模块、特性,调用方式也不一样。
因此,每个版本的python升级之后,都需要将ansible升级至对应的版本,直接使用pip install ansible即可。

关键词:
内网环境
离线安装升级openssl
离线安装升级openssh
离线安装升级python
离线安装升级ansible
pip安装升级
ModuleNotFoundError: No module named '_ctypes'

提示:
以下操作均使用root账户操作

一、本地升级测试

(一)、要求:

1.找一台自己的虚拟机(随便一台),可以联网就行
2.环境一致(操作系统大版本);

(二)、开始安装升级

1.先安装升级openssl,因为升级python需要依赖openssl(pip需要使用)

# 安装一些依赖包
yum -y install gcc make
# 个人习惯将源码包保存目录
cd /usr/local/src
# 下载包
wget https://www.openssl.org/source/openssl-1.1.1w.tar.gz
# 解压
tar xf openssl-1.1.1w.tar.gz
cd openssl-1.1.1w/
# 环境检查,如果缺少那个就安装那个
./config --prefix=/usr/local/ssl --shared
# 编译安装,没有出现error错误就不要管
make && make install
# 库文件
echo '/usr/local/ssl/lib' >> /etc/ld.so.conf
# 查看版本
ldconfig -v

升级成功之后,可以将编译好的openssl-1.1.1w打包到内网机器上,等下直接make install即可。

cd /usr/local/src
tar cf openssl-1.1.1w-make.tar openssl-1.1.1w

2.安装升级python3

此方法试用源码包安装或者升级

# 先行解决依赖
yum -y install libffi-devel

# 源码包放置目录
cd /usr/local/src
# 下载源码包,根据需求
wget https://www.python.org/ftp/python/3.12.0/Python-3.12.0.tgz
# 解压
tar xf Python-3.12.0.tgz
cd Python-3.12.0/
# 环境检查,需要添加`--with-openssl`选项,写正常路径,不然等下`pip`安装软件报错
./configure --prefix=/usr/local/python3 --with-openssl=/usr/local/ssl
# 编译安装
make && make install

添加二进制文件到环境变量所识别的路径里

# 这些都是自带的旧版本的软链接文件,删除没有影响
rm -rf   /usr/bin/pip
rm -rf   /usr/bin/python
# 给刚刚编译生成的可行性二进制文件创建软链接
# /bin 目录是usr/bin 目录的软件,都是同一个目录
ln -s /usr/local/python3/bin/pip3  /usr/bin/pip
ln -s /usr/local/python3/bin/python3  /usr/bin/python3
ln -s /usr/local/python3/bin/python3  /usr/bin/python
# 查看版本
python -V
# 安装成功

3.验证以及细节处理

# 查看相关模块是否正常
# ansible命令依赖这个模块,这一步没有成功,往后也是白做
# 正确安装之后的输出如下
[root@centos7 Python-3.12.0]# python
Python 3.12.0 (main, Dec 21 2023, 11:33:45) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import _ctypes
>>> 
# 安装成功,但是缺少必要的模块
[root@centos7 ~]# python
Python 3.12.0 (main, Nov 21 2023, 10:49:41) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import _ctypes
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named '_ctypes'
>>> 
# 出现这种的建议重新编译安装,查看系统环境缺少的依赖,比如libffi-devel软件包

# 将编译好的Python3源码包打包,等下在内网机器直接`make install`
tar cf Python-3.12.0-make.tar Python-3.12.0

python升级后,会导致yum不可用的解决办法

注意:因为升级python版本,会导致yum命令无法直接使用,可以修改命令脚本的第一行,指明要使用旧python作为解释器

# 两个文件都需要修改
sed -i 's/python/python2.7/g' /usr/bin/yum
sed -i 's/python/python2.7/g' /usr/libexec/urlgrabber-ext-down

不然后报以下的错误:

[root@centos7 ~]# yum -y install libffi-devel
  File "/bin/yum", line 30
    except KeyboardInterrupt, e:
           ^^^^^^^^^^^^^^^^^^^^
SyntaxError: multiple exception types must be parenthesized

[root@centos7 ~]# yum makecache 
已加载插件:langpacks, product-id, search-disabled-repos, subscription-manager

This system is not registered with an entitlement server. You can use subscription-manager to register.

base                                                                                                    | 3.6 kB  00:00:00     
extras                                                                                                  | 2.9 kB  00:00:00     
http                                                                                                    | 3.0 kB  00:00:00     
updates                                                                                                 | 2.9 kB  00:00:00     
  File "/usr/libexec/urlgrabber-ext-down", line 28
    except OSError, e:
           ^^^^^^^^^^
SyntaxError: multiple exception types must be parenthesized
  File "/usr/libexec/urlgrabber-ext-down", line 28
    except OSError, e:
           ^^^^^^^^^^
SyntaxError: multiple exception types must be parenthesized
  File "/usr/libexec/urlgrabber-ext-down", line 28
    except OSError, e:
           ^^^^^^^^^^
SyntaxError: multiple exception types must be parenthesized
  File "/usr/libexec/urlgrabber-ext-down", line 28
    except OSError, e:
           ^^^^^^^^^^
SyntaxError: multiple exception types must be parenthesized
  File "/usr/libexec/urlgrabber-ext-down", line 28
    except OSError, e:
           ^^^^^^^^^^
SyntaxError: multiple exception types must be parenthesized


由于用户取消而退出
[root@centos7 ~]# 

(三)、使用pip安装ansible

注意:先确保本地安装的ansible能使用,所以本地也要安装尝试

# 本地升级pip,-i指定要使用的源
pip install --upgrade pip -i https://mirrors.aliyun.com/pypi/simple/
# 下载升级pip所需要的离线包,等下要拿到内网机器上升级
pip download pip -d /root/pip-upgrade -i https://mirrors.aliyun.com/pypi/simple/

# 本地使用pip安装ansible(这种方式安装会适应python版本)
pip install ansible -i https://mirrors.aliyun.com/pypi/simple/

# 安装好的ansible会保存在跟pip命令所在的目录
ll /usr/local/python3/bin/ansible*

# 可以做个软链接
ln -s /usr/local/python3/bin/ansible /bin/ansible
ln -s /usr/local/python3/bin/ansible-playbook /bin/ansible-playbook

# 下载安装ansible所需要的离线包,等下要拿到内网机器上升级
pip download ansible -d /root/pip-ansible -i https://pypi.tuna.tsinghua.edu.cn/simple

# 打包带走
cd /root/
tar cf pip-ansible.tar pip-*
#下载pip和ansible离线包
#sz pip-ansible.tar

(四)、注意事项

问题一:

pip3 install 时报错“pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.”

原因:
pip命令需要使用openssl进行安全连接,安装python的时候环境缺少openssl

解决办法:
方法一:
可以使用yum命令安装直接安装相关软件包:

# 这种方法安装的一般是低版本的openssl,也没影响
yum -y install openssl*
# 或者
yum -y install gcc libffi-devel zlib* openssl-devel libffi-devel zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make

方法二:
源码包编译安装openssl

具体操作看上面的步骤
不过在安装python的时候需要添加 "--with-openssl=/usr/local/ssl"

问题二:

使用pip安装ansible之后,查看ansible版本提示:
ERROR: No module named '_ctypes'

# pip安装ansible之后查看版本操作
[root@centos7 ~]# ansible --version
ERROR: No module named '_ctypes'

原因:
这个错误通常表示在您的Python环境中缺少_ctypes模块。
_ctypes是Python内置模块,用于与C语言进行交互。

解决办法:
确认_ctypes模块是否存在:请检查您的Python安装中是否存在_ctypes模块。可以在命令行中尝试导入它来确认它是否存在。
在Python交互式解释器中输入以下命令:

[root@centos7 Python-3.12.0]# python
Python 3.12.0 (main, Dec 21 2023, 11:33:45) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import _ctypes
>>> 

更新或重新安装Python:如果上述方法都无效,您可以尝试更新或重新安装Python。

二、内网机器上操作

(一)、上传安装包

# 安装包目录
cd /usr/local/src/
ll *.tar
# 解压
tar xf openssl-1.1.1w-make.tar
tar xf Python-3.12.0-make.tar
tar xf pip-ansible.tar -C /root/

(二)、安装openssl

安装包必须是第一大点打包的包

cd /usr/local/src/openssl-1.1.1w/
# 直接安装就好
make install
# 注意看umask值,不然普通用户没有权限使用openssl命令,需要手动修改权限
chmod -R 755 /usr/local/ssl
# 写入链接库文件
echo '/usr/local/ssl/lib' >> /etc/ld.so.conf
# 使链接库生效
ldconfig -v
# 创建软链接
''mv /usr/bin/openssl /usr/bin/openssl.bak
ln -s /usr/local/ssl/bin/openssl /usr/bin/openssl
''mv /usr/local/bin/openssl /usr/local/bin/openssl.bak
ln -s /usr/local/ssl/bin/openssl /usr/local/bin/openssl
# 查看版本
openssl version

(三)、安装python

cd /usr/local/src/Python-3.12.0/
# 直接安装
make install
# 删除原先的版本
rm -rf   /usr/bin/pip
rm -rf   /usr/bin/python3
rm -rf   /usr/bin/python
# 创建新版本的软链接
ln -s /usr/local/python3/bin/pip3  /usr/bin/pip
ln -s /usr/local/python3/bin/python3  /usr/bin/python3
ln -s /usr/local/python3/bin/python3  /usr/bin/python
# 查看版本
python -V

(三)、升级pip

cd /root/
# pip离线升级
pip install --no-index  --ignore-installed /root/pip-upgrade/*
pip -V

(四)、安装ansible

# pip离线安装ansible
pip install --no-index --find-links=/root/pip-ansible/ --ignore-installed /root/pip-ansible/*
# 创建软链接
ln -s /usr/local/python3/bin/ansible /bin/ansible
ln -s /usr/local/python3/bin/ansible-playbook /bin/ansible-playbook

# 查看ansible版本是否符合python版本
ansible --version

(五)、测试ansible

转自

26.Python3升级之后导致yum安装的ansible无法使用 - 简书
https://www.jianshu.com/p/ad8bcd433abf

posted @ 2024-02-19 17:08  paul_hch  阅读(1)  评论(0编辑  收藏  举报