在使用自动化运维工具ansible来管理服务器的时候,,一些比较老的机器可能因为系统自带的python版本较低(2.6之前),缺少ansible依赖的Simplejson模块。导致无法正常管理该服务器。这种情况下我们有两种方法去解决它:1.额外在单独安装Simplejson模块。 2.升级python版本至2.6及以上版本。这里我们记录下升级python版本的方法。
一、安装依赖包
1 |
[root@imzcy ~]# yum -y install gcc zlib-devel |
一定要提前安装好zlib-devel包,然后再编译安装python包,不然哪怕新版的python都安装好了。使用ansible管理该节点也还会报(self._decompressor = zlib.decompressobj(-15)\r\nAttributeError: 'NoneType' object has no attribute 'decompressobj'\r\n)这个错误,如下所示:
1 2 3 4 5 6 7 8 9 |
[root@imzcy ~]# ansible 192.168.109.129 -m ping 192.168.109.129 | FAILED! => { "changed": false, "module_stderr": "Shared connection to 192.168.109.129 closed.\r\n", "module_stdout": "Traceback (most recent call last):\r\n File \"/root/.ansible/tmp/ansible-tmp-1539181556.06-180464010937419/ping.py\", line 123, in <module>\r\n f.write(z.read('ansible_module_ping.py'))\r\n File \"/usr/local/lib/python2.7/zipfile.py\", line 931, in read\r\n return self.open(name, \"r\", pwd).read()\r\n File \"/usr/local/lib/python2.7/zipfile.py\", line 1006, in open\r\n close_fileobj=should_close)\r\n File \"/usr/local/lib/python2.7/zipfile.py\", line 526, in __init__\r\n self._decompressor = zlib.decompressobj(-15)\r\nAttributeError: 'NoneType' object has no attribute 'decompressobj'\r\n", "msg": "MODULE FAILURE", "rc": 0 } [root@imzcy ~]# |
二、编译安装下载好的python包
1 2 3 4 5 |
[root@imzcy ~]# tar zxf Python-2.7.5.tgz [root@imzcy ~]# cd Python-2.7.5 [root@imzcy Python-2.7.5]# ./configure [root@imzcy Python-2.7.5]# make [root@imzcy Python-2.7.5]# make install |
安装完后不会修改现在的配置,默认还是2.4.3
1 2 3 |
[root@imzcy ~]# python -V Python 2.4.3 [root@imzcy ~]# |
三、修改默认python版本为2.7.5
3.1、查找刚2.7.5版本python的安装位置
1 2 3 4 5 |
[root@imzcy ~]# find / -name python2.7 /usr/local/bin/python2.7 /usr/local/lib/python2.7 /usr/local/include/python2.7 [root@imzcy ~]# |
3.2、查看系统当前默认调用python路径
可以看到我们正常使用python命令的话,首先调用的是/usr/bin/python这个,但是这个python其实是一个符号链接,指向了当前目录下的python2.4
1 2 3 4 5 6 7 |
[root@imzcy ~]# whereis python python: /usr/bin/python2.4 /usr/bin/python /usr/lib/python2.4 /usr/local/bin/python2.7-config /usr/local/bin/python /usr/local/bin/python2.7 /usr/local/lib/python2.7 /usr/include/python2.4 /usr/share/man/man1/python.1.gz [root@imzcy ~]# [root@imzcy ~]# ll /usr/bin/python lrwxrwxrwx 1 root root 18 10-15 15:21 /usr/bin/python -> /usr/bin/python2.4 [root@imzcy ~]# |
3.3、删除指向旧版本python的符号链接,新建符号链接指向新版本的python
1 2 3 4 5 6 |
[root@imzcy ~]# rm -rf /usr/bin/python [root@imzcy ~]# ln -s /usr/local/bin/python2.7 /usr/bin/python [root@imzcy ~]# python -V Python 2.7.5 [root@imzcy ~]# |
四、解决修改默认python版本导致的问题(如:yum不能使用)
按照上面3所示的方法修改完默认python版本后,再使用yum时可能会报以下错误:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
[root@imzcy ~]# yum clean all There was a problem importing one of the Python modules required to run yum. The error leading to this problem was: No module named yum Please install a package which provides this module, or verify that the module is installed correctly. It's possible that the above module doesn't match the current version of Python, which is: 2.7.5 (default, Oct 15 2018, 18:11:16) [GCC 4.1.2 20080704 (Red Hat 4.1.2-52)] If you cannot solve this problem yourself, please go to the yum faq at: http://wiki.linux.duke.edu/YumFaq [root@imzcy ~]# |
上面这种情况,我们只需要修改下yum默认调用的python版本指向旧版的python即可。如下所示:
4.1、查看yum命令位置
1 2 3 |
[root@imzcy ~]# whereis yum yum: /usr/bin/yum /etc/yum.conf /etc/yum /usr/share/man/man8/yum.8.gz [root@imzcy ~]# |
4.2、使用file命令可以看出yum是一个python写的程序
1 2 3 |
[root@imzcy ~]# file /usr/bin/yum /usr/bin/yum: python script text executable [root@imzcy ~]# |
4.3、直接修改yum首行调用的python即可
1 2 3 4 |
[root@imzcy ~]# vi /usr/bin/yum #!/usr/bin/python 修改为 #!/usr/bin/python2.4 |
4.4、再次尝试,发现yum已经恢复正常
1 2 3 4 5 6 |
[root@imzcy ~]# yum clean all Loaded plugins: katello, product-id, security, subscription-manager Updating certificate-based repositories. Unable to read consumer identity Cleaning up Everything [root@imzcy ~]# |