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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章