pyenv-virtualenvでAnsible2系とAnsible1系を使い分ける

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

渡辺です。

先日、待望のAnsible2.0がリリースされました。 様々な機能拡張がされていますが、個人的に待望な機能はブロック構文です。 with_itemsなどでバラバラにループしなければならなかった記述がブロックですっきりと整理できるのはRoleのメンテナンスの点でとても助かります。

ですが、Ansible2.0は後方互換性は高いものの、細かい点で挙動が異なるようです。 そのままAnsible1.0の資産を利用できるともいかないのが現実でした。 このため、しばらくはAnsibleの実行環境ではAnsible2.0系とAnsible1.0系の両方を実行可能にしておく必要があります。

というわけで、Mac環境でAnsible1.0を残したまま、Ansible2.0を利用できるようにする手順をまとめます。 Mac以外の環境の場合は、pyenv-virtualenvのインストールまでを環境毎に調べて実行してください。

brewインストールのAnsibleをアンインストールする

Mac環境では、brewでAnsibleをインストールしている人が多いと思います。 このままだと使い分けに支障がでるため、brew管理のAnsibleは潔く削除しましょう。

$ brew uninstall ansible --force

pyenv-virtualenv のインストール

続けて、複数のバージョンのPythonをインストールして切り替える事のできるpyenv、さらにpyenvのプラグインとして同じバージョンのPython環境も複製して切り替える事の出来るpyenv-virtualenvをインストールします。

$ brew install pyenv-virtualenv

pyenvはpyenv-virtualenvをインストールすれば依存しているので、一緒にインストールされるので安心してください。

pyenv-virtualenvを利用し、Ansible2系の環境とAnsible1系のPython環境を作成し、それぞれの環境にAnsibleをインストールしていきます。

ansible2系のインストール

AnsibleはPython2.6または2.7でなければ動作しないので、ここではPython2.7.10を利用します。

はじめにpyenvでPython2.7.10をインストールします。

$ pyenv install 2.7.10
$ pyenv versions
* system (set by /Users/shuji/.pyenv/version)
  2.7.10

続けて、Python2.7.10のvirtualenvとしてansible2を作成し、globalで利用するバージョンに設定します。

$ pyenv virtualenv 2.7.10 ansible2
$ pyenv versions
* system (set by /Users/shuji/.pyenv/version)
  2.7.10
  ansible2
$ pyenv global ansible2
$ pyenv versions
  system
  2.7.10
* ansible2 (set by /Users/shuji/.pyenv/version)
$ python --version
Python 2.7.10

これで現在のglobal pythonは、pyenv-virtualenv環境のansible2(Python2.7.10)になりました。 後は、この環境のpipを使ってAnsibleをインストールします。

$ pip install ansible

最新版(ブログ執筆時点では2.0.0.2)がインストールされます。 以上でAnsible2系が動作する環境が作成できました(パスが通っていないので、シェルを再起動してください)。

$ ansible --version
ansible 2.0.0.2
  config file = 
  configured module search path = Default w/o overrides
$ python --version
Python 2.7.10

ansible1系のインストール

Ansible2系の環境は残しつつ、Ansible1系もインストールしましょう。

ansible2と同様に、Python2.7.10のvirtualenvとしてansible1を作成し、globalで利用するバージョンに設定します。

$ pyenv virtualenv 2.7.10 ansible1
$ pyenv versions
  system (set by /Users/shuji/.pyenv/version)
  2.7.10
  ansible1
* ansible2
$ pyenv global ansible1
$ pyenv versions
  system
  2.7.10
* ansible1 (set by /Users/shuji/.pyenv/version)
  ansible2

これで現在のglobal pythonは、pyenv-virtualenv環境のansible1(Python2.7.10)になりました。 後は、この環境のpipを使ってAnsibleをインストールします。

$ pip install ansible==1.9.4

バージョン情報を付与しないと最新版がインストールされてしまうので注意してください。 Ansible1系が動作していることが確認できます(パスが通っていないので、シェルを再起動してください)。

$ ansible --version
ansible 1.9.4
  configured module search path = None
$ python --version
Python 2.7.10

Ansible1とAnsible2の切り替え

Ansible1系とAnsible2系の切替は、pyenvを利用します。

$ pyenv versions
  system
  2.7.10
  ansible1
* ansible2 (set by /Users/shuji/.pyenv/version)
$ ansible --version
ansible 2.0.0.2
  config file = 
  configured module search path = Default w/o overrides
$ pyenv global ansible1
$ pyenv versions
  system
  2.7.10
* ansible1 (set by /Users/shuji/.pyenv/version)
  ansible2
$ ansible --version
ansible 1.9.4
  configured module search path = None

まとめ

安直にAnsible2にバージョンアップすると痛い目にあう可能性があるので、pyenv-virtualenvでAnsible1系で実行できる環境を準備をしておきましょう。