はじめに
はじめまして。クックパッド株式会社の荒井(@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を利用して仮想マシンを起動します。
その後、Rubyをインストールします。ItamaeはRubyで書かれているため、動作にはRubyが必要です。Rubyのインストール方法についてはRubyの公式ページをご覧ください。以下ではBrightboxのレポジトリを使ってRuby 2.2.2をインストールします。
Rubyがインストールできたらgemコマンドを使ってItamaeをインストールします。
パッケージ管理システムによるItamaeのインストール
Itamaeをインストールするためのもう一つの方法はパッケージ管理システムによるインストールです。このパッケージを使うことで独立したRubyがインストールされ、一発でItamaeが使えるようになります。
Chef社が開発してるOmnibusというツールを利用して作成されたItamaeのパッケージを利用することができます。現在、ビルド済みのパッケージはUbuntu 14.04(Trusty)用のもののみ提供しています(パッケージレポジトリ)。未検証ではありますが、omnibus-itamaeを自分でビルドすればDebian、Ubuntuの他バージョン用のdebパッケージや、RHELやCentOS用のrpmパッケージも作成できるはずです。ぜひご活用ください。
レシピを書く
Itamaeを使うには、まずレシピと呼ばれるRubyスクリプトを書く必要があります。レシピにはサーバの状態(どのようなソフトウェアがインストールされているか、どのように設定されているかなど)を記述します。レシピにはリソースと呼ばれる定義を並べていきます。
上記のレシピは“dstat”という名前のパッケージ(リソース)がインストールされている状態を示しています。コメントのようにバージョンを指定したい場合には明示することができます。
Itamaeには他にもいくつかのリソースが用意されています。次回、他のリソースの使い方についても紹介しますが、全リソースの一覧はドキュメントをご覧ください。
Itamaeを実行する
先ほどのレシピをdstat.rbとして保存し、以下のコマンドを実行してみます。
Itamaeを実行すると、dstatがインストールされました。この時何が起こっているかを見るためには--log-level
オプションを使います。一度dstatをアンインストールして、--log-level=debug
付きで再度実行してみます。
実際に実行されているコマンドが表示されていることがわかるかと思います。まず、dpkg-queryでdstatがインストールされているかを確認した後、apt-get installでdstatをインストールしています。長くなるため上記ではコマンドの出力を省略していますが、実際にはすべての出力が表示されています。
先ほどのレシピではdpkgやaptなどといったOS固有のコマンドは記述しませんでしたが、OS固有の(この場合はUbuntuの)パッケージ管理システムのコマンドを実行しています。Itamaeは実行対象のホストOSを判定して、適切なコマンドを実行します。そのため先ほど記述したレシピは(パッケージ名が同じであれば)他のOS上でも動作します[1]。
次に、dstatがインストールされている状態で再度Itamaeを実行してみます。
すでにdstatがインストールされている状態で先ほどのレシピを実行すると、インストールコマンドは実行されませんでした。これはItamaeがインストールを実行する前にdstatがインストールかどうかを判断しているためです。このようにItamaeは何度実行してもレシピに書かれた状態に収束するように作られています(冪等性)。
dry-runモード
ところで、Itamaeをいきなり実行すると、何が変更されるか不安になるかと思います。そこで、変更内容を事前に確認するためにItamaeにはdry-runモードと呼ばれる、実際には変更を加えずに変更点を表示する機能が備わっています。
このように、すでにdstatがインストールされている状態でdry-runを実行すると、上記のように何も変化しないことがわかります。これはItamaeが現在の状態(パッケージがインストールされているかどうか、バージョンはいくつか)を取得して、収束すべき状態(レシピに書かれている状態)との差分を表示しています。
再びdstatをアンインストールして、dry-runを実行してみると、dstatがインストールされていない状態からインストールされている状態に変化することがわかります。このように実行前にdry-runを行うことをお勧めします。
いろいろな実行方法
ここまではローカルのホストに対してItamaeを実行しました。Itamaeは他に2つの実行方法をサポートしています。それぞれを紹介します。
ローカル実行
ローカル実行(local)はItamaeを実行したホスト自体をプロビジョニングする実行方法です。先ほどdstatをインストールした際に使ったのはローカル実行です。以下のように実行します。
SSH経由の実行
ItamaeはSSH越しのホストに対して実行することも可能です。これにより構築対象のホストにItamaeをインストールせずに実行できます。以下のように実行します。
また、Vagrant用のオプションとして、--vagrant
が用意されています。以下のようにVagrantの仮想マシンがあるディレクトリで--vagrant
を指定することで、仮想マシンに対してSSH経由でItamaeを実行できます。
ほかに利用できるオプションはヘルプを参照してください。以下のコマンドでヘルプを表示できます。
Dockerコンテナへの実行
これはまだ実験的な機能ですが、Dockerコンテナに対してItamaeを実行することができます。この機能を使ってDockerイメージを作成することができます。以下のように実行します。
まとめ
Itamaeの基本は以上です。非常にシンプルで簡単だったと思います。
最後にItamae関連の各種リソースについて紹介しておきます。
次回は
次回は、他のリソースの利用方法や依存関係の明示方法など、レシピの書き方について掘り下げていきます。