2013年7月14日日曜日

ただいまChefを勉強中・・・

自宅サーバの再構築をもくろみ、毎度毎度セットアップするのがしんどいのと、何をどうセットアップしたのかが分からなくなるので、Chefで自動化を図りつつ、ちゃんと記録を付けることを目的に勉強しています。

前回は環境の構築と動作確認を行いました。今回はもう少し進めて、公式サイトを参考に、最少インストール実行後に行う通過儀礼不要なサービスを停止させるをやってみたいと思います。

では、どういうアプローチをしようかと考えましたが、


  • サービスを停止するといっても、サーバOSやバージョンによって停止させるサービスは異なる。
    • 停止するサービスはサーバに依存する。

この点を踏まえ、停止するサービスはサーバノードに持たせることにします。
まずは、サービス停止させるクックブックを作成します。

knife cookbook create services
すると、./cookboos/配下にservicesというディレクトリが以下のようにできます。

 .
|-- CHANGELOG.md
|-- README.md
|-- attributes
|-- definitions
|-- files
|   `-- default
|-- libraries
|-- metadata.rb
|-- providers
|-- recipes
|   `-- default.rb
|-- resources
`-- templates
    `-- default
現時点で理解している範囲内で説明すると、

  • CookBook
    • Apacheの設定とかPHPの設定とかあるまとまった機能単位で作る。
    • サーバ環境に依存するようなものは入れない。
    • RecipeやTemplate、Attributeなのを複数持たせることができる。
  • CHANGELOG.md
    • 変更点を書くこと。バージョン管理大事
  • README.md
    • このCookBookは何者?とか書く・・・のかな?
  • attributes
    • レシピは可能な限り汎用性を持たせたほうがよいようですが、たとえば、DB名とか処理上外部に依存したパラメタが必要になる場合があります。それら外部からのパラメタを受け渡す変数及び初期値を定義するもののようです。(参考
  • definitions
    • 良く分かっていません。
  • files
    • サーバに決まったファイルを配置する場合とかに利用するそうです。
  • libraries
    • 良く分かっていません。
  • metadata.rb
    • このCookBookのメンテなとかライセンスとか記載するようです。
  • providers
    • 良く分かっていません。
  • recipes
    • 設定を記述したRubyっぽいDSL。
    • お作法としては、default.rbではインクルードのみ記述し、実際の個別設定は別ファイルにするらしい。
    • このCookBookのこのrecipeという指定の仕方ができる。このCookBookという指定の場合、default.rbに仕方うようです。
  • resources
    • 良く分かっていません。
  • templates
    • 例えば、Apacheのバーチャルホスト設定とか設定のテンプレートを配置する場所のようです。
では、今回はサービスを停止させるレシピを書いてみましょう。
recipesディレクトリ内にstop.rbというファイルを作成し、こんな感じに書いてみました。


#
# Cookbook Name:: service
# Recipe:: stop
#
# Copyright 2013, YOUR_COMPANY_NAME
#
# All rights reserved - Do Not Redistribute
#
Chef::Log.info("Start")
node['stop_services'].each do |s|
  Chef::Log.info("Stoping Services #{s}")
    service s do
      action :stop
    end
end
Chef::infoの箇所は、実行時に画面にメッセージをデバック的に出したかったので入れています。
このCookBookのデフォルト動作には入れないので、default.rbはそのままです。
このレシピは、外部からの変数を使用していますので、それを定義しておきます。
attributesディレクトリにdefault.rbというファイルを作成し、こんな感じに書いてみました。

#Stop Services List
default["stop_services"] = ""
attributesで定義した変数は、node['hogehoge']で呼び出せる。
属性の名の通り、必須パラメタにしてみたり、色々な属性を与えられるらしい。

CookBookの作成はここで終了。(本当はReadmeとか更新したほうがいいんだけど)
作成したCookBookをChefサーバへアップロードする。

knife cookbook upload service
chefのWeb画面より、Cookbookのタブに表示されていればOK


さて、これを実際のノードに適用します。
説明はコマンドのほうがやりやすいので悩んだのですが、いきなりJSONを編集しろとかは酷な気がしたので、Webで説明します。
まずは、Nodesタブを開き、適用対象のクライアントのリンクをクリックします。
すると、なんだが沢山情報が出てくると思います。
OSの種類やVerから稼働時間から・・・
これらは、ohaiとよばれるもので収集しているようです。基本的にはここにあるパラメタがレシピから参照することができますので、OSによって実行コマンドが異なるとかの条件分岐に使用できます。
例えば、公式サイトではこんな具合に使っています。
service "crond" do
  case node['platform']
  when "redhat", "centos", "scientific", "fedora", "amazon"
    service_name "crond"
  when "debian", "ubuntu", "suse"
    service_name "cron"
  end
  action [:start, :enable]
end
さて、ここにストップするサービスのリストを定義したいと思います。
上にあるeditというリンクをクリックします。
下の方にこんな画面があると思います。


緑の+ボタンをおして、次のように入力したら、Save Attributeのボタンを押して登録します。


左側にあるJSONのツリー表示がこんな感じになればOK。
忘れずにSave Nodeボタンを押して設定を反映させます。

では、実際に動かしてみます。
knifeコマンドで、クライアントPCにSSHで接続してコマンド実行とかできるのですが、今回はクライアントの端末で動かします。
クライアント端末にログインしたら、以下のコマンドを実行してください。(当然root権限必要)

 chef-client -o 'recipe[service::stop]'
実行結果はこんな感じです。(私の環境の場合)
[root@centos6 ~]# service httpd start
Starting httpd:                                            [  OK  ]
[root@centos6 ~]# service vsftpd start
Starting vsftpd for vsftpd:                                [  OK  ]
[root@centos6 ~]# chef-client -o 'recipe[service::stop]'
Starting Chef Client, version 11.4.4
[2013-07-14T02:41:03-04:00] INFO: *** Chef 11.4.4 ***
[2013-07-14T02:41:03-04:00] WARN: unable to detect ip6address
[2013-07-14T02:41:03-04:00] WARN: Run List override has been provided.
[2013-07-14T02:41:03-04:00] WARN: Original Run List: [recipe[service::stop]]
[2013-07-14T02:41:03-04:00] WARN: Overridden Run List: [recipe[service::stop]]
[2013-07-14T02:41:03-04:00] INFO: Run List is [recipe[service::stop]]
[2013-07-14T02:41:03-04:00] INFO: Run List expands to [service::stop]
[2013-07-14T02:41:03-04:00] INFO: Starting Chef Run for centos6.localdomain
[2013-07-14T02:41:03-04:00] INFO: Running start handlers
[2013-07-14T02:41:03-04:00] INFO: Start handlers complete.
resolving cookbooks for run list: ["service::stop"]
[2013-07-14T02:41:03-04:00] INFO: Loading cookbooks [service]
Synchronizing Cookbooks:
  - service
Compiling Cookbooks...
[2013-07-14T02:41:03-04:00] INFO: Start
[2013-07-14T02:41:03-04:00] INFO: Stoping Services httpd
[2013-07-14T02:41:03-04:00] INFO: Stoping Services ftpd
Converging 2 resources
Recipe: service::stop
  * service[httpd] action stop[2013-07-14T02:41:03-04:00] INFO: Processing service[httpd] action stop (service::stop line 12)
[2013-07-14T02:41:03-04:00] INFO: service[httpd] stopped

    - stop service service[httpd]

  * service[ftpd] action stop[2013-07-14T02:41:03-04:00] INFO: Processing service[ftpd] action stop (service::stop line 12)
 (up to date)
[2013-07-14T02:41:04-04:00] INFO: Chef Run complete in 0.415815576 seconds
[2013-07-14T02:41:04-04:00] INFO: Running report handlers
[2013-07-14T02:41:04-04:00] INFO: Report handlers complete
Chef Client finished, 1 resources updated

あれ?よく見ると、ftpdが止まっていませんね。
CentOS6はvsftpdという名前なので、一致しなかったんですね。
では、レシピを書き換えてみましょう。

Chef::Log.info("Start")
node['stop_services'].each do |s|
  Chef::Log.info("Stoping Services #{s}")
    service s do
        case node['platform']
          when "centos"
            service_name "vsftpd" if s=='ftpd'
          end
      action :stop
    end
end
ちゃんとCHANGERLOG.mdを編集し、metadata.rbのバージョンを更新してアップロード。

[root@centos6 ~]# chef-client -o 'recipe[service::stop]'
Starting Chef Client, version 11.4.4
[2013-07-14T02:54:55-04:00] INFO: *** Chef 11.4.4 ***
[2013-07-14T02:54:55-04:00] WARN: unable to detect ip6address
[2013-07-14T02:55:00-04:00] WARN: Run List override has been provided.
[2013-07-14T02:55:00-04:00] WARN: Original Run List: [recipe[service::stop]]
[2013-07-14T02:55:00-04:00] WARN: Overridden Run List: [recipe[service::stop]]
[2013-07-14T02:55:00-04:00] INFO: Run List is [recipe[service::stop]]
[2013-07-14T02:55:00-04:00] INFO: Run List expands to [service::stop]
[2013-07-14T02:55:00-04:00] INFO: Starting Chef Run for centos6.localdomain
[2013-07-14T02:55:00-04:00] INFO: Running start handlers
[2013-07-14T02:55:00-04:00] INFO: Start handlers complete.
resolving cookbooks for run list: ["service::stop"]
[2013-07-14T02:55:01-04:00] INFO: Loading cookbooks [service]
Synchronizing Cookbooks:
[2013-07-14T02:55:01-04:00] INFO: Storing updated cookbooks/service/recipes/stop.rb in the cache.
[2013-07-14T02:55:01-04:00] INFO: Storing updated cookbooks/service/CHANGELOG.md in the cache.
[2013-07-14T02:55:01-04:00] INFO: Storing updated cookbooks/service/metadata.rb in the cache.
  - service
Compiling Cookbooks...
[2013-07-14T02:55:01-04:00] INFO: Start
[2013-07-14T02:55:01-04:00] INFO: Stoping Services httpd
[2013-07-14T02:55:01-04:00] INFO: Stoping Services ftpd
Converging 2 resources
Recipe: service::stop
  * service[httpd] action stop[2013-07-14T02:55:01-04:00] INFO: Processing service[httpd] action stop (service::stop line 12)
[2013-07-14T02:55:01-04:00] INFO: service[httpd] stopped
    - stop service service[httpd]
  * service[ftpd] action stop[2013-07-14T02:55:01-04:00] INFO: Processing service[ftpd] action stop (service::stop line 12)
[2013-07-14T02:55:01-04:00] INFO: service[ftpd] stopped
    - stop service service[ftpd]
[2013-07-14T02:55:01-04:00] INFO: Chef Run complete in 0.601231803 seconds
[2013-07-14T02:55:01-04:00] INFO: Running report handlers
[2013-07-14T02:55:01-04:00] INFO: Report handlers complete
Chef Client finished, 2 resources updated

上手くいきました。





0 件のコメント:

コメントを投稿