Mac
homebrew
pip
Ansible
ansible2

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

More than 1 year has passed since last update.

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のバージョンアップ方法

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

Mac
  ~ pip install ansible

実際にやってみたところ

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

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をアップグレードしなさいと言ってくれているので、このコマンドを打ち込みました。

すると、以下の結果。

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

こちらをググってみると、同じ状況のissue(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, 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 Protectiondisable状態にしてPythonのライブラリがあるディレクトリとその中身の所有者を変更する必要があるとのことです。

System Integrity Protectionをオフ

※System Integrity Protectionの詳細についてはOS X 10.11 El CapitanのSystem Integrity Protection(SIP)についてちょっと詳しくを参考にしてください。

System Integrity Protectiondisabled状態にする方法ですが、引用にも貼られているHow to Disable System Integrity Protection (rootless) in OS X El Capitanを参考にしました。

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

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

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

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

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

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

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

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

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入れてる再インストール!

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も無事インストールされたところでずっと打ちたかったコマンドをやっと打ち込むことができました。

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」を開き、以下のコマンドを入力。

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

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

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

最後に...

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

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