ansibleがGitHubへのSSL的エラーで動かないのを何とかした話

# 状況

ある日 ansible-galaxy にて使えそうな Ansible role を探して三千里、
さて早速インストールだと思ったら、以下のようなエラーが出ました。
（hogehogeはここで説明するための、存在しない適当なroleです。）

```shell:エラーログ
$ ansible-galaxy install hogehoge
- downloading role 'hogehoge', owned by fugafuga
- downloading role from https://github.com/...
 [ERROR]: failed to download the file: Failed to validate the SSL certificate for github.com: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/ansible, /usr/local/etc/openssl. The exception msg was: [SSL: TLSV1_ALERT_PROTOCOL_VERSION] tlsv1 alert protocol version (_ssl.c:590).

 [WARNING]: - hogehoge was NOT installed successfully.

ERROR! - you can use --ignore-errors to skip failed roles and finish processing the list.
```

助けてドラえもん


# 前提

## 筆者環境

* macOS Sierra
* Homebrew 1.5.10-22-gcb6828d
* Ansible 2.4.3 (Homebrew経由)
* Python 3.6.4 (Pyenv経由)
* Openssl 1.0.2n  7 Dec 2017 (Homebrew経由)

# 原因

結論からいうと、GitHubのTLSv1廃止に伴う諸々のやつですね多分。
処理的な部分を追うと、どうやらpythonの何らかの処理で何かが起きているっぽいです。（適当）

しかし環境的には、概ね最新状態にしているはずなんですけど...。
（恐らく、OpenSSL（1.0.2n）とPython（2.7.14以降）が必要。）

```shell:諸々バージョン確認
$ python --version
Python 3.6.4

$ openssl version
OpenSSL 1.0.2n  7 Dec 2017

$ python -c "import ssl; print(ssl.OPENSSL_VERSION)"
OpenSSL 1.0.2n  7 Dec 2017

$ python3 -c "import ssl; print(ssl.OPENSSL_VERSION)"
OpenSSL 1.0.2n  7 Dec 2017

$ ansible --version
ansible 2.4.3.0
  config file = None
  configured module search path = [u'/Users/n-funaki/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/local/Cellar/ansible/2.4.3.0/libexec/lib/python2.7/site-packages/ansible
  executable location = /usr/local/bin/ansible
  python version = 2.7.10 (default, Feb  7 2017, 00:08:15) [GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.34)]

```

**!?**

AnsibleのPythonバージョンが「2.7.10」になっている...これが原因ですね。
詳しくは把握してませんが、**ansibleのインストールを実行した時点の依存関係**的なところに起因する気がします。

# 解決策

ansibleを再インストールしたら直りました。

```shell:brewでansible再インストール
## 一旦 brew でansibleをアンインストール
$ brew uninstall ansible
Uninstalling /usr/local/Cellar/ansible/2.4.3.0... (11,827 files, 143.7MB)

## 再度 ansibleをインストール
$ brew install ansible
Updating Homebrew...
==> Installing dependencies for ansible: python@2
==> Installing ansible dependency: python@2
==> Downloading https://homebrew.bintray.com/bottles/python@2-2.7.14_3.sierra.bottle.tar.gz
######################################################################## 100.0%
==> Pouring python@2-2.7.14_3.sierra.bottle.tar.gz
...
See: https://docs.brew.sh/Homebrew-and-Python
==> Summary
🍺  /usr/local/Cellar/python@2/2.7.14_3: 4,550 files, 81.0MB
==> Installing ansible
==> Downloading https://homebrew.bintray.com/bottles/ansible-2.4.3.0_3.sierra.bottle.tar.gz
######################################################################## 100.0%
==> Pouring ansible-2.4.3.0_3.sierra.bottle.tar.gz
🍺  /usr/local/Cellar/ansible/2.4.3.0_3: 11,220 files, 137.4MB
```
ビール飲みたい。

```shell:再インストール後のansible確認
## バージョンを確認   「$ source ~/.bash_profile」が必要かも？
$ ansible --version
ansible 2.4.3.0
  config file = None
  configured module search path = [u'/Users/n-funaki/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/local/Cellar/ansible/2.4.3.0_3/libexec/lib/python2.7/site-packages/ansible
  executable location = /usr/local/bin/ansible
  python version = 2.7.14 (default, Mar 10 2018, 00:01:04) [GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.39.2)]

```

再インストールの結果、ansibleのPythonが 2.7.14 になりました。


これで再度 ansible-galaxyを実行したところ、無事成功しました。

```shell:ansible-galaxy実行
$ ansible-galaxy install hogehoge
- downloading role 'hogehoge', owned by fugafuga
- downloading role from https://github.com/...
- extracting hogehoge to /Users/n-funaki/.ansible/roles/hogehoge
- hogehoge (master) was installed successfully

```

# 補足であり余談であり

homebrew経由の場合、homebrew上のansibleの依存関係に引っ張られるっぽいですが、
任意のpythonバージョンにしたい場合は、pip（Pythonのパッケージソフトウェア）経由でインストールするといけます。

```shell:pip経由でansibleインストール
$ python --version
Python 3.6.4

$ pip3 --version
pip 9.0.1 from /Users/n-funaki/.pyenv/versions/3.6.4/lib/python3.6/site-packages (python 3.6)

## pipでansibleインストール
$ sudo pip3 install ansible

... ながいログ ...

Successfully installed MarkupSafe-1.0 PyYAML-3.12 ansible-2.4.3.0 asn1crypto-0.24.0 bcrypt-3.1.4 cffi-1.11.5 cryptography-2.1.4 idna-2.6 jinja2-2.10 paramiko-2.4.1 pyasn1-0.4.2 pycparser-2.18 pynacl-1.2.1 six-1.11.0

## インストールされたansibleを確認
$ ansible --version
ansible 2.4.3.0
  config file = None
  configured module search path = ['/Users/n-funaki/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /Users/n-funaki/.pyenv/versions/3.6.4/lib/python3.6/site-packages/ansible
  executable location = /Users/n-funaki/.pyenv/versions/3.6.4/bin/ansible
  python version = 3.6.4 (default, Mar 16 2018, 13:56:26) [GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.39.2)]

```

私が遭遇した状況について、
こちらからは以上です。