複数バージョンの 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 を動かすより、もっと根本的な問題解決をした方が良い場合もあるので、その辺も考慮したほうが良さそう。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です