ラベル OpenVZ の投稿を表示しています。 すべての投稿を表示
ラベル OpenVZ の投稿を表示しています。 すべての投稿を表示

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

上手くいきました。





2013年6月27日木曜日

Hyper-V+OpenVZでメモリ不足になる。

Hyper-V上でOpenVZを動かす場合、Hyper-V側の動的メモリ割り当てを有効にすると、
たとえ4GByteメモリを割り当てても、OpenVZが動くマシンでメモリを食いつぶします。
しかし、実際には200MBちょっとしか割り当てられていません・・・

どうも、カーネルがHyper-Vと相性が悪い??ようで、Hyper-V側にメモリ要求がうまく伝わらないような感じです。(詳細に調べたわけではありませんし調べ方も知りません)

今のところ、動的メモリ割り当てを切ってしまえば、メモリ不足にはなっていません。


2013年6月13日木曜日

Chefを試してみた

最近巷で流行っているらしいChefを試してみました。

今回はどんなものかを確認するのが目的なので、サクッと前回作ったOpenVZをHyper-V環境上に構築しました。
全てHyper-V上で構築しなかったのは以下の理由からです。

  • 何回も再インストールする可能性がある
  • 再起動せずに動的にメモリを増減できる
  • 再起動が早い
  • OSのセットアップに時間をかけたくない&最少インストール環境でやりたい
  • Linuxしか動かさない
検証環境はこんな感じ。

ググルと、Chef-Soloというクライアントとサーバを同一マシン上に構築する例が非常に多い。
1台くらいなら手動設定しても大した手間ではない気がするが・・・
(そもそも、chefでググルと"シェフ"が出てくるのでw)
あと、日本語のまとまった情報は皆無。
最近Verが11になってインストールもガラッと変わってしまったようで、あまり役に立たない。
結局は公式の英語ドキュメント頼りなのだが、この手の(?)OSSには珍しくドキュメントの量が多いので、読むのもしんどい。

まずは、用語の説明から。
これを最初に押さえておかないと、ドキュメントを読むとき混乱する。
(ええ、随分嵌りましたとも)

ここもしっかり押さえておくといい。

構成要素はこの図が分かりやすかった。

まずはchefサーバの構築から。
これは、噂によるとdebian系じゃないとものすごく大変らしいので、素直に従っておく。
なお、最初メモリを512MBにしたが、スワップしまくりなので、最低1GByteくらいあるといい。

OS:Ubuntu Server(12.10 x86-64)
最少セットアップを行い、アップデートまで済ませておく。
apt-get update
apt-get upgrade
apt-get dist-upgrade
とかとか。
勿論固定IPを割り当てておく。
あと、nslookupとか使えなかったら地味に不便だったので入れておいた。
apt-get install dnsutils
DNSに登録し、ホスト名で引けるようにしておくか、hostsなど何らかの方法で名前解決をできるようにしておくこと。(重要)

1:http://www.opscode.com/chef/install/
より最新版をDL
2:sudo dpkg -i  chef-server_11.0.8-1.ubuntu.12.04_amd64.deb
でインストール(ファイル名は適宜変更のこと)
3:sudo chef-server-ctl reconfigure
で設定を走らせる。
4:chef-server-ctl test
でテストを実行する。
#<Errno::ECONNRESET: Connection reset by peer - SSL_connect>
なエラーが出たら、DNSに登録がないか、名前解決に失敗しているか、opensslが入っていない。

 70 examples, 0 failures
 という感じで出ればOK。
 0 examples, 0 failures
 とでると、失敗している。
https://サーバのホスト名/でアクセス。
右に書いているが、
                  ユーザadmin、パスワードp@ssw0rd1
でログイン。
パスワードを変更する。

サーバに関しては以上。分かってしまえばインストールは簡単。

次。WorkStation。
こいつの役割、複数持たせる必要性を理解していないのだが、Chefサーバを操作する管理コンソールのようなものと理解している。
(の割には、こいつ自体にレシピを作成してサーバにアップロードとかしているので多分違うと思う)

OS:debian6 (x86-64)
メモリは512でも問題なかった。
Ubuntuにしなかったのは、debian系ということで他を試してみたかっただけです。
WindowsやMacでも動くらしい・・・

例によって最少インストール。
アップデート、固定IP、名前解決回りは済ませておく。
地味に構築は悩んだので、一発で動かせるようにした。
sudo apt-get -y install ruby ruby-dev libopenssl-ruby rdoc ri irb build-essential wget ssl-cert curl
cd /tmp
curl -O http://production.cf.rubygems.org/rubygems/rubygems-1.8.10.tgz
tar zxf rubygems-1.8.10.tgz
cd rubygems-1.8.10
sudo ruby setup.rb --no-format-executable
cd
sudo gem install chef --no-ri --no-rdoc
sudo apt-get -y install git-core
git clone git://github.com/opscode/chef-repo.git
mkdir -p ~/chef-repo/.chef


chefサーバの/etc/chef-server/chef-validator.pemを
~/chef-repo/.chef/validation.pemに配置する。
chefサーバの/etc/chef-server/admin.pemを
~/chef-repo/.chef/admin.pemに配置する。

knife configure -i
で設定。
ところどころ、デフォルトのパスが違うので注意。
create new userはchefでのユーザ名になる。(OSとは関係ない)

root@debian:~# knife configure -i
WARNING: No knife configuration file found
Where should I put the config file? [/root/.chef/knife.rb] /root/chef-repo/.chef/knife.rb
Overwrite /root/chef-repo/.chef/knife.rb? (Y/N) y
Please enter the chef server URL: [http://debian.localdomain:4000] https://chefサーバのホスト名/
Please enter a name for the new user: [root] akira
Please enter the existing admin name: [admin] admin
Please enter the location of the existing admin's private key: [/etc/chef/admin.pem] /root/chef-repo/.chef/admin.pem
Please enter the validation clientname: [chef-validator] 
Please enter the location of the validation key: [/etc/chef/validation.pem] /root/chef-repo/.chef/chef-validator.pem
Please enter the path to a chef repository (or leave blank): /root/chef-repo/
Creating initial API user...
Please enter a password for the new user: 
Created user[akira]
Configuration file written to /root/chef-repo/.chef/knife.rb

/root/chef-repo/内でknife client listと実行すると、クライアントのリストが出てくればOK


最後にクライアント。
設定するのに一番慣れているCentを使った。
OS:CentOS5(x86)

例によって最少インストール。
ネットワークの設定、アップデートなど諸々。

chefクライアントのインストール

curl -L https://www.opscode.com/chef/install.sh | bash
 echo 'export PATH="/opt/chef/embedded/bin:$PATH"' >> ~/.bash_profile && source ~/.bash_profile

設定
/etc/chef/client.rbというファイルを作成。
本当はコマンドで作成できるらしいんだけど、うまく動かなかった。
中身は以下の通り。
log_level        :info
log_location     STDOUT
chef_server_url  'https://chefサーバ/'
validation_client_name 'chef-validator'
chefサーバの/etc/chef-server/chef-validator.pemを
クライアントの/etc/chef/validation.pemに配置する。
クライアントを起動してみる。
chef-client

 サーバの管理画面のNodesのタブにクライアントが表示されればOK

では早速動かしてみる。
以下の手順はWorkStationサーバで動かす。

まずはテストクックブックを作成し、テストレシピを作ってみる。
knife cookbook create test
vi ~/chef-repo/cookbooks/test/recipes/default.rb
中身はこんな感じにしてみた。
やっていることは、/var/www/html/hello.txtを監視し、
無いもしくは内容が異なっていたら、テンプレートであるhello.txt.erbの内容で
パーミッション0644で作成せよ。
template "/var/www/html/hello.txt" do
 source "hello.txt.erb"
 mode 0644
end

テンプレートの中身を作成。拡張子はerbでないといけないようです。

vi ~/chef-repo/cookbooks/test/templates/default/hello.txt.erb
HELLO WORLD!


作成したクックブックをchefサーバにアップロードします。

knife cookbook upload test
消すとき
knife cookbook delete test

shefサーバのWeb画面でクライアントに対し、作成したレシピを適用。
クライアント側でchef-clientを実行すると、ファイルが変更されます。


トラブルシューティング

クライアント設定で、chef-clientを実行すると、
Error Resolving Cookbooks for Run List:
というエラーになる。

原因:
/etc/chef/client.rbのサーバのアドレスがhttpになっている。
>httpsにする




2013年3月17日日曜日

CentOS6でOpenVZを軽く試してみた

前回はCloudStackでかなり苦労したので、こんどは志向を変えて、Linux向けVPSソフトである、 OpenVZをインストールして見ました。

といっても、インストールはすごく楽でした。
まず、本体はここを参考にセットアップ。
基本的には、レポジトリを登録し、yumでインストール。
カーネルをgrubに登録し、仮想NIC設定って流れで。

ただし、これ、コマンドライン操作なんです。
ちょっとそれは・・という事で、ちゃんとWebフロントエンドが用意されています。
ここを参考にインストール。

ってwgetでファイルをDLして、実行するだけです。
画面はこんな感じです。


日本語対応。テンプレートも豊富と使いやすい!
ただし、仕組み上動作できるのはLinuxだけです。