CUBE SUGAR CONTAINER

技術系のこと書きます。

開発版の Ansible 2.0 をインストールする

この記事を書いている時点で Ansible の安定版はバージョン 1.9 系だけど、もうしばらくすると 2.0 系がリリースされそうな雰囲気になっている。 メジャーバージョンが上がるということもあって 2.0 系には一部に後方互換性のない変更も含まれている。 そこで、作ったものやこれから作るものが将来的にも動くか否かについて、今のうちから気にしておいた方が良さそうだなと考えた。 そんなわけで、今回は開発中の 2.0 系アルファリリースをインストールしてみる。

検証環境には Mac OS X を使った。

$ uname -s
Darwin
$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.10.5
BuildVersion:   14F27

リポジトリをチェックアウトする

まずは GitHub のリポジトリからソースコードをクローンする。

$ git clone https://github.com/ansible/ansible.git
$ cd ansible

Git のタグを確認すると、今のところ 2.0 系は alpha2 までリリースされているようだ。

$ git tag -l | grep ^v2
v2.0.0-0.1.alpha1
v2.0.0-0.2.alpha2

上記のタグをチェックアウトする。

$ git checkout -b v2.0a2 v2.0.0-0.2.alpha2
Switched to a new branch 'v2.0a2'

そして Git のサブモジュールを読み込んだら、ひとまず準備完了。

$ git submodule update --init --recursive

Makefile を一部手直しする

インストールには make を使うみたい。 ただ、その中で使っている xargs に GNU 拡張のオプションがあることを想定していたのでちょっと手直しする。 巷の Linux ディストリビューションのように、最初から GNU xargs が入っている場合この作業は必要ない。

Homebrew で GNU xargs と GNU sed をインストールしておく。 これで GNU 版の xargs と sed が gxargs と gsed という名前で使えるようになる。

$ brew install findutils gnu-sed

実はほんとに必要なのは GNU xargs の方だけなんだけど。

Makefile の中の xargs を gxargs に置換する。

$ gsed -i -e "s:xargs:gxargs:g" Makefile

見事に 1 文字パッチ。

$ git diff -u Makefile
diff --git a/Makefile b/Makefile
index 508be40..e35077c 100644
--- a/Makefile
+++ b/Makefile
@@ -142,7 +142,7 @@ clean:
        @echo "Cleaning up byte compiled python stuff"
        find . -type f -regex ".*\.py[co]$$" -delete
        @echo "Cleaning up editor backup files"
-       find . -type f  \( -name "*~" -or -name "#*" \) |grep -v test/units/inventory_test_data/group_vars/noparse/all.yml~ |xargs -n 1024 -r rm
+       find . -type f  \( -name "*~" -or -name "#*" \) |grep -v test/units/inventory_test_data/group_vars/noparse/all.yml~ |gxargs -n 1024 -r rm
        find . -type f \( -name "*.swp" \) -delete
        @echo "Cleaning up manpage stuff"
        find ./docs/man -type f -name "*.xml" -delete

Ansible をインストールする

make コマンドで Ansible をインストールする。 インストール先がシステムの場合には適宜 sudo なんかをする感じで。 今回はインストール先の環境に virtualenv を使ったので不要。

$ make
$ make install

パッケージマネージャ pip で確認すると ansible の 2.0 系がインストールされたことが分かる。

$ pip list | grep -i ansible
ansible (2.0.0)

pip が入っていないときは sudo easy_install pip とかして入れておこう。

もちろん ansible コマンドや ansible-playbook コマンドも使えるようになる。

$ ansible --version
ansible 2.0.0
  config file = 
  configured module search path = None
$ ansible-playbook --version
ansible-playbook 2.0.0
  config file = 
  configured module search path = None

試しにちょっと動かしてみる。

$ ansible -i "localhost," -c local -m ping localhost
localhost | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
$ cat << EOF > site.yml
---
- hosts:
  - all
  tasks:
    - name: greet
      debug: msg="Hello, World!"
EOF
$ ansible-playbook -i "localhost," -c local site.yml

PLAY ***************************************************************************

TASK [setup] *******************************************************************
ok: [localhost]

TASK [greet] *******************************************************************
ok: [localhost] => {
    "changed": false,
    "msg": "Hello, World!"
}

PLAY RECAP *********************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0

ばっちり。

別のやり方

開発するときなんかには、わざわざ Python 実行環境にインストールしなくてもいい方法が用意されているみたい。

make install の代わりに以下のコマンドを使うと、ソースコードにパスだけが通った状態になる。

$ source ./hacking/env-setup

この状態で ansible* コマンドが使える。

$ ansible --version
ansible 2.0.0 (v2.0a2 70677b030b) last updated 2015/09/15 19:47:39 (GMT +900)
  lib/ansible/modules/core: (detached HEAD 2520627fe7) last updated 2015/09/15 19:47:51 (GMT +900)
  lib/ansible/modules/extras: (detached HEAD 5cd0fab9d0) last updated 2015/09/15 19:47:56 (GMT +900)
  config file = 
  configured module search path = None
$ ansible-playbook --version
ansible-playbook 2.0.0 (v2.0a2 70677b030b) last updated 2015/09/15 19:47:39 (GMT +900)
  lib/ansible/modules/core: (detached HEAD 2520627fe7) last updated 2015/09/15 19:47:51 (GMT +900)
  lib/ansible/modules/extras: (detached HEAD 5cd0fab9d0) last updated 2015/09/15 19:47:56 (GMT +900)
  config file = 
  configured module search path = None

ソースコードの変更内容がダイレクトに反映されてよさそう。

一点気をつけるべきなのは、このやり方だと依存パッケージが入らない。 なのでセットアップスクリプトの内容から依存パッケージを確認した上で別途インストールしよう。

$ grep requires setup.py
     install_requires=['paramiko', 'jinja2', "PyYAML", 'setuptools', 'pycrypto >= 2.6', 'six'],
$ pip install paramiko jinja2 PyYAML pycrypto six

いじょう。

まとめ

今回は開発中の Ansible 2.0 をインストールしてみた。 後はこの環境を使ってこれまでに作ったものとかこれから作るものが動くことを確認していけばよさそうかな。