Aqutras Members' Blog

株式会社アキュトラスのメンバーが、技術情報などを楽しく書いています。

Ansible と Itamae の比較

お久しぶりです。nechinechiです。
今回は、構成管理ツールである、Ansible と Itamae を比較していこうと思います。

始めに

構成管理ツールとは、複数のサーバに同じ環境を構築したい場合などに用いられるツールです。
手動で1つ1つのサーバに同じ環境を立てるのはかなり苦労します。しかし、このツールを使えば、初めにファイルを記述しておくだけで、後はコマンドを実行するだけで、自動的にサーバの環境構築を行ってくれます。
Ansible と Itamae はそれぞれ構成管理ツールの内の1つであり、他にもまだいくつか存在します。
それらの中からこの2つを選んだのは、自分の周囲で利用している人がおり、私も興味を持ったからです。 また、個人としてもどちらのツールがより人気で、その理由はなぜかなどに興味があったため、このテーマを選びました。

記法の違い

Ruby をソースからインストールする場合の、Ansible の Playbook と Itamae の recipe で比較します。

Ansible

Ansible ではyaml形式の記法が使われています。
例えば、Rubyのインストールは以下のようになります。

---
- hosts: all
  become: yes
  gather_facts: yes
  tasks:
    - name: apt-get update
      apt: update_cache=yes
    - name: install depended packages
      apt: name={{ item }} state=latest
      with_items:
        - libffi-dev
        - libreadline6-dev
        - libssl-dev
        - make
        - zlib1g-dev
    - name: check exist of ruby source
      stat: path=/usr/local/src/ruby-2.3.0
      register: ruby_source
    - name: get source and unarchive
      unarchive: src=https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.0.tar.gz dest=/usr/local/src copy=no
      when: not ruby_source.stat.exists
    - name: build
      shell: ./configure && make && make install
      args:
        chdir: /usr/local/src/ruby-2.3.0

ただ、yaml を使った記法として、以下のような短所もあるようです。

YAMLはシンプルでわかりやすいですが,少し複雑なことや動的な設定を行うとなると独自の記法を学ぶ必要が出てきます。

(第1回 シンプル・軽量な構成管理ツールItamaeから引用)

私はまだ Ansbile をそれほど使っていませんが、複雑なことをしようとすると、独自の記法の学習が必要となり、そこに時間がかかりそうですね。 下の例でも、statモジュールでは与えられたpathに対してstatコマンドを実行します。そして、それによって得られたファイルのパスをregisterによって、ruby_sourceに記憶させ、後にwhen: not ruby_source.stat.existsでファイルが無い場合に処理を限定させています。
この部分は、初めはよく理解できず、多少苦労しました。

Itamae

ItamaeではRubyの記法を用いています。
以下は、Rubyのインストールをする場合のレシピです。
%記法や、each記法などがありRubyが使える人にとっては、それほど学習コストが高くないのかなというように思えます。
やはり個人的には YAML 形式の記述をすることが少なく、Rubyに関しては書く機会が多いといった理由で、Itamae のほうが書きやすく感じますね。

execute 'apt-get update'

%w(libffi-dev libreadline6-dev libssl-dev make zlib1g-dev).each do |pkg|
  package pkg
end

http_request 'ruby' do
  path "/usr/local/src/ruby-2.3.0.tar.gz"
  url "https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.0.tar.gz"
  not_if "test -e /usr/local/src/ruby-2.3.0.tar.gz"
end

execute "tar xf ruby-2.3.0.tar.gz" do
  cwd '/usr/local/src'
  only_if "test -e /usr/local/src/ruby-2.3.0.tar.gz"
  not_if "test -e /usr/local/src/ruby-2.3.0"
end

execute './configure && make && make install' do
  cwd "/usr/local/src/ruby-2.3.0"
end

利用者の比較

GitHub でのコントリビューター数などを比較、また、Qiita、はてなブログ、StackOverflow での質問数を比較してみます。

GitHub

今現在(2016.06.14)では、Ansible、Itamae のそれぞれのコントリビューター、コミット数、プルリクエスト数などは以下のようになっています。
以下を見る限り、圧倒的に Ansible の開発の方が活発ですね。まぁItamaeの方がまだ新しいのでこの結果は当たり前ですね。
コントリビュータに関してですが、Ansibleはざっと見たところ日本人のコントリビュータは見つかりませんでした。(本当にかなりざっとです)
それに対して、Itamae においては、40人中36人が日本人でした。外国の方には、あまりItamaeは使われていないようですね。

Ansible Itamae
コントリビューター 1396 40
コミット数 19701 911
プルリクエスト数(closedも含む) 8320 150

質問数による比較

質問数からしても、StackOverflow(JP)を除いて Ansible の方が圧倒的です。

Ansible Itamae
Qiita 1374 123
はてなブログ 42600 9850
StackOverflow 7835 6
StackOverflow(JP) 10 11

プラグイン

私は利用したことはありませんが、Ansible と Itamae にはそれぞれプラグインが存在するようです。 それぞれに、どのようなプラグインがあるのか見ていきます。 どちらのどのプラグインも私自身には使った経験はなく、他のブログ記事や、githubからの情報になります。

Ansible

Ansible のプラグインは、「プラグイン」とついていますが、プラグインのインストールといった手順は特に必要がないみたいです。(どこを探してもAnsibleのインストール後にプラグインを使っていたので)
ただし、以下のConnection Type Pluginsで話に出しているDocker Connection Pluginは、Ansible2.0の新機能のようです。(参考:Ansible 2.0の新機能 Docker Connection Pluginを使ってDockerコンテナの構成管理をしてみた)
Ansible では、例えば以下のようなプラグインが提供されています。

  • Connection Type Plugins

    Ansibleは通常、sshを使って、対象ホストに接続しますが、その接続方法を変更するものがこのコネクションプラグインのようです。
    その中の1つであるDocker Connection Pluginというものを使ったという記事がありました。

  • Lookup Plugins

    Ansible のwith_*ようなループ処理は、このlookup plugin によって実装されているようです。
    使い方はこちらが参考になると思います。

  • Vars Plugins

    Ansible にはホストやグループといった概念があり、ホストあるいはグループ単位でプロビジョニングを行うことができます。(参考:ansibleで実行対象を切り替える方法)
    この時に、各ホストごとの変数や、各グループごとの変数に対して、新たな変数を追加できるようです。(参考:Ansible - ディレクトリ構成について)

  • Filter Plugins

    Ansible には、json や yaml などのデータ構造を別の形式に変えるjinja2 filterというものがあるようです。(こちらを参照)
    そういったデータ構造を、それ以外の他の形式に変える場合に、このプラグインが用いられるみたいですね。

  • Callbacks

    これは実行結果を表示させるためのプラグインのようです。画面への通知だけでなく、音声としても通知できるようですね。
    詳しくはこちらをご参照ください。

  • Distributing Plugins

    Ansible のファイルのディストリビューションを変更するものかと思いましたが、すみません。正直、よくわかりませんでした。

Itamae

Itamae では、gem として、Itamae のプラグインが存在するようです。
例えば以下のようなプラグインが存在するようです。
因みに、プラグインはどれも gem なので、gem install <gem名>のようにしてインストールすることができます。
その後の細かい設定は、それぞれGitHubをご覧ください。

  • itamae-plugin-recipe-unicorn

    unicorn のインストールと、jsonファイルに書いたとおりに unicorn の設定までやってくれるようです。

  • itamae-plugin-recipe-selinux

    SELinuxの disableenforcingpermissiveなどのモードを簡単に切り替えることができるようです。

  • itamae-plugin-recipe-rbenv

    rbenv のインストールと、rbenvを使って、rubyもインストールしてくれるみたいです。
    jsonファイルに記述することで、global で利用するrubyのバージョンを指定できるようです。
    また、それ以外のバージョンのrubyもインストールしておくことができるみたいです。

  • itamae-plugin-resource-encrypted_remote_file

    reversible_cryptographyによって暗号化されたファイルを、サーバに転送する際などに複合化してくれるプラグインのようです。
    こちらに作成者さんが作った経緯など詳しく書いています。

  • itamae-plugin-recipe-nginx_build

    nginx のビルドとインストールを行ってくれるようです。

Itamaeに関係する gem は、先頭にitamae-plugin-recipe-が付くのが慣習的になっているようなので、良ければrubygems公式サイトを確認してみてください。
他にもいくつかプラグインは存在し、もしかしたら今作ろうとしているレシピを作る手間が省けるかもしれません。

思想

Ansible

Ansible公式サイトには以下のような記述があります。
以下より、構成管理、プロビジョニング、アプリケーションのデプロイなどを円滑に進められるようにすることが、Ansibleの開発の基となる思想のようです。

Ansible seamlessly unites workflow orchestration with configuration management, provisioning, and application deployment in one easy-to-use and deploy platform.

Itamae

Itamae に関しては以下の考えを基として開発されたようです。

Itamaeは特別新しい概念・機能を持っているものではありませんが,できるだけツールの学習コストを下げ,構成管理の自動化を最短距離で実現するために開発されています。

(引用:第1回 シンプル・軽量な構成管理ツールItamae)

また、今後の方向性として、以下のようにも述べられています。

今後も低い学習コストで使い始められ、軽量・シンプルに使えるという特徴を維持していきます。 それと同時に、大きな規模になっても使える機能を備えていきたいと考えています。

(引用:クックパッドのサーバプロビジョニング事情)

終わりに

私は、最近 Ansible を使って、Ansible は実行結果がカラーリングされていて Itamae よりは見やすいといった理由から、Ansible の方がいいかなと思っていました。
しかし、この記事を書くにあたり、調べてみると、それぞれにプラグインがあることがわかりました。特に、Itamae のプラグインは、例えば Ruby のインストールをする recipe を自分で書かず、gem をインストールし、それをinclude_recipeでレシピを読み込むだけで Ruby のインストールができてしまいます。
これはすごく便利です!
この点から、やはり Itamae の方が使いやすいのかな、と今では思っています。
また、この記事を書くにあたって、Ansible の playbook や Itamae の recipe を書いていて、改めて、Itamae のレシピの方が書きやすいと感じました。(Rubyには多少慣れてることも関係してると思いますが)
なので、私個人としては、Itamae の方が使いやすく、おすすめだと思います。