techium

このブログは何かに追われないと頑張れない人たちが週一更新をノルマに技術情報を発信するブログです。もし何か調査して欲しい内容がありましたら、@kobashinG or @muchiki0226 までいただけますと気が向いたら調査するかもしれません。

Chef soloでapacheをインストールしてみる

MacでRailsを勉強していたのですが、開発環境の管理で苦労した経験からVagrantとChefで開発環境を管理できたら便利そうだと思い立ち、この機会にChefを勉強することにしました。

今回は、とりあえず試しにapacheのインストールを自動化してみたので、その際の手順について書いていきます。 ちなみにここでは主にChef soloについて書いていきます。 ※Vagrantの詳細については記述していません。

【環境】
(ホストOS) OS X EI Capitan 10.11.4
(ゲストOS) Cent OS 6.6

Chefとは

今更ながらではありますが、Chefとは一言で言うとインフラ構築自動化ツールです。
例えばLinuxサーバーを構築する際に、環境ごとに必要なソフトを一つ一つインストールしたり設定ファイルを書き換えたりするのは非常に面倒ですし、事故のもとでもあります。Wordで手順書を書かされるのもなかなかうんざりする作業です。

Chef(シェフ)その名の通り、料理を自動で作ってくれる料理人のイメージです。 インフラ構築に必要なレシピ(ソフトのインストールや設定内容)がまとめられたクックブック(料理本)を用意しておけば、あとはChefがそのクックブックに従って環境を自動で構築してくれるという感じです。

ちなみに、Chefを使ってインフラ構築する対象を「ノード」と呼ぶようなので、ここでも今後はノードと呼ぶようにします。

Chef solo

Chefには大きく分けて2つの種類があります。
・Chef Client/Server型 ・・・ Chefサーバーを用意してそこにレシピやクックブックを配置しておきます。Chefクライアント(ノード)は、Chefサーバーからレシピやクックブックに従って環境を構築するタイプ
・ Chef solo型 ・・・ ノード毎に直接クックブックやレシピを配置して、スタンドアロンで設定を行うタイプ

(1)はなんだかハマりそうな応用編っぽい匂いがしたので、とりあえずChef soloから始めてみます。まぁ一人でRailsの開発をする分には十分でしょう。

Vagrantの用意

まずは、ノードとなる仮想環境(今回はCent OS 6)をVagrantで立ち上げます。

Macのコンソールで以下を実行していきます。
boxファイルはここのやつからとりあえず6.6を選択。

$ mkdir centos6
$ cd centos6
$ vagrant box add centos6-chef https://github.com/tommy-muehle/puppet-vagrant-boxes/releases/download/1.0.0/centos-6.6-x86_64.box
$ vagrant init centos6-chef
$ vagrant up

これでvagrant sshで接続できるようになりますが、sshコマンドで接続できた方が後々便利なので、sshのコンフィグファイルに追記します。

$ vagrant ssh-cinfg --host centos6-chef >> ~/.ssh/config

これで、ssh centos6-chefを叩けばcent OSに接続できます。

以降、作成した仮想環境のCent OS 6をゲストOSと呼びます。

ホストOSにKnife soloのインストール

Chef soloを利用する場合、直接sshでゲストOSに乗り込んでChef soloのインストールからクックブックの配置や実行を行うことももちろんで切るのですが、ゲストOS毎にわざわざそんなことをやるのは面倒です。
最終的にはそう言った作業もホストOS上からコマンド一つで実行できるように自動化したいということで、役に立つのがKnife soloです。

KnifeはChefのリポジトリ操作を担うコマンドラインツールです。
Knife soloはKnifeのプラグインで、同じくChefリポジトリの作成やクックブックの作成を行ったり、作成したクックブックをリモートでゲストOSに適用したりするChef solo用のコマンドラインツールです。

ということで、ホストOSにChef soloをインストールします。

Knife soloはgemで以下のようにインストールします。※ホストOS上で行っていることに注意

$ gem install knife-solo
$ gem install berkshelf

Berkshelfは今回登場しませんが、外部のcookbookを名指しでダウンロードしてこれる超使えるヤツなのでついでにインストールしておきます。

Chefリポジトリの作成

Knife soloもインストールできたところで、Chefリポジトリの作成に取り掛かります。 Chefリポジトリの中には複数のクックブックが配置され、さらにクックブックの中に複数のレシピが配置される、というようなリポジトリ構成になります。

$ mkdir test_chef
$ cd test_chef
$ knife solo init .

knife solo initコマンドでtest_chefディレクトリにChefリポジトリが出来上がります。以下のようなディレクトリ構成になっているかと思います。 f:id:uentseit:20160504235844p:plain:w200

cookbookの作成

次に、クックブックを作成します。 今回はとりあえずapacheをインストールしてみます。

test_chefディレクトリで以下を実行します。

$ knife cookbook create apache -o site-cookbooks

これでapacheという名前のクックブックが、site-cookbooksフォルダに一つ出来上がっているかと思います。 ただし、apacheクックブックはまだ何のレシピも書き込まれていないので、このまま実行しても何も起きません。

ゲストOSへのChefインストール

作成したクックブックはゲストOS上で実行する必要があるので、ゲストOS上にChef soloが必要です。
ということで、先に以下のコマンドをホストOS上で実行しておきます。

$ knife solo bootstrap centos6-chef

Knife soloを使えば、これだけでゲストOSにChef soloとKnife soloがインストールされます。

レシピの編集

apacheクックブックはまだ何のレシピも書き込まれていないので、このまま実行しても何も起きません。
ということで、レシピを追記します。

レシピは、./site-cookbooks/apache/recipesディレクトリにrubyファイルとして用意されています。 default.rbファイルを開いて以下を追記します。

 package "httpd" do
   action :install
 end
 
 service "httpd" do
   action [:enable, :start]
 end

1〜3行目でapache(パッケージ名httpd)のインストールを行うための記述を行っています。 5〜7行目で、インストールしたapacheの起動を行っています。

Node管理ファイルの編集

knife solo bootstrap centos6-chefコマンドの実行に成功すると、nodesフォルダに「centos6-chef.json」なるファイルができます。 このJSONファイルには、ノードをどういう状態にしたいか、といった管理情報を記載します。 今回はcentos6-chefというノードをapacheクックブックが実行された状態にしたいので、以下のように編集しておきます。

{
  "run_list": [
    "recipe[apache]" 
  ],
  "automatic": {
    "ipaddress": "centos6-chef"
  }
}

追記箇所は3行目です。 run_listに、対象のノードで実行したいクックブックのレシピをrecipe[クックブック名]のフォーマットで指定します。

実行してChefリポジトリの内容を適用

最後に、ゲストOSに対してクックブックを適用します。 Vagrantがupしている状態で、以下のコマンド実行します。

$ knife solo cook centos6-chef

これで、ホスト名centos6-chefのゲストOSに対して、Chefリポジトリの内容が反映されました。
ssh centos6-chefでゲストOSに乗り込んで、以下のコマンドを実行すると、httpdのプロセスが動いていることがわかると思います。

$ ps aux | grep httpd

さて、今日のところはここまでにします。