Itamaeが構成管理を仕込みます! ~新進気鋭の国産・構成管理ツール~

第1回シンプル・軽量な構成管理ツールItamae

はじめに

はじめまして。クックパッド株式会社の荒井@ryot_a_raiと申します。

今回から全5回、構成管理ツールであるItamaeの入門から実際の活用例までを解説していきます。今まで構成管理ツールを使ったことがなかった方から、Itamaeをすでに使っている方まで、ぜひご覧ください。

Itamaeとは

Itamaeは筆者が中心となって開発を進めているオープンソースの構成管理ツールです。同様のツールとしてはPuppet、Chef、Ansibleなどが有名ですが、ItamaeはChefに影響を受けています。Chefの記述性・柔軟性を持ちながら、シンプルで導入しやすい構成管理ツールを目指して開発が進んでいます。

構成管理ツールの必要性

Itamaeの解説を始める前に、構成管理ツールを使う理由について軽く考えてみたいと思います。

  • サーバ構築の自動化
    • 手動構築の手間と時間を減らす
    • 手動構築による人為的ミスの防止
  • サーバの状態のコード化
    • GitHub上でのPull Requestベースワークフローでのレビュー
    • サーバの設定変更履歴の管理
    • Serverspecなどのテストフレームワークによるテスト・継続的インテグレーション

構成管理ツールを導入し、サーバ管理を自動化することによって以上のようなメリットを得られます。Itamaeは低コストで導入できるので、いままで構成管理ツールを使っていなかった方もこの機会に導入するのはいかがでしょうか。

Itamaeと他の構成管理ツール

Itamaeと他の構成管理ツールの違いを見てみましょう。まず、サーバの状態をどのような言語で記述するかです。Puppetは独自言語、AnsibleはYAML、ChefはRubyです。Puppetの独自言語は柔軟ですが構成管理ツールを使うために学習する必要があります。YAMLはシンプルでわかりやすいですが、少し複雑なことや動的な設定を行うとなると独自の記法を学ぶ必要が出てきます。このため、個人的にはChefのRuby DSLを気に入っていました。

Chefは柔軟で簡潔にサーバの状態を記述できますが、一方、覚えるべき概念が多かったり、周辺のツールのインストールで手間取ったりなど、構成管理を自動化したいだけなのに超えるべきハードルが多かったりしました(個人の感想です⁠⁠。これはChefが非常に高機能で、巨大なエコシステムを持っているためで、メリットでもありますが、逆にデメリットにもなりえます。

このような背景で、Ruby DSLで記述できるシンプルな構成管理ツールを開発することにしました。

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

インストール

では、早速Itamaeを使ってみたいと思います。本連載ではUbuntuの仮想マシンをVagrant(VirtualBox)上で動かし、実際にItamaeを使っていきます。本連載の手順はMac上で動作確認していますが、VirtualBoxとVagrantが動く環境であればどのプラットフォームでも動くと思います。

VirtualBox、Vagrantのインストール

Downloads – Oracle VM VirtualBoxからVirtualBoxをダウンロードしインストールします。その後、Installing Vagrant - Vagrant Documentationに従ってVagrantをインストールします。

Ruby、Itamaeのインストール

まずVagrantを利用して仮想マシンを起動します。

$ mkdir itamae-gihyo
$ cd itamae-gihyo
$ vagrant init ubuntu/trusty64
$ vagrant up

その後、Rubyをインストールします。ItamaeはRubyで書かれているため、動作にはRubyが必要です。Rubyのインストール方法についてはRubyの公式ページをご覧ください。以下ではBrightboxのレポジトリを使ってRuby 2.2.2をインストールします。

$ vagrant ssh
vagrant@vagrant-ubuntu-trusty-64:~$ sudo apt-add-repository ppa:brightbox/ruby-ng
vagrant@vagrant-ubuntu-trusty-64:~$ sudo apt-get update
vagrant@vagrant-ubuntu-trusty-64:~$ sudo apt-get install ruby2.2
vagrant@vagrant-ubuntu-trusty-64:~$ ruby -v
ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-linux-gnu]

Rubyがインストールできたらgemコマンドを使ってItamaeをインストールします。

vagrant@vagrant-ubuntu-trusty-64:~$ sudo gem install itamae
vagrant@vagrant-ubuntu-trusty-64:~$ itamae version
Itamae v1.4.2

パッケージ管理システムによるItamaeのインストール

Itamaeをインストールするためのもう一つの方法はパッケージ管理システムによるインストールです。このパッケージを使うことで独立したRubyがインストールされ、一発でItamaeが使えるようになります。

Chef社が開発してるOmnibusというツールを利用して作成されたItamaeのパッケージを利用することができます。現在、ビルド済みのパッケージはUbuntu 14.04(Trusty)用のもののみ提供していますパッケージレポジトリ⁠。未検証ではありますが、omnibus-itamaeを自分でビルドすればDebian、Ubuntuの他バージョン用のdebパッケージや、RHELやCentOS用のrpmパッケージも作成できるはずです。ぜひご活用ください。

レシピを書く

Itamaeを使うには、まずレシピと呼ばれるRubyスクリプトを書く必要があります。レシピにはサーバの状態(どのようなソフトウェアがインストールされているか、どのように設定されているかなど)を記述します。レシピにはリソースと呼ばれる定義を並べていきます。

# dstat.rb
package "dstat" do
  action :install
#  version "0.7.2-3build1"
end

上記のレシピは⁠dstat⁠という名前のパッケージ(リソース)がインストールされている状態を示しています。コメントのようにバージョンを指定したい場合には明示することができます。

Itamaeには他にもいくつかのリソースが用意されています。次回、他のリソースの使い方についても紹介しますが、全リソースの一覧はドキュメントをご覧ください。

Itamaeを実行する

先ほどのレシピをdstat.rbとして保存し、以下のコマンドを実行してみます。

vagrant@vagrant-ubuntu-trusty-64:~$ cat dstat.rb
package "dstat" do
  action :install
end
vagrant@vagrant-ubuntu-trusty-64:~$ sudo itamae local dstat.rb
 INFO : Starting Itamae...
 INFO : Recipe: /home/vagrant/dstat.rb
 INFO :   package[dstat] installed will change from 'false' to 'true'
vagrant@vagrant-ubuntu-trusty-64:~$ dstat
You did not select any stats, using -cdngy by default.
----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai hiq siq| read  writ| recv  send|  in   out | int   csw
  7   2  90   0   0   0| 454k  604k|   0     0 |   0     0 | 102   228 ^C

Itamaeを実行すると、dstatがインストールされました。この時何が起こっているかを見るためには--log-levelオプションを使います。一度dstatをアンインストールして、--log-level=debug付きで再度実行してみます。

vagrant@vagrant-ubuntu-trusty-64:~$ sudo apt-get purge dstat
vagrant@vagrant-ubuntu-trusty-64:~$ sudo itamae local --log-level=debug dstat.rb
(中略)
DEBUG :       Executing `dpkg-query -f '${Status}' -W dstat | grep -E '^(install|hold) ok installed$'`...
DEBUG :         stderr | dpkg-query: no packages found matching dstat
DEBUG :         exited with 1
DEBUG :       (in show_differences)
 INFO :       package[dstat] installed will change from 'false' to 'true'
DEBUG :       Executing `dpkg-query -f '${Status}' -W dstat | grep -E '^(install|hold) ok installed$'`...
DEBUG :         stderr | dpkg-query: no packages found matching dstat
DEBUG :         exited with 1
DEBUG :       Executing `DEBIAN_FRONTEND='noninteractive' apt-get -y -o Dpkg::Options::='--force-confdef' -o Dpkg::Options::='--force-confold'  install dstat`...
(中略)
DEBUG :         stdout | Setting up dstat (0.7.2-3build1) ...
DEBUG :         exited with 0
(後略)

実際に実行されているコマンドが表示されていることがわかるかと思います。まず、dpkg-queryでdstatがインストールされているかを確認した後、apt-get installでdstatをインストールしています。長くなるため上記ではコマンドの出力を省略していますが、実際にはすべての出力が表示されています。

先ほどのレシピではdpkgやaptなどといったOS固有のコマンドは記述しませんでしたが、OS固有の(この場合はUbuntuの)パッケージ管理システムのコマンドを実行しています。Itamaeは実行対象のホストOSを判定して、適切なコマンドを実行します。そのため先ほど記述したレシピは(パッケージ名が同じであれば)他のOS上でも動作します[1]⁠。

次に、dstatがインストールされている状態で再度Itamaeを実行してみます。

vagrant@vagrant-ubuntu-trusty-64:~$ sudo itamae local --log-level=debug dstat.rb
(中略)
DEBUG :       Executing `dpkg-query -f '${Status}' -W dstat | grep -E '^(install|hold) ok installed$'`...
DEBUG :         stdout | install ok installed
DEBUG :         exited with 0
DEBUG :       Executing `dpkg-query -f '${Status} ${Version}' -W dstat | sed -n 's/^install ok installed //p'`...
DEBUG :         stdout | 0.7.2-3build1
DEBUG :         exited with 0
DEBUG :       (in show_differences)
DEBUG :       package[dstat] installed will not change (current value is 'true')
DEBUG :       package[dstat] version will not change (current value is '0.7.2-3build1')
DEBUG :       Executing `dpkg-query -f '${Status}' -W dstat | grep -E '^(install|hold) ok installed$'`...
DEBUG :         stdout | install ok installed
DEBUG :         exited with 0

すでにdstatがインストールされている状態で先ほどのレシピを実行すると、インストールコマンドは実行されませんでした。これはItamaeがインストールを実行する前にdstatがインストールかどうかを判断しているためです。このようにItamaeは何度実行してもレシピに書かれた状態に収束するように作られています(冪等性⁠⁠。

dry-runモード

ところで、Itamaeをいきなり実行すると、何が変更されるか不安になるかと思います。そこで、変更内容を事前に確認するためにItamaeにはdry-runモードと呼ばれる、実際には変更を加えずに変更点を表示する機能が備わっています。

vagrant@vagrant-ubuntu-trusty-64:~$ sudo itamae local --dry-run --log-level=debug dstat.rb
(中略)
DEBUG :       package[dstat] installed will not change (current value is 'true')
DEBUG :       package[dstat] version will not change (current value is '0.7.2-3build1')

このように、すでにdstatがインストールされている状態でdry-runを実行すると、上記のように何も変化しないことがわかります。これはItamaeが現在の状態(パッケージがインストールされているかどうか、バージョンはいくつか)を取得して、収束すべき状態(レシピに書かれている状態)との差分を表示しています。

vagrant@vagrant-ubuntu-trusty-64:~$ sudo apt-get purge dstat
vagrant@vagrant-ubuntu-trusty-64:~$ sudo itamae local --dry-run --log-level=debug dstat.rb
(中略)
 INFO :       package[dstat] installed will change from 'false' to 'true'
(後略)

再びdstatをアンインストールして、dry-runを実行してみると、dstatがインストールされていない状態からインストールされている状態に変化することがわかります。このように実行前にdry-runを行うことをお勧めします。

いろいろな実行方法

ここまではローカルのホストに対してItamaeを実行しました。Itamaeは他に2つの実行方法をサポートしています。それぞれを紹介します。

ローカル実行

ローカル実行(local)はItamaeを実行したホスト自体をプロビジョニングする実行方法です。先ほどdstatをインストールした際に使ったのはローカル実行です。以下のように実行します。

$ itamae local recipe1.rb recipe2.rb

SSH経由の実行

ItamaeはSSH越しのホストに対して実行することも可能です。これにより構築対象のホストにItamaeをインストールせずに実行できます。以下のように実行します。

$ itamae ssh --host target-host --user remote-user recipe1.rb recipe2.rb

また、Vagrant用のオプションとして、--vagrantが用意されています。以下のようにVagrantの仮想マシンがあるディレクトリで--vagrantを指定することで、仮想マシンに対してSSH経由でItamaeを実行できます。

$ vagrant status
Current machine states:

default                   running (virtualbox)

(中略)
$ itamae ssh --host default --vagrant recipe1.rb recipe2.rb

ほかに利用できるオプションはヘルプを参照してください。以下のコマンドでヘルプを表示できます。

$ itamae help ssh

Dockerコンテナへの実行

これはまだ実験的な機能ですが、Dockerコンテナに対してItamaeを実行することができます。この機能を使ってDockerイメージを作成することができます。以下のように実行します。

$ itamae docker --image ubuntu:14.04 recipe1.rb recipe2.rb
$ itamae docker --container container-id recipe1.rb recipe2.rb

まとめ

Itamaeの基本は以上です。非常にシンプルで簡単だったと思います。

最後にItamae関連の各種リソースについて紹介しておきます。

次回は

次回は、他のリソースの利用方法や依存関係の明示方法など、レシピの書き方について掘り下げていきます。

おすすめ記事

記事・ニュース一覧