複数バージョンの Ansible を使う
複数の Ansible を使いたい理由
本番環境のプロビジョニングやら開発環境構築で Ansible を使っている人は多いと思う。Ansible はバージョンがどんどん新しくなっていくので、複数のプロジェクトをやっていると、プロジェクト毎に必要とされる Ansible のバージョンが異なって困る、という事が良くある。
VM を使って、隔離された環境を使えば?という意見もあるけど、開発環境構築では、
- ローカルマシンの Ansible を使用して
- (Vagrant 等で構築した)VM 上の環境を構築
というケースが結構あるので、Ansible のバージョン毎に異なる VM を使うというのはちょっとやりづらい。
実現方法の案
大抵のプログラム言語では、複数のバージョンを使い分ける仕組みが整っているけど、Ansible にはそういうのが無いようなので、ある程度自分でやる必要がある。
Ansible のインストール方法のページを見ると、色んな方法が用意されている。
複数バージョンを使い分ける方法としては、以下が考えられそう。
- 複数バージョンのソースを持ってきて、ソースから実行する(Running From Source)
- pyenv 等で複数の Python 環境を用意して、 pip でバージョン指定で Ansible をインストールする
今回は、前者の方法でやった。その途中で後者の方法も思いついたけど、実際に試してはいない。pip でのインストールは、ドキュメントでは Latest Releases Via Pip という見出しだけど、バージョン指定も出来るはず。
Ansible をソースから実行する方法
ここからが本題。
ソースの取得
今回は 1.9 系の最新を使いたいので、以下のようにした。
git clone -b stable-1.9 --recursive https://github.com/ansible/ansible.git
環境変数を設定してくれるスクリプトを実行
後は、用意されているシェルスクリプトを読み込む。
cd ansible # clone してきたディレクトリに移動 source ./hacking/env-setup
これで OK ・・・ではない場合もある。
Python 2.x に切り替える・インストールする
ソースから実行する方法は、Python 2系(2.6 以上)でしか使えないので、pyenv 等で複数バージョンを使ってる人は、2系に切り替える。Python 2系がインストールされていない場合は、お好みの方法で2系をインストールする。
必要なパッケージをインストール
自分の環境では、jinja2 と pyyaml をインストールする必要があった。
pip install jinja2 pyyaml
実行
これでようやく実行出来るようになった。めでたしめでたし。
# ansible --version ansible 1.9.6 (stable-1.9 b377301195) last updated 2017/09/12 12:50:46 (GMT +900) lib/ansible/modules/core: (detached HEAD 746d51d1ff) last updated 2017/09/12 12:51:17 (GMT +900) lib/ansible/modules/extras: (detached HEAD 2c073442b0) last updated 2017/09/12 12:51:17 (GMT +900) configured module search path = None
その他、関連情報・感想とか
playbook を更新して最新の Ansible できるようにすべき
そもそも、Ansible の古いバージョンに依存するような状況が良くないと思う。最新バージョンで削られた機能などは、大抵それなりの理由があるので、(時間が許せば)最新バージョンに対応するように Ansible の playbook を更新して欲しい。
ansible-local 使うといい?
ansible-local だと、対象のホストにインストールされた ansible が実行されるので、手元のマシンの Ansible でやる事は少ないため、バージョン依存の問題はほぼ解消出来る気がする。(試していない)
開発環境であれば、イメージ配ったほうが早いのでは?
開発環境構築であれば、各開発者のマシンで Ansible を実行するよりは、プロビジョニング済みのマシンイメージをそのまま配布したほうが楽かも。使ったこと無いけど、Packer とか使えそう。
まとめ
ソフトのバージョン依存というのは古くからある問題で、各言語・フレームワーク等でうまく管理する方法がある。Ansible の場合は、単純な方法ではないが、一応複数バージョンで動かせる方法が用意されている。
でも、複数バージョンの Ansible を動かすより、もっと根本的な問題解決をした方が良い場合もあるので、その辺も考慮したほうが良さそう。