背景:
被控端(包括管理端区岗,客戶端谨娜,被管理端)的python升級到新版本之后洼哎,使用ansible報錯
內網(wǎng)機器無法連接網(wǎng)絡酸茴,需要使用pip離線安裝的方式
原因:
默認使用yum
安裝的ansible
是基于python2.7
版本分预,很多功能指令都是調用python
完成的,默認情況下會調用/usr/bin/python
下的版本薪捍。
python
升級至新的版本之后笼痹,會增加新的模塊、特性酪穿,調用方式也不一樣凳干。
因此,每個版本的python
升級之后被济,都需要將ansible
升級至對應的版本救赐,直接使用pip install ansible
即可。
關鍵詞:
內網(wǎng)環(huán)境
離線安裝升級openssl
離線安裝升級openssh
離線安裝升級python
離線安裝升級ansible
pip安裝升級
ModuleNotFoundError: No module named '_ctypes'
提示:
以下操作均使用root
賬戶操作
一只磷、本地升級測試
(一)经磅、要求:
1.找一臺自己的虛擬機(隨便一臺)泌绣,可以聯(lián)網(wǎng)就行
2.環(huán)境一致(操作系統(tǒng)大版本);
(二)预厌、開始安裝升級
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/
# 環(huán)境檢查,如果缺少那個就安裝那個
./config --prefix=/usr/local/ssl --shared
# 編譯安裝轧叽,沒有出現(xiàn)error錯誤就不要管
make && make install
# 庫文件
echo '/usr/local/ssl/lib' >> /etc/ld.so.conf
# 查看版本
ldconfig -v
升級成功之后苗沧,可以將編譯好的openssl-1.1.1w打包到內網(wǎng)機器上,等下直接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
# 下載源碼包崎页,根據(jù)需求
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/
# 環(huán)境檢查,需要添加`--with-openssl`選項腰埂,寫正常路徑,不然等下`pip`安裝軟件報錯
./configure --prefix=/usr/local/python3 --with-openssl=/usr/local/ssl
# 編譯安裝
make && make install
添加二進制文件到環(huán)境變量所識別的路徑里
# 這些都是自帶的舊版本的軟鏈接文件蜈膨,刪除沒有影響
rm -rf /usr/bin/pip
rm -rf /usr/bin/python
# 給剛剛編譯生成的可行性二進制文件創(chuàng)建軟鏈接
# /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.驗證以及細節(jié)處理
# 查看相關模塊是否正常
# ansible命令依賴這個模塊,這一步?jīng)]有成功翁巍,往后也是白做
# 正確安裝之后的輸出如下
[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'
>>>
# 出現(xiàn)這種的建議重新編譯安裝,查看系統(tǒng)環(huán)境缺少的依賴灶壶,比如libffi-devel軟件包
# 將編譯好的Python3源碼包打包肝断,等下在內網(wǎng)機器直接`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所需要的離線包胚宦,等下要拿到內網(wǎng)機器上升級
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所需要的離線包首有,等下要拿到內網(wǎng)機器上升級
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
的時候環(huán)境缺少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環(huán)境中缺少_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蝗锥。
二跃洛、內網(wǎng)機器上操作
(一)、上傳安裝包
# 安裝包目錄
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
# 創(chuàng)建軟鏈接
''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
# 創(chuàng)建新版本的軟鏈接
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/*
# 創(chuàng)建軟鏈接
ln -s /usr/local/python3/bin/ansible /bin/ansible
ln -s /usr/local/python3/bin/ansible-playbook /bin/ansible-playbook
# 查看ansible版本是否符合python版本
ansible --version