我对Ansible还是很陌生,但是它似乎比bash脚本更好,可以从远程服务器上的源代码安装程序...

从我工作但脆弱的bash脚本开始,我做了一个Ansible脚本,用于git克隆,配置和编译我需要的东西。但是,其中一些来源很大,因此我想包含--depth 1参数。这是一个问题,因为CentOS 7版本的git是1.8.3,如果Ansible不能至少使用git 1.9.1,它将忽略depth命令。显然,对于非系统用途,我也不介意拥有最新的git 2.15,所以...要使git的版本比yum的base / extras / updates仓库中的版本新,发现IUS信息库具有“安全替换”包,可用于git等一些方面。很有帮助的是,有一个Ansible任务集来安装他们的仓库。这是相关的任务:

- name: install IUS release package
   yum:
       name: "https://{{ ius_distribution_abbrev }}{{ ansible_distribution_major_version }}.iuscommunity.org/ius-release.rpm"
       state: present
   when: ansible_os_family == 'RedHat'


但Ansible却使该任务失败:

fatal: [MY_REMOTE_IP_ADDRESS]: FAILED! => {"changed": false, "failed": true,
"msg": "Failed to validate the SSL certificate for centos7.iuscommunity.org:443. 
Make sure your managed systems have a valid CA certificate installed. 
You can use validate_certs=False if you do not need to confirm the servers
identity but this is unsafe and not recommended. Paths checked for this 
platform: /etc/ssl/certs, /etc/pki/ca-trust/extracted/pem, 
/etc/pki/tls/certs, /usr/share/ca-certificates/cacert.org, /etc/ansible. 
The exception msg was: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:579)."}

和python-urllib3软件包已安装,并且安装在yum repos的最新版本上。

根据对github的评论,如果没有python 2.7.9 +,Ansible似乎无法处理SNI以获取正确的SSL证书。但是CentOS 7附带了python 2.7.5。您无法升级它,因为get_url与SSL存在相同的问题,因此您必须下载带有validate_certs=no的python源。更糟糕的是,即使我这样做,也使用make altinstall来放置python 2.7。在/usr/local/bin/中输入14,而无需触摸操作系统python,然后设置ansible_python_interpreter: /usr/local/bin/python2.7,(至少允许get_url正常工作)然后在剧本期间,我被锁定在yum外,因为yum无法处理较新版本的python Ansible试图运行它。


是否有办法在不删除安全功能的情况下使它们正常工作?
是否由于python版本和yum而使CentOS 7使用的工具错误?


评论

更新:可以将ansible_python_interpreter更改为系统python,并在yum模块任务之前/之后立即返回,以避免在将更新的Python版本用于其他Ansible模块时无法调用yum。

#1 楼

虽然确实报告的Python版本没有SNI支持,但我认为RedHat向后移植了它。但是无论如何,如果不是这样,您可以自己做:

yum -y install gcc python-devel libffi-devel openssl-devel
pip install pyopenssl ndg-httpsclient pyasn1


(至少对requests有效,我不确定Ansible。)

从更广泛的角度来看:


但是CentOS 7附带了python 2.7.5。您无法升级它,因为get_url与SSL存在相同的问题,因此您必须下载带有validateate_certs = no的python源。


只有在您使用服务器从SNI重新下载Python。我想他们的大多数镜像都不会。

但是,实际上,您不应该在每台服务器上都编译Python。您应该执行一次操作,要么在冻结为映像的计算机上启动其他计算机,要么将其打包为rpm,然后这些计算机只需下载并安装。这样,您就可以控制下载过程。

更简单:将软件包下载到桌面上(通过经过验证的https)。将其复制到文件存储。从那里下载到您的服务器上。无需每次都直接从python.org下载,而且始终拥有本地副本更为可靠。

#2 楼

我建议您不要重新发明轮子,而要使用已经解决了您所报告的问题的ansible星系角色。

可以使用Geerlingguys git角色在CentOS7上安装最新的git。可以通过发出ansible-galaxy install geerlingguy.git进行安装,然后在角色中包含geerlingguy.git,以便将角色应用于节点。

评论


查看链接中的任务,它使用get_url检索git源,这意味着虽然它可能是专门针对git的一种解决方法(如果该存储库未使用SNI来获取证书),则它不会回答我如何更广泛地与Ansible安全地工作而又不破坏百胜的问题。不过,您的答案是很好的建议,我今天将尝试使用。

–TheAtomicOption
17年11月27日在17:14