我不会说换了十个版本的openssl,换了三个版本的python,最后还是换操作系统搞定的!!!
1、 前言
在进行安装ansible的时候,开始安装的操作系统版本为RHEL6.2,但是怎么也不能安装上,走了很多的弯路,从而在此进行记录。
2、 安装openssl
2.1 系统环境
系统环境如下所示:
[root@RHAN ~]#cat /etc/redhat-release (操作系统版本)
Red HatEnterprise Linux Server release 6.2 (Santiago)
[root@RHAN ~]#rpm -qa openssl(openssl版本)
openssl-1.0.0-20.el6.x86_64
[root@RHAN ~]#python -V(python版本)
Python 2.6.6
在此主要查看的是python和openssl的版本,因为在安装ansible的时候,会安装依赖模块cryptography,而模块cryptography依赖于操作系统的openssl的版本,一般的cryptography的不支持openssl为1.0.0版本,从而需要对openssl进行升级,如果使用系统自带的openssl和openssl-devel,那么是无法安装模块cryptography,从而无法安装ansible。
2.2 源码编译openssl
在进行源码编译openssl的时候,需要注意的是,官方上面的安装手册可能无法适用于任何操作系统,从而使用如下的参数进行安装:
[root@RHAN ~]#tar -xf openssl-1.1.0d.tar.gz(解压)
[root@RHAN ~]#cd openssl-1.1.0d
[root@RHANopenssl-1.1.0d]# ./config --prefix=/usr/local/ssl --openssldir=/usr/local/ssl -fPIC shared (编译,安装的目录为ssl,并且openssl的目录页是ssl,同时创建共享库和静态库)
[root@RHANopenssl-1.1.0d]# make && make install (安装)
[root@RHAN ~]#ls -l /usr/local/ssl/(安装目录下的文件)
total 52
drwxr-xr-x. 2root root 4096 Feb 6 12:22 bin
drwxr-xr-x. 2root root 4096 Feb 6 12:22 certs
drwxr-xr-x. 3root root 4096 Feb 6 12:22 include
drwxr-xr-x. 4root root 4096 Feb 6 12:22 lib
drwxr-xr-x. 2root root 4096 Feb 6 12:22 misc
-rw-r--r--. 1root root 10771 Feb 6 12:22 openssl.cnf
-rw-r--r--. 1root root 10771 Feb 6 12:22openssl.cnf.dist
drwxr-xr-x. 2root root 4096 Feb 6 12:22 private
drwxr-xr-x. 4root root 4096 Feb 6 12:24 share
[root@RHAN ~]#cd /usr/local/ssl/bin/ (查看openssl的版本)
[root@RHAN bin]#./openssl version(openssl无法正确运行,无法加载共享类库)
./openssl: error while loading shared libraries: libssl.so.1.1:cannot open shared object file: No such file or directory
[root@RHAN lib]#pwd
/usr/local/ssl/lib
[root@RHAN lib]#echo `pwd`>/etc/ld.so.conf.d/openssl.conf (设置openssl的类库路径)
[root@RHAN lib]#ldconfig(让类库路径生效)
[root@RHAN lib]#../bin/openssl version (查看openssl的版本)
OpenSSL1.1.0d 26 Jan 2017
不要将新安装的包拷贝到/usr/lib64/中,否则sshd无法启动,如下所示:
[root@RHAN lib]# ls -l /usr/lib64/openssl/ (老版本的openssl的类库文件,存在的路径为/usr/lib64/中)
total 4
drwxr-xr-x. 2root root 4096 Jan 24 09:23 engines
[root@RHAN lib]#cp * /usr/lib64/(将新安装的openssl类库文件拷贝,发现sshd直接断开,或者是sshd服务无法启动)
cp: omittingdirectory `engines-1.1'
cp: overwrite`/usr/lib64/libcrypto.so'? y
Connectionclosed by foreign host.
登录系统查看的时候发现,sshd无法启动:
在一般的安装步骤中,是没有此项拷贝的,也就是说无需将lib文件拷贝到/usr目录中,主要是在安装ansible的时候,查找的类库路径为此目录,那么拷贝openssl到此目录中,和老版本的openssl冲突,从而导致sshd无法启动。
在一般的安装完成之后,需要将相关的头文件做成软连接,如下所示(不做):
[root@RHAN ~]#ln -s /usr/local/ssl/include/openssl/ /usr/include/openssl(头文件链接)
在此目录下,是存在老版本的openssl头文件,从而需要进行链接,否则也没啥太大用处,主要在后面进行安装python或者其他的时候,指定查找openssl的路径。
3 源码安装python
在进行源码安装python的时候,查看openssl版本:
[root@RHAN~]# python -c "import ssl; printssl.OPENSSL_VERSION" (查看是否使用新安装的openssl)
OpenSSL1.1.0d 26 Jan 2017
3.1 configure出现告警
在进行configure的时候,出现告警如下(可以直接无视,出现告警也是直接可以正常进行):
checking for--with-cxx-main=<compiler>... no
checking forg++... no
configure:WARNING:
By default, distutilswill build C++ extension modules with "g++".
If this is not intended, then set CXX on theconfigure command line.
主要是没有指定的编译器,从而可以用如下的方式来进行指定:
[root@RHANPython-2.7.13]#./configure --prefix=/usr/local/python --with-cxx-main=/usr/bin/gcc(指定编译器来进行编译)
3.2 make的时候出现无法编译ssl模块
在make的时候,出现错误如下:
Failedto build these modules:
_hashlib _ssl
[root@RHANPython-2.7.13]# ls -l Modules/Setup.dist (配置文件)
-rw-r--r--. 11000 1000 18479 Dec 17 15:05 Modules/Setup.dist
214 #_socketsocketmodule.c timemodule.c(取消注释)
215
216 # Socketmodule helper for SSL support; you must comment out the other
217 # socketline above, and possibly edit the SSL variable:
218#SSL=/usr/local/ssl(取消注释,安装的最新版本的openssl路径)
219 #_ssl _ssl.c\(取消注释)
220 # -DUSE_SSL -I$(SSL)/include-I$(SSL)/include/openssl \(取消注释)
221 # -L$(SSL)/lib -lssl -lcrypto(取消注释)
修改之后如下所示:
214 _socketsocketmodule.c timemodule.c
215
216 # Socketmodule helper for SSL support; you must comment out the other
217 # socketline above, and possibly edit the SSL variable:
218SSL=/usr/local/ssl
219 _ssl _ssl.c\
220 -DUSE_SSL -I$(SSL)/include-I$(SSL)/include/openssl \
221 -L$(SSL)/lib -lssl -lcrypto
主要是用来指定openssl类库的路径,从而能成功安装ssl等模块。
4、 安装ansible
4.1 安装cryptography出错
在安装cryptography的时候,出现错误如下:
creating build/temp.linux-x86_64-2.7/build/temp.linux-x86_64-2.7
gcc-pthread -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall-Wstrict-prototypes -fPIC -I/usr/local/python/include/python2.7 -c build/temp.linux-x86_64-2.7/_openssl.c -obuild/temp.linux-x86_64-2.7/build/temp.linux-x86_64-2.7/_openssl.o
build/temp.linux-x86_64-2.7/_openssl.c:2078: warning: functiondeclaration isn?. a prototype
build/temp.linux-x86_64-2.7/_openssl.c:2079: warning: functiondeclaration isn?. a prototype
build/temp.linux-x86_64-2.7/_openssl.c:2080: warning: functiondeclaration isn?. a prototype
build/temp.linux-x86_64-2.7/_openssl.c:2105: warning: functiondeclaration isn?. a prototype
build/temp.linux-x86_64-2.7/_openssl.c:2163: warning: functiondeclaration isn?. a prototype
build/temp.linux-x86_64-2.7/_openssl.c:In function ?.cffi_const_CMS_DEBUG_DECRYPT?.
build/temp.linux-x86_64-2.7/_openssl.c:8193: error:?.MS_DEBUG_DECRYPT?.undeclared (first use in this function)
build/temp.linux-x86_64-2.7/_openssl.c:8193: error: (Each undeclaredidentifier is reported only once
build/temp.linux-x86_64-2.7/_openssl.c:8193:error: for each function it appears in.)
error:command 'gcc' failed with exit status 1
----------------------------------------
Command "/usr/bin/python -u -c "importsetuptools,tokenize;__file__='/tmp/pip-HCuemf-build/setup.py';exec(compile(getattr(tokenize,'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))"install --record /tmp/pip-YsGgK9-record/install-record.txt --single-version-externally-managed--compile" failed with error code 1 in /tmp/pip-HCuemf-build/
主要是openssl的版本不匹配,从而需要指定新的版本的ssl的路径,设置环境变量如下所示:
[root@RHAN ~]# exportCPPFLAGS="-I/usr/local/ssl/include/" (指定openssl头文件路径)
[root@RHAN ~]# export LDFLAGS="-lssl -lcrypto-Wl,-rpath=/usr/local/ssl/lib/"(指定openssl的库文件路径)
4.2 无法找到-lssl
无法找到ssl的路径,可能出现如下报错:
/usr/bin/ld: cannot find -lssl
collect2:ld returned 1 exit status
error:command 'gcc' failed with exit status
gcc -pthread -shared build/temp.linux-x86_64-2.7/build/temp.linux-x86_64-2.7/_openssl.o-lssl -lcrypto -obuild/lib.linux-x86_64-2.7/cryptography/hazmat/bindings/_openssl.so
/usr/bin/ld: cannot find -lssl
collect2:ld returned 1 exit status
error:command 'gcc' failed with exit status 1
主要也是没有找到ssl的路径,从而执行设置环境变量即可:
[root@RHAN ~]# exportCPPFLAGS="-I/usr/local/ssl/include/" (指定openssl头文件路径)
[root@RHAN ~]# export LDFLAGS="-lssl -lcrypto-Wl,-rpath=/usr/local/ssl/lib/"(指定openssl的库文件路径)
4.3 未能正确安装python
当没有正确安装python,可能出现如下错误:
[root@RHAN pip-8.1.0]# python setup.py install
ERROR:root:code for hash md5was not found.
Traceback (most recent call last):
File"/usr/local/python/lib/python2.7/hashlib.py", line 147, in<module>
globals()[__func_name] = __get_hash(__func_name)
主要是在make的时候,没有编译正确的扩展模块,也就是openssl的头文件未找到,如果是本机的,直接yum安装openssl-devel即可,如果是自己安装的,那么就必须重新安装python,并且加入ssl的编译。
4.4 安装模块出现运行时错误
在安装模块的时候,出现如下错误:
[root@RHanible install]# pip installpycrypto-2.6.1.tar.gz
RuntimeError: autoconf error
----------------------------------------
Command "/usr/bin/python -u -c "importsetuptools, tokenize;__file__='/tmp/pip-vz034B-build/setup.py';
exec(compile(getattr(tokenize, 'open',open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))"
install --record /tmp/pip-FIiSr7-record/install-record.txt--single-version-externally-managed --compile"
failed witherror code 1 in /tmp/pip-vz034B-build/
主要是未安装gcc,如下即可:
[root@RHAN ~]# # yum -y groupinstall"Development tools"
5 排错
当出现可能是因为类库的问题的时候,那么可以使用strace -f命令来查看查找类库的路径,也就是看类库路径的位置。