こんにちは、エンジニアのjunです。弊社では、インフラ(特にサーバー)を管理する際、Chefというツールを使用しています。Chefは、サーバー等のインフラ環境をコードで管理し、環境構築を自動化することのできるツールです。コード(主にruby)で記述するので、テストを実施することができたり、git等でバージョンをしっかり管理することができます。

ワークショップについて

とりあえずスライドを、、、

社内のエンジニアでも、Chefを使ったことのある人と、そうでない人が在籍しており、このワークショップは初めてChefを触る人向けに、Chefのごく基本的な部分を内容に盛り込みました。

ワークショップは、このChefというツールを用いて、ローカルの開発環境を整えることを目標に、以下の3つのパートに分けて実施しました。

  1. 前提ツールの導入
  2. Chefをまず触ってみる
  3. Chefの仕組みを見る

実はもう1パートあったのですが、内容を詰め込みすぎな気がしたので割愛しました。まず前提となるツールの導入と解説行い、つぎに実際にChefを参加者に触ってもらい、その後Chefが実際にどのような構成になっているかを解説しました。この記事では、それぞれについて、軽く紹介したいと思います。スライドに書いてないですが、ここからは、rubyがインストールされている事が前提です。(ちなみに一部windowsで動かない場合もあるのでご留意ください。)

1. 前提ツールの導入

VirtualBoxとVagrant

まず、VirtualBoxですが、言わずと知れたかOracle社の仮想化ソフトですね(もともとはSun microsystemsが作ったものですが)。無料で仮想環境を作ることができます。

もう一つVagrantというツールを使用します。Vagrantには様々な使い方があるのですが、ここでは、VirtualBox等の仮想ソフトをコマンドラインのツールで、拡張して使うものとしておきます。このVagrantを使用することで、仮想環境をより簡単にセットアップすることができます。VagrantではVMware等の他の仮想ソフトを使用することもできますが、今回は無料のVirtualBoxと組み合わせて使用したいと思います。

Boxファイル

Vagrantを使用するためには、Boxファイルというものが必要です。Boxファイルとは、仮想マシンのイメージファイルと思っていただけると良いかと思います。VirtualBoxやVMwareといった仮想環境向けにOSのインストールと最低限の設定が行われています。そのためVagrantでは、スムーズに環境を整えることができます。boxファイルは一度取得しておけば、同一OSの仮想マシンをいくつでも作ることができます。

たとえば、CentOS 6.5のboxをcentos65という名前で追加する場合は、以下のようにコマンドを実行します。ファイルをダウンロードするので、処理にいささか時間がかかります。※URLは執筆時のものです、実際に作業する場合は、Boxファイル一覧から最新のURLを取得してください。

ちなみに追加した、boxファイルは、以下のコマンドで一覧にして確認できます。

Vagrantfile

では早速Vagrantを使用してみましょう。Vagrant用にディレクトリを作り、その中で以下のコマンドを実行します。

vagrantのinitコマンドを実行することで、環境を初期化します。Vagrantfileという名前の設定ファイルが作成されるので、編集してみます。

変更点は、boxファイルの指定と、ipアドレスの設定です。boxファイルは、先ほどaddした時の名前を、ipアドレスの設定は、任意のローカルipアドレスを設定しましょう。コメントアウトを外すのをわすれないようにしてください。この他にも、このVagrantfileで、使用するメモリーサイズやGUIを使用するかどうかといった設定も可能です。

Vagrant コマンド

vagrantコマンドのコマンドがいくつかあるので紹介します。

試しに、upとsshを使ってみましょう。

仮想マシンが起動して、その仮想マシンにssh接続した状態になったと思います。

Chef

Chefとは

冒頭でも軽く触れましたが、Chefとは、インフラ環境を自動構築できるツールです。似たようなツールとして、Puppetというものも有ります。(筆者はPuppetを触ったことがないので、これ以上は触れないでおきます。)
Chefと一言で言っても2種類あります。Server-Clientの関係があるChef Serverと、その関係を持たないChef Soloの2つです。Chef Serverは、1つのServerと複数のClientから成り立ち、ServerですべてのClientを集中管理します。Chef Soloにはそういった関係がなく、サーバーを個別にセットアップしていくイメージです。

ここでは、後者のChef Soloを用います。

Chef Solo環境の構築

ruby のツールなのでgemでインストールできます。

さてさて、このくらいで準備は整いました。

2. Chefを使ってLAMP環境を構築する

ここまでChefがどんなツールかは簡単に解説しました。しかし実際に使おうとすると、分かりにくい部分が大きかったりします。そこでこのパートでは、実際にChefを使ってみたいと思います。(ワークショップで行った「Chefをまず触ってみる」と「Chefの仕組みを見る」の部分を合わせて解説します。)

リポジトリを作成

まずは、大元のChefのリポジトリを作成します。任意のディレクトリで、以下のコマンドを実行します。ここでいうリポジトリとは、Chefのリポジトリのことを指しますが、git等バージョン管理システムで管理する場合も同じディレクトリを使用します。

リポジトリを作成するには、knife soloのinitコマンドを使用します。

たとえば、first_chefというリポジトリを作成する場合は、以下のコマンドを実行します。

ここでgitでの管理をする場合、生成されたディレクトリでgit initします。

クックブックを作成

次にクックブックを作成します。クックブックとは、「Apacheを入れる」であったり、「バーチャルホストを設定する」といったサーバーで実際に何をするのかを記述したレシピをまとめたものです。

ここでは、my_cookbookという名前のクックブックを作成したいと思います。通常、自分で作成したクックブックは、site-cookbookといディレクトリに置きます。

リポジトリには、いろいろディレクトリやファイルが作成されていますが、recipesのdefaultというファイルを編集します。

$ vim ./site-cookbooks/my_cookbook/recipes/default.rb

実行

実行する前に、実行リストというのを作成する必要があります。この実行リストは nodesというディレクトリにjson形式で保存します。サーバー1つにつき、nodeを1つで管理すると、わかりやすいでしょう。

実行の準備が整いましたので、chefを実行し、ローカルのLAMP環境を整えたいと思います。最初に作成したvagrantのサーバーに、my_sabaという名前でssh接続できるように設定してあるとします。 

sshで接続できるかのテスト

prepareコマンドで対象サーバーがChefを実行できる準備を行い、cookコマンドで実際にChefを実行させます。

通常のsshと同じで、ipアドレスやドメインでの設定も可能です。

サーバーに入り、以下のコマンドを実行してみましょう。簡単なLAMP環境が構築できていることがわかります。

vagrantにはchefのprovisioning機能というものが有りますが、今回は、使用しません。

コミュニティクックブックとBerkshelf

先ほどは自分でクックブックを書きましたが、コミュニティクックブックというものが存在します。コミュニティクックブックとは、オープンソースで管理してあるクックブックです。

コミュニティクックブックを使用するためには、berkshelfというツールを利用します。

gemでのインストールが終了したら、Chefのリポジトリのディレクトリで以下のコマンドを実行します。

Berksfileという設定ファイルが作成されるので、使用するクックブックを記述します。

run listを書き換えて、再度Chefを実行してみましょう。先ほど実行した時と同じ結果が得られるはずです。

今回は使用しませんでしたが、コミュニティクックブックを使用すると、apacheのバーチャルホストの設定やphpやmysqlの細かい設定を行うことも可能です。また、オープンソースの環境(主にgithub上)でメンテナンスされているので、自分でクックブックを書くよりも確実にかつ迅速にChefリポジトリを構成することが可能です。

まとめ

Chefを始めるにあたって、最低限の知識をまとめました。基本的な使用方法を解説するにとどまってしまったので、機会があればChefの思想や応用についてまとめたいと思います。Chefは、簡単にローカルの開発環境を構築する事が出来るだけでなく、そのまま本番環境を構築するなど幅広く応用が効きます。取っ付きにくかったり、最初の学習コストが高く感じるかもしれませんが、ぜひ使ってみてください。