当在ansible中出现SNI错误(SSL证书不属于*)时的处理方法
总结
如果在CentOS 7上通过EPEL从RPM安装Ansible,在尝试使用get_url从GitHub获取文件时会遇到证书错误。以下是解决方法。
出现错误的情况
进行yum更新。
yum -y update
将Ansible从epel安装。
$ yum install -y epel-release
$ yum install -y ansible
已安装Ansible 1.9.4.
playbook 使用 get_url 获取 GitHub 的 TOP 页面。
(将文件名设为 playbook.yml)
- hosts: all
connection: local
environment:
https_proxy: "{{ lookup('env', 'https_proxy') }}"
tasks:
- name: Get github
get_url:
url: "https://github.com/"
dest: /tmp/github.top
主机定义为本地主机。
(将文件名定义为hosts)
localhost
执行剧本。
ansible-playbook -i hosts playbook.yml
这个错误是指证书不是来自 github.com。
TASK: [Get github] ************************************************************
failed: [localhost] => {"failed": true}
msg: SSL Certificate does not belong to github.com. Make sure the url has a certificate that belongs to it or use validate_certs=False (insecure)
FATAL: all hosts have already failed -- aborting
错误的原因
这里有一条记录。
https://github.com/ansible/ansible/issues/11579
在Github上,使用了SNI協議。
需要將Ansible升級到支持SNI的版本(2系)。
請注意,雖然上述鏈接要求使用Python 2.7.9或以上版本,但在2.7.5(CentOS 7的預安裝版本)中也可以正常運行。由於這有些可疑,所以我們將安裝Python 2.7.11。
处理/对待
Ansible的安装版本为v2.0.0.1-1。
首先,从Ansible源代码创建RPM软件包,或者安装安装Ansible所需的工具。
$ yum install -y epel-release
$ yum install -y rpm-build python2-devel python-setuptools PyYAML python-jinja2 python-paramiko python-six python-httplib2 python-keyczar sshpass
创建并安装 RPM 软件包。
$ cd /usr/src
$ wget https://github.com/ansible/ansible/releases/download/v2.0.0.1-1/ansible-2.0.0.1.tar.gz
$ tar xvf ansible-2.0.0.1.tar.gz
$ cd ansible-2.0.0.1
$ make rpm OFFICIAL=yes
$ rpm -Uvh ./rpm-build/ansible-*.noarch.rpm
Python 2.7.11的安装
因为我个人从未使用过python的版本管理工具,所以我只会简单地从源代码进行安装。
将其安装到 /opt/python。
$ mkdir /opt/python
$ cd /usr/src
$ wget https://www.python.org/ftp/python/2.7.11/Python-2.7.11.tgz
$ tar xvf Python-2.7.11.tgz
$ cd Python-2.7.11
$ ./configure --prefix=/opt/python
$ make
$ make install
$ python -V
Python 2.7.5
$ /opt/python/bin/python -V
Python 2.7.11
在playbook中指定要使用的python版本。
在 playbook.yml 文件的 tasks 部分的开头添加以下内容。
- name: set ansible_python_interpreter
set_fact: ansible_python_interpreter="/opt/python/bin/python"
重新执行playbook
可以从GitHub上获取!
TASK [Get github] **************************************************************
changed: [localhost]
Vagrantfile的释义。
我已经在此处列出了用于构建上述环境(CentOS 7 Ansible 2.0)的Vagrantfile。