MacでAnsible ver1.9.4からver2.2.0へバージョンアップ時にpipでエラーではまる

#Ansible2へのアップグレードでハマる
以前も、Ansible Ver1.7 → Ver1.9へアップグレードした時に似たようにはまってしまいかなり時間を取られてしまいました。今回も、同様のハマり方をしてしまったため備忘録的に残しておきます。私自身素人なため、同じような境遇の方の役に立てたら幸いです。
なお、本記事ではAnsibleの説明やインストール方法は省きます。
また、コマンドの結果は一部省略してます。

###環境
- MacOS Sierra Ver10.12.1
- Homebrew Ver1.1.1
- Ansible ver1.9.4 → ver2.2.0
- Python Ver2.7.10
- pip Ver 8.1.2 →　Ver9.0.1

#Ansibleのバージョンアップ方法
私の場合は、以下のコマンドでバージョンアップ可能とのことです。

```ruby:Mac
➜  ~ pip install ansible
```

##実際にやってみたところ
基本的には上記のコマンドのみでいいようなのですが、実際にやってみたところ以下のようなエラーでうまくいかず。。。

```ruby:Mac
###Ansibleのバージョン###
➜ansible --version
ansible 1.9.4
  configured module search path = None
###Ansibleバージョンアップコマンド###
➜  ~ pip install ansible
Collecting ansible
  Downloading ansible-2.2.0.0.tar.gz (2.4MB)
    100% |################################| 2.4MB 443kB/s
Collecting paramiko (from ansible)
  Downloading paramiko-2.0.2-py2.py3-none-any.whl (171kB)
    100% |################################| 174kB 2.6MB/s
Collecting jinja2 (from ansible)
  Downloading Jinja2-2.8-py2.py3-none-any.whl (263kB)
    100% |################################| 266kB 2.5MB/s
Collecting PyYAML (from ansible)
  Downloading PyYAML-3.12.tar.gz (253kB)
    100% |################################| 256kB 2.1MB/s
Requirement already satisfied (use --upgrade to upgrade): setuptools in /usr/local/lib/python2.7/site-packages (from ansible)
Collecting pycrypto>=2.6 (from ansible)
  Downloading pycrypto-2.6.1.tar.gz (446kB)
    100% |################################| 450kB 1.8MB/s
Collecting pyasn1>=0.1.7 (from paramiko->ansible)
  Downloading pyasn1-0.1.9-py2.py3-none-any.whl
Collecting cryptography>=1.1 (from paramiko->ansible)
  Downloading cryptography-1.5.3-cp27-cp27m-macosx_10_10_intel.whl (2.4MB)
    100% |################################| 2.4MB 429kB/s
Collecting MarkupSafe (from jinja2->ansible)
  Downloading MarkupSafe-0.23.tar.gz
Collecting cffi>=1.4.1 (from cryptography>=1.1->paramiko->ansible)
  Downloading cffi-1.9.1-cp27-cp27m-macosx_10_10_intel.whl (214kB)
    100% |################################| 215kB 2.9MB/s
Collecting six>=1.4.1 (from cryptography>=1.1->paramiko->ansible)
  Downloading six-1.10.0-py2.py3-none-any.whl
Collecting idna>=2.0 (from cryptography>=1.1->paramiko->ansible)
  Downloading idna-2.1-py2.py3-none-any.whl (54kB)
    100% |################################| 61kB 2.2MB/s
Collecting ipaddress (from cryptography>=1.1->paramiko->ansible)
  Downloading ipaddress-1.0.17-py2-none-any.whl
Collecting enum34 (from cryptography>=1.1->paramiko->ansible)
  Downloading enum34-1.1.6-py2-none-any.whl
Collecting pycparser (from cffi>=1.4.1->cryptography>=1.1->paramiko->ansible)
  Downloading pycparser-2.17.tar.gz (231kB)
    100% |################################| 235kB 3.1MB/s
Building wheels for collected packages: ansible, PyYAML, pycrypto, MarkupSafe, pycparser
  Running setup.py bdist_wheel for ansible … done


Successfully built ansible PyYAML pycrypto MarkupSafe pycparser
Installing collected packages: pyasn1, pycparser, cffi, six, idna, ipaddress, enum34, cryptography, paramiko, MarkupSafe, jinja2, PyYAML, pycrypto, ansible
IOError: [Errno 13] Permission denied: '/usr/local/bin/ansible'
You are using pip version 8.1.2, however version 9.0.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
```
##権限
まず、`IOError: [Errno 13] Permission denied: '/usr/local/bin/ansible'`から権限がねーよと言われているので、`sudo`で実行してみます。
すると、上記の一行のみ消えます。

##pipをアップグレード
次に`You are using pip version 8.1.2, however version 9.0.1 is available.`
`You should consider upgrading via the 'pip install --upgrade pip' command.`と丁寧に`pip`をアップグレードしなさいと言ってくれているので、このコマンドを打ち込みました。

すると、以下の結果。

```ruby:Mac
###pipアップグレード###
➜  ~ sudo pip install --upgrade pip
sudo: pip: command not found
```

こちらをググってみると、同じ状況のissue[(https://github.com/pypa/pip/issues/3761)](https://github.com/pypa/pip/issues/3761)が`GitHub`で見つかったので参考にすることに。

以下の解答が方法のようなので、早速試してみました。

>You don't have rw permission to the directories. Assuming you have administrator rights, you can change the permissions with sudo chown -R $USER /absolute/path/to/directory. If you're running OS X 10.11+, you'll probably also need disable the [System Integrity Protection](http://osxdaily.com/2015/10/05/disable-rootless-system-integrity-protection-mac-os-x/), but don't forget to reenable it after you're done (just to be safe).

##System Integrity Protectionをオフにして対象のディレクトリに権限を追加

上の引用を要約すると、**OSがMacのOS X 10.11~の場合`System Integrity Protection`を`disable`状態にして`Python`のライブラリがあるディレクトリとその中身の所有者を変更する必要がある**とのことです。

###System Integrity Protectionをオフ
※System Integrity Protectionの詳細については[OS X 10.11 El CapitanのSystem Integrity Protection(SIP)についてちょっと詳しく](http://rcmdnk.github.io/blog/2015/10/10/computer-mac/)を参考にしてください。

`System Integrity Protection`を`disabled`状態にする方法ですが、引用にも貼られている[How to Disable System Integrity Protection (rootless) in OS X El Capitan](http://osxdaily.com/2015/10/05/disable-rootless-system-integrity-protection-mac-os-x/)を参考にしました。

そもそも`System Integrity Protection`の状態が`disabled`であればこの手順は必要ないので、状態を以下のコマンドで確認します。その後、必要であれば手順に従い`disabled`状態にしていきます。

```ruby:Mac
###SIPの状態確認###
➜  ~ csrutil status
System Integrity Protection status: enabled.
```

1.再起動後起動時に`command + R`でリカバリーモードで起動。
2.「utility」→ 「terminal」を開き、以下のコマンドを入力。


```ruby:Mac
###SIPをdisable + 再起動###
csrutil disable; reboot
```

3.再起動されたら再度状態を確認する。

```ruby:Mac
###SIPの状態確認###
➜  ~ csrutil status
System Integrity Protection status: disabled.
```

###対象のディレクトリに権限を追加

引用で述べられているように、**`Python`のライブラリがあるディレクトリとその中身の所有者を変更**し`pip`のアップグレードにトライします。

```ruby:Mac
###所有者変更###
➜  ~ sudo chown -R $USER /usr/local/lib/python2.7
Password:
###pipアップグレード###
➜  ~ sudo pip install --upgrade pip
sudo: pip: command not found
```

###Homebrew再インストール
再び`pip: command not found`です…
これは辛い。ただ、先ほどの`GitHub`のページに戻ると少し下に助け舟が！！

>I found that permissions of multiple files were changed by my sysadmin (by default) after I had her set up my computer for the work network. This screwed up some things on my installation of Homebrew, one of which happened to be Homebrew's pip installation. My fix was to uninstall and reinstall Homebrew.

要約すると、**Homebrewが何か悪さしててさインストールしたらうまくいったよ〜**って質問者が言ってますね。ってことで私もHomebrew入れてる再インストール!

```ruby:Mac
###Homebrewアンインストール###
➜  ~ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/uninstall)"tall)"
Warning: This script will remove:
Are you sure you want to uninstall Homebrew? [y/N] y
==> Removing Homebrew installation...
==> Removing empty directories...
Password:
==> Homebrew uninstalled!
You may wish to remove them yourself.
```
```
###Homebrewインストール###
➜  ~ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
==> This script will install:
Press RETURN to continue or any other key to abort
Password:
==> Installation successful!
```

###pipインストール
ここでなんとなく`pip`がちゃんといるのか心配になり確かめてみると...

```
###pipの所在確認###
➜  ~ which pip
pip not found
```
`pip`ないっていう...笑
そこでインストール

```
###pipインストール###
➜  ~ python -m ensurepip
Ignoring indexes: https://pypi.python.org/simple
Requirement already satisfied (use --upgrade to upgrade): setuptools in /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python
Collecting pip
Installing collected packages: pip
  OSError: [Errno 13] Permission denied: '/Library/Python/2.7/site-packages/pip'
➜  ~ sudo python -m ensurepip
Password:
Installing collected packages: pip
Successfully installed pip-6.1.1
```

##Ansibleバージョンアップ
さて、`pip`も無事インストールされたところでずっと打ちたかったコマンドをやっと打ち込むことができました。

```ruby:Mac
➜  ~ sudo pip install --upgrade pip
  Downloading pip-9.0.1-py2.py3-none-any.whl (1.3MB)
    100% |################################| 1.3MB 354kB/s
Installing collected packages: pip
  Found existing installation: pip 6.1.1
    Uninstalling pip-6.1.1:
      Successfully uninstalled pip-6.1.1
Successfully installed pip-9.0.1
➜  ~ sudo pip install ansible
The directory ~~~
Collecting ansible
Collecting jinja2 (from ansible)
  Downloading Jinja2-2.8-py2.py3-none-any.whl (263kB)
    100% |################################| 266kB 2.5MB/s
Collecting PyYAML (from ansible)
Collecting pycrypto>=2.6 (from ansible)
Collecting paramiko (from ansible)
  Downloading paramiko-2.0.2-py2.py3-none-any.whl (171kB)
    100% |################################| 174kB 3.8MB/s
Requirement already satisfied: setuptools in /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python (from ansible)
Collecting MarkupSafe (from jinja2->ansible)
Collecting cryptography>=1.1 (from paramiko->ansible)
  Downloading cryptography-1.5.3-cp27-cp27m-macosx_10_10_intel.whl (2.4MB)
    100% |################################| 2.4MB 453kB/s
Collecting pyasn1>=0.1.7 (from paramiko->ansible)
  Downloading pyasn1-0.1.9-py2.py3-none-any.whl
Collecting idna>=2.0 (from cryptography>=1.1->paramiko->ansible)
  Downloading idna-2.1-py2.py3-none-any.whl (54kB)
    100% |################################| 61kB 6.7MB/s
Collecting ipaddress (from cryptography>=1.1->paramiko->ansible)
  Downloading ipaddress-1.0.17-py2-none-any.whl
Collecting enum34 (from cryptography>=1.1->paramiko->ansible)
  Downloading enum34-1.1.6-py2-none-any.whl
Collecting cffi>=1.4.1 (from cryptography>=1.1->paramiko->ansible)
  Downloading cffi-1.9.1-cp27-cp27m-macosx_10_10_intel.whl (214kB)
    100% |################################| 215kB 3.0MB/s
Requirement already satisfied: six>=1.4.1 in /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python (from cryptography>=1.1->paramiko->ansible)
Collecting pycparser (from cffi>=1.4.1->cryptography>=1.1->paramiko->ansible)
Installing collected packages: MarkupSafe, jinja2, PyYAML, pycrypto, idna, ipaddress, enum34, pyasn1, pycparser, cffi, cryptography, paramiko, ansible
Successfully installed MarkupSafe-0.23 PyYAML-3.12 ansible-2.2.0.0 cffi-1.9.1 cryptography-1.5.3 enum34-1.1.6 idna-2.1 ipaddress-1.0.17 jinja2-2.8 paramiko-2.0.2 pyasn1-0.1.9 pycparser-2.17 pycrypto-2.6.1
➜  ~ ansible --version
ansible 2.2.0.0
  config file =
  configured module search path = Default w/o overrides
```

###System Integrity Protectionをオン
最後に再度SIPを`abled`状態にしてAnsibleのバージョンアップは無事終了致しました。

➜  ~ csrutil status
System Integrity Protection status: disabled.
```

1.再起動後起動時に`command + R`でリカバリーモードで起動。
2.「utility」→ 「terminal」を開き、以下のコマンドを入力。


```ruby:Mac
###SIPをdisable + 再起動###
csrutil enable; reboot
```

3.再起動されたら再度状態を確認する。

```ruby:Mac
###SIPの状態確認###
➜  ~ csrutil status
System Integrity Protection status: enabled.
```

#最後に...
まだまだ慣れませんが、今後はWindows Serverの構築・設定用のAnsible playbook作成をしていく予定です。Windowsに対してもできることが増えてきているとの噂を聞きつけて、Ansible2を触ってみようというのが当初の目的でしたが、思わぬところでかなり時間を取られてしまいました。

こういった準備段階でのハマりが一番辛いですね。