お久しぶりです。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 では、例えば以下のようなプラグインが提供されています。
-
Ansibleは通常、sshを使って、対象ホストに接続しますが、その接続方法を変更するものがこのコネクションプラグインのようです。
その中の1つであるDocker Connection Plugin
というものを使ったという記事がありました。 -
Ansible の
with_*
ようなループ処理は、このlookup plugin によって実装されているようです。
使い方はこちらが参考になると思います。 -
Ansible にはホストやグループといった概念があり、ホストあるいはグループ単位でプロビジョニングを行うことができます。(参考:ansibleで実行対象を切り替える方法)
この時に、各ホストごとの変数や、各グループごとの変数に対して、新たな変数を追加できるようです。(参考:Ansible - ディレクトリ構成について) -
Ansible には、json や yaml などのデータ構造を別の形式に変える
jinja2 filter
というものがあるようです。(こちらを参照)
そういったデータ構造を、それ以外の他の形式に変える場合に、このプラグインが用いられるみたいですね。 -
これは実行結果を表示させるためのプラグインのようです。画面への通知だけでなく、音声としても通知できるようですね。
詳しくはこちらをご参照ください。 -
Ansible のファイルのディストリビューションを変更するものかと思いましたが、すみません。正直、よくわかりませんでした。
Itamae
Itamae では、gem として、Itamae のプラグインが存在するようです。
例えば以下のようなプラグインが存在するようです。
因みに、プラグインはどれも gem なので、gem install <gem名>
のようにしてインストールすることができます。
その後の細かい設定は、それぞれGitHubをご覧ください。
-
unicorn のインストールと、jsonファイルに書いたとおりに unicorn の設定までやってくれるようです。
-
SELinuxの
disable
、enforcing
、permissive
などのモードを簡単に切り替えることができるようです。 -
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 の方が使いやすく、おすすめだと思います。