virtualenvでAnsibleのバージョンを切り替える

2017.03.10

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

渡辺です。 そろそろ冬が終わりそうです・・・。

ツールのバージョンアップ時、後方互換性については悩ましい問題です。 Ansibleも同様で、Ansible2.2あたりでだいぶ落ち着いたとはいえ、作成したPlaybookは動作していた時期のバージョンに切り替えて実行するのが無難でしょう。

以前、pyenv-virtualenvを使い、Ansibleのバージョンを切り替える方法を紹介しました(pyenv-virtualenvでAnsible2系とAnsible1系を使い分ける)。 先日、virtualenvとvirtualenvwrapperを使う方法に替えてみたので、手順を紹介します。

グローバル環境のAnsibleをアンインストール

AnsibleはPythonのライブラリとしてインストールします。 グローバル環境のPythonにAnsibleが含まれていると予期せぬ動作を引き起こす可能性があるので、はじめにアンインストールしておきましょう。

$ sudo pip uninstall ansible

MacOSでbrewでインストールされていれば、同様にアンインストールします。

$ brew uninstall ansible --force

virtualenvのインストール

virtualenvをpipでインストールします。

$ pip install virtualenv

virtualenvでは、プロジェクトディレクトリ毎に環境を作成します。 今回はAnsibleのバージョン切り替えだけが目的なのでプロジェクト毎は少し冗長です。 virtualenvwrapperを追加し、グローバル環境のPythonを簡単に切り替えられるようにしましょう。

$ pip install virtualenvwrapper

次の行を.bashrcを追加し、virtualenvwrapperを有効化します。

if [ -f /usr/local/bin/virtualenvwrapper.sh ]; then
    export WORKON_HOME=$HOME/.virtualenvs
    source /usr/local/bin/virtualenvwrapper.sh
fi

Ansible環境の作成

mkvirtualenvコマンドを実行し、ansibleという名前で、仮想環境を作成します。

$ mkvirtualenv ansible
New python executable in /Users/shuji/.virtualenvs/ansible/bin/python
Installing setuptools, pip, wheel...done.
virtualenvwrapper.user_scripts creating /Users/shuji/.virtualenvs/ansible/bin/predeactivate
virtualenvwrapper.user_scripts creating /Users/shuji/.virtualenvs/ansible/bin/postdeactivate
virtualenvwrapper.user_scripts creating /Users/shuji/.virtualenvs/ansible/bin/preactivate
virtualenvwrapper.user_scripts creating /Users/shuji/.virtualenvs/ansible/bin/postactivate
virtualenvwrapper.user_scripts creating /Users/shuji/.virtualenvs/ansible/bin/get_env_details

仮想環境の切り替えは、workonコマンドで行います。 workonコマンドを引数無しで実行すると、定義済みの環境の一覧が表示されます。

$ workon
ansible

workonコマンドで環境名を指定して、環境を切り替えます。

$ workon ansible

環境を切り替えたならば、Ansibeをインストールします。

(ansible) $ pip install ansible
(ansible) $ ansible --version
ansible 2.2.1.0
  config file = 
  configured module search path = Default w/o overrides

Ansibleの最新バージョンがインストールされました。

旧バージョンのAnsibleをインストールする

Ansible2.1の環境を作成します。

$ mkvirtualenv ansible2.1
$ workon ansible2.1
(ansible2.1) $ pip install ansible==2.1.4
(ansible2.1) $ ansible --version
ansible 2.1.4.0
  config file = 
  configured module search path = Default w/o overrides

仮想環境を抜ける

環境を抜けるには、deactivateコマンドを実行します。

(ansible2.1) $ deactivate
$ ansible --version
-bash: ansible: command not found

まとめ

pyenvを使うとPython自体のバージョンも管理する事ができます。 Python自体はグローバル環境のバージョンでよい場合、virtualenvの方がお手軽ですね。

また、仮想環境の名前がシェルに表示されるところもポイントです♪