当在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。

广告
将在 10 秒后关闭
bannerAds