升级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