5次元のカオス

南の島の学生がつらつらと日々を書き連ねます

Chefの導入とそれを使ってちょっとしたモノの設定や導入をしてみた

Chefの導入とそれを使ってちょっとしたモノの設定や導入をしてみた

vagrantのブログに引き続いて、今度はChefです

前回、同様 基本的にはドットインストールの流れに沿っています

なかなか時間を見つけられなく、できていなかったけど、

早起きすれば、朝にドットインストール通すぐらいの時間はあることに気づいた!(遅

以下、自分への健忘録としてメモ。

Chefの概要

インフラをコードで記述し、管理するツールです。

コードはRubyのコードを使用するため、Rubyの知識があれば、ある程度使えると思います

一度、定義したモノは使いまわすことができるため、環境構築や運用の時間短縮に繋がる…はず(まだまだ使いこなせてない)

公式サイト:www.opscode.com

あると良い前提知識

Chefの概念

公式サイトよりChefの基本的な概念図です

overview_chef_draft.png

用語集

chefならではの言葉がいくつかあります

  • ChefServer : Chefを実行するサーバ
  • Nodes : Chefクライアントを起動するサーバ
  • WorkStation : 作業用のPC

  • CookBook : システムの設定やデータをまとめたもの

  • recipies : レシピはパッケージの導入などをを書くファイルです。レシピはOSを意識せずに記述することができます

詳しく学びたいという人は、以下を参照すると良いかもしれません

インフラをモデリングする

Chefによる基本的な操作の流れ

  1. WorkStationにクックブックを用意
  2. knifeコマンドを使ってchefServerに送る
  3. chefServerのNodeにインストールされる

※ 今回のブログではChefServerを介さないで, 一つのNodeを使用します

※ ドットインストールでも同様のことを行っています

Chef, Knife Soloを導入する

上記の流れで紹介した、一連の流れに必要なモノをそれぞれインストールします

インストールするもの(MAC)

  • Chef
  • knife-solo
  • knife

rubyとgemのversionを確認

Chefの導入

curl -L https://www.opscode.com/chef/install.sh | sudo zsh

bashを利用している人は、最後の部分をbash に変更すれば大丈夫です

Knife-soloの導入

sudo gem install knife-solo

Knife-soloの設定

knife configure

※ 導入時の設定は基本的にデフォルトで大丈夫なので、returnを連打で構わないと思います

nodeの設定

  • Vartual Boxがインストールされている
  • CentOS 64bitをインストールしている前提

※ 前回のVagrantのブログを引き継いでいます

仮想マシンの起動

cd 'vagrantのフォルダに移動'
vagrant up
vagrant status

サーバログインに、ユーザ名やパスワードを記述するのが面倒なので、hostsの設定を行います

以下のコマンドで、hotsにvagrantのsshの設定を書き出します

vagrant ssh-config --host harmony >> ~/.ssh/config

※ 前回のブログでhostsの作成 と 編集をしていればやらなくても大丈夫です

Chefのリポジトリを作る

リポジトリを作るまでの一連の流れ

  1. Chefのリポジトリ作成
  2. nodeをchefに対応させる
  3. cookbookを作る
  4. cookbookをnodeに反映させる

Chefのリポジトリの作成

1.Chefのリポジトリ作成 を行います

  • site-cookbooksの中に自分で作成したクックブックを入れていきます
  • cookbooksはネットに公開されているものを入れる習慣があるそうです

※ Vagrantと一緒に使っていきたいので、vagrantの作業ディレクトリと同じ階層にchef-repoを作成

knife solo init chef-repo

nodeをchefに対応させる

2.nodeをchefに対応させる を行います

cd chef-repo
knife solo prepare harmony

cookbookを作る

3.cookbookを作る を行います

cd /chef-repo
knife cookbook create hello -o site-cookbooks/
cd site-cookbooks/

※ hello という作業フォルダを作成

※ -o オプション : クックブックの出力先の指定

recipes/default.rbの編集

vim hello/recipes/default.rb

以下の命令を書き込みます。(実行後、コンソールに表示するメッセージを書き込めます)

log Hello, World!

nodes/harmony.jsonの編集

vim hello/nodes/harmony.json

実行するレシピを書き込みます

{
    "run_list":[
        "recipe[hello]"
    ]
}

nodeに反映させる

4.cookbookをnodeに反映させる を行います

knife solo cook harmony

※ 当たり前ですが、harmonyの設定をhostsに記述していないと失敗します

※ /chef-repoで実行しないと失敗します

確認

先ほどdefault.rbに書き込んだ文字列がコンソール上に表示されれば、テスト完了です。

log[Hello, World!] action write 

vimを導入してみる

実践的なレッスンとして、vimを導入する流れを記述します。

仮想マシンvimがないのを確認

yum list installed | grep vim

※ 僕の場合は、デフォルトでvimが入っていたので、そいつを削除します(defaultなvimはアレなので...)

vimのアンインストール

sudo yum remove vim-minimal.x86_64    

vimの導入の一連の流れ

基本的にはずっとこの流れ

  1. Chefのリポジトリ作成
  2. nodeをchefに対応させる
  3. cookbookを作る
  4. cookbookをnodeに反映させる

※ 今回は、2までは終わっているので3の部分から行います

default.rbの編集

vim hello/recipes/default.rb に追記

package "vim-enhanced" do
    action :install
end

以下の命令を指定できます

  • package : アプリケーションのなんらか
  • service : templateというものもある(設定ファイルの値を書き出しておいたりできる)
  • action : なにをするか

vim-enchancedってやつがいいやつらしい(詳しくはググって下(ry

※ action: installはOSの依存性なども解決してくれるのですごくいいと思いました(aptとかyumとかそこらへん)

harmony.jsonの編集

helloを実行することを確認します

vim hello/nodes/harmony.json

以下を確認

{
    "run_list":[
        "recipe[hello]"
    ]
}

cookbookをnodeへ反映させる

knife solo cook harmony 

仮想マシンにアクセスして確認

vim-enhancedが含まれていればインストール完了です

yum list installed | grep vim

Resourcesを確認していこう

公式サイト

右側の方に目次があるので目当てのリソースを探していく形

serviceでiptablesを操作しよう

actionにつづいて、serviceというリソースを見ていきます

iptablesを停止させる

vim /chef-repo/site-cookbooks/hello/recipes/default.rb

以下を追記

service "iptables" do
    action :stop
end

動作の確認

sudo service iptables status

※ 言語がrubyなので、actionを配列にして複数実行するということもできる

例:起動するたびにiptablesを切りたい

vim /chef-repo/site-cookbooks/hello/recipes/default.rb

以下を追記

actionの部分を配列にできる

service "iptables" do
    action [:stop, :disable]
end

複数のpackageを導入しよう

php, mysql-server, httpdの導入

Rubyがそのまま使えるのでeach文なんかも使える

vim /chef-repo/site-cookbooks/hello/recipes/default.rb

以下を追記

%w{php mysql-server httpd}.each do |p|
    package p do
        action :install
    end
end

また、導入したhttpdを常時起動したい場合

vim /chef-repo/site-cookbooks/hello/recipes/default.rb

serviceを使って以下のように書くことができる

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

※ :enable 常時実行

templateを使ってみよう

vim chef-repo/nodes/harmony.json

Webサーバにhtmlを転送して表示する(転送の仕方については前回のブログを参照)

転送したhtmlファイルを/tmplate/defaultの中に入れる

拡張子をerbに変更

例:index.html.erbなどを指定

cd hello/template/default
mv ./test.html ./index.html.erb

default.rbの編集

vim /hello/recipes/default.rb

ファイルの転送先、パーミッションと送信するファイルを記述

template "index.html" do
    path "/var/www/html/index.html"
    source "index.html.erb"
    mode 0644
end

パーミッション644:rw-r--r--

templateで変数を使う

harmony.jsonの編集

vim hello/nodes/harmony.json

変数を追加

{
    "owner": {
        "name": "Gen Taguchi"
    },
    "run_list":[
        "recipe[hello]"
    ]
}

※ ownerが変数というように説明されていたが、これが予約後のようなものなのかは後で調べる

index.html.erbの編集

vim hello/template/default/index.html.erb

変数を受け取って表示させるということをやってみる

以下を記述

<html>
    Hello from by <%= node['owner']['name'] %>.
</html>

ohai?から値を取ってくる

index.html.erb

<html>
    Hello from <%= node[:platform] %>!
</html>

※ ohaiっていうのがなんなのかよくわかっていない、調べてもヒットしないので誰か教えてください←

2013.12.19追記

ノード毎の情報(IPアドレスやパッケージのインストール状態等)の取得には、Ohaiというライブラリを利用している。

Webサーバーの設定を変えてみよう

Apacheの設定をtemplate化していく

macのhttpdファイルをvagrantのマシーンに転送する

cp /etc/httpd/conf/httpd.conf ~/vagrant

※ dotinstallでは /vagrant以下にchef-repoとvagrantを作っている模様

recipes/default.rbの編集

httpd.confを転送するため、以下を追記

template "httpd.conf" do
    path "/etc/httpd/conf/httpd.conf"
    source "httpd.conf.erb"
    mode 0644
end

実行時にportを変更する

httpd.confファイルの編集

vim hello/template/default/httpd.conf

Listenで検索をかけ、ポート番号を以下のように変更

#Listen 12.34.56.78:80
Listen <%= node['httpd']['port'] %>

/chef-repo/nodes/harmony.json に追記

node['httpd']['port']に80が代入される

{
    "httpd": {
        "port": 80
    },
    "owner": {
        "name": "Gen Taguchi"
    },
    "run_list":[
        "recipe[hello]"
    ]
}

notifiesを使ってみよう

Apache をtemplate化したので、確認を行う

harmony.jsonを書き換えるとポートが変更されるのが分かる

※ knife-solo cook コマンドを使用してその度にnodeに送信する

default.rb

サーバの設定を送信したり、再起動する度にこのコマンドを実行するnotifiesというプロパティを追加する。

default.rbの編集

vim /hello/recipes/default.rb

notifiesというプロパティを追加

template "httpd.conf" do
    path "/etc/httpd/conf/httpd.conf"
    source "httpd.conf.erb"
    mode 0644
    notifies :restart, 'service[httpd]'
end