はじめまして。DevOps実践を担当している運用本部の廣田です。2015年4月から、KDDIクラウドプラットフォームサービス(以下、KCPS)のパートナーサービスとして、株式会社はてなのサーバ監視サービス「Mackerel(マカレル)」を提供しています。Mackerelを導入することにより、サーバのリソースやサービスの稼働状況を直観的なUIとグラフ化によって把握することで、システムの稼働トレンドの把握やサービス品質向上に役立ちます。今回は、インフラストラクチャ自動化フレームワークである「Chef」を利用して、より簡単にKCPSにMackerelを導入する方法を紹介します。Chefを利用することで、サーバ上で複雑なコマンド実行を複数回繰り返すことなく、Cookbookと呼ばれるプログラムコードを一度実行するだけで、Mackerelを導入できます。サーバの台数が増えても、Cookbookを適用すれば導入にかかる時間と手間を大幅に削減できます。
Mackerelのカスタムメトリック登録について
Chefを利用してKCPSにMackerelを導入する手順を説明する前に、Mackerelの「カスタムメトリック」機能について紹介します。Mackerel全体の特徴は、過去の記事KCPSから「Mackerel」提供開始! 〜Mackerelで実践するサービス利用状況の”見える化”〜をご覧いただきたいと思います。KCPSでは、Webサーバやデータベースやファイルサーバなど様々なミドルウェアを導入し、ご利用いただいておりますが、カスタムメトリック機能を使うことで、様々なミドルウェアのメトリックを収集できますので、システムの状況を詳細に把握することができます。Mackerelをひとたび、導入すると、自動で以下のシステムメトリックがグラフ化されます。
・ロードアベレージ(直近5分間計測) ※Linuxのみ
・CPUプロセッサの待ち行列内のスレッド数 ※Windowsのみ
・CPU使用率
・メモリ使用率
・ディスク使用率
・ディスク IOPS (Read/Write)
・ネットワークインタフェースの送受信パケット数
これらは、「システムメトリック」の項目に表示されます。カスタムメトリックは上記以外に、グラフ化したいメトリックを収集するスクリプトをMackerelに登録することで、グラフ化でき、「カスタムメトリック」の項目に表示されます。例えば、Windows ServerのWebサーバ機能であるIISの接続数をメトリックとして、Mackerelに登録するPowerShellスクリプトは、以下のようになります。
$Server = $env:COMPUTERNAME $SiteName = "default web site" $Perf = Get-Counter -Counter "\\${Server}\Web Service($SiteName)\Current Connections" $PValue = $Perf.CounterSamples.CookedValue $TimeStamp = $Perf.TimeStamp $EpochTime = Get-Date $TimeStamp -uFormat "%s" Write-Output web_service.current_connections`t$PValue`t$EpochTime
実行すると以下のように結果が出力されます。
web_service.current_connections 8 1451317190.60106
ファイル名を「WebServiceConnections.ps1」として、「C:\mackerel-scripts\」に保存します。Mackerelにカスタムメトリックを登録するスクリプトは、標準出力を以下のフォーマットで出力する必要があります。
{メトリック名}\t{メトリック値}\t{エポック秒}
登録後のメトリック名とメトリック値とUNIXエポック秒をタブ(\t)区切りで出力します。次にMackerelエージェントの設定ファイルに、以下の設定を追加します。
[plugin.metrics.webserviceconnections] command = "powershell C:/mackerel-scripts/WebServiceConnections.ps1" type = “metric”
「command」の部分で、さきほど紹介したIISの接続数メトリックを取得するPowerShellスクリプトを指定します。
Mackerelエージェントの設定ファイルに、Mackerel APIキーを指定するのも忘れずに行います。
apikey = “(Mackerel管理コンソールからコピーしたAPIキー)”
Mackerel APIキーの確認方法は、過去の記事KCPSから「Mackerel」提供開始! 〜Mackerelで実践するサービス利用状況の”見える化”〜にて紹介しています。Mackerelに設定を反映するため、Mackerelエージェントを再起動すると以下のようにIISの接続数をグラフ化できます。
Mackerelを自動導入するChefのCookbookを作成する
Chefとは、サーバやアプリケーションといったインフラストラクチャの展開を容易にするためのオープンソースの自動化フレームワークです。専門的知識を持ったエンジニアが、サーバにコマンドを実行して構築を行っている作業を、Chefで自動化し、いつでも誰でも、サーバ構築することが可能になります。KCPS上でのChef Server構築と機能検証も実施しておりますので、ご興味がありましたら過去の記事Chef Server12をKCPS上に構築、活用方法を検証をご覧ください。今回は、このChefを利用して、KCPSのWindowsサーバにMackerelを導入し、システムメトリックと前章で紹介したIISの接続数のカスタムメトリックをMackerelに登録する方法を紹介します。Chefを利用するには、サーバにChef Development Kit(以下、ChefDK)の導入が必要になります。Windows版のChefDKは、Chef社からこちらにて配布されています。Chefでは、インフラストラクチャに対する導入や設定をRubyの文法で記述された「Cookbook」に定義します。このCookbookを構成する要素のうち「Recipe」、「File」、「Template」について、説明します。
■ Recipe
Recipeは、Cookbookの中心的役割を果たします。インフラストラクチャ構築を実施するプログラムコードです。今回、使用する、MackerelエージェントをインストールするRecipeは以下になります。
windows_package ‘mackerel-agent’ do source "http://198.18.0.16/file/msi/mackerel-agent-latest-kcps.msi" installer_type :msi options "APIKEY=\" (Mackerel管理コンソールからコピーしたAPIキー)\"" action :install not_if {::File.exists?(‘C:/Program Files (x86)/Mackerel/mackerel-agent/mackerel-agent.conf’)} end template 'C:/Program Files (x86)/Mackerel/mackerel-agent/mackerel-agent.conf' do source 'mackerel-agent.conf.erb' owner 'Administrator' group 'Administrator' mode '0644' end directory ‘C:/mackerel-scripts’ do owner 'Administrator' group 'Administrator' mode '0755' action :create end cookbook_file ‘C:/mackerel-scripts/WebServiceConnections.ps1’ do source ‘WebServiceConnections.ps1’ owner 'Administrator' group 'Administrator' mode '0755' end service 'mackerel-agent' do service_name "mackerel-agent" action [:restart] end
Chefには、プログラムのインストールであったり、ファイルの配置であったりとサーバ構築を行う様々な機能があり、これをリソースと呼びます。Recipeに、リソースを記述し、サーバ構築を行うプログラムコードを作成します。上記のRecipeに記述されたリソースを説明します。
・windows_packageリソース
インストールファイルが置かれるURLとインストーラーのタイプを指定し、インストールオプションにMackerelのAPIキーを指定してMackerelエージェントをインストールします。
・templateリソース
後述する「templates」フォルダにMackerelエージェントの設定ファイルを配置します。templateで、指定するフォルダにMackerelエージェントの設定ファイルをコピーする。
・directoryリソース
フォルダのパスを指定し、カスタムメトリックを収集するスクリプトを格納するフォルダを作成します。
・cookbook_fileリソース
後述する「files」フォルダに前章で紹介したカスタムメトリックを収集するスクリプトの「WebServiceConnections.ps1」を配置します。このスクリプトをsourceとして指定し、directoryリソースで作成したフォルダ配下に格納します。
・serviceリソース
Recipeで実施される内容を反映するため、インストールされたMackerelエージェントサービスを再起動します。
■ File
Cookbook内の「files」フォルダにファイルを同封しておくことで、Recipeに記述する「cookbook_file」リソースを利用して、サーバにそのファイルを転送し任意の場所へ配置することができます。
■ Template
Cookbook内の「templates」フォルダにファイルを同封しておくことで、Recipeに記述する「template」リソースを利用して、サーバにそのファイルを転送し任意の場所へ配置することができます。「Template」は、ファイル内に動的に変化する変数がある場合に使用し、「File」は、変数がない、静的なファイルの場合に使用します。
以上で、Mackerelを導入するCookbookの説明は終わりです。紹介したCookbookが、サーバ上で実行する構築内容をまとめます。
・Mackerelエージェントのインストール
・Mackerelエージェント設定ファイルの配置
・カスタムメトリック取得スクリプトを格納するフォルダの作成
・カスタムメトリック取得スクリプトをフォルダに配置
・Mackerelエージェントサービスの再起動
Cookbookは以下のようなファイル構成になります。
cookbooks/ └── mackerel-kcps-win ├── CHANGELOG.md ├── README.md ├── files │ └── default │ └── WebServiceConnections.ps1 ├── metadata.rb ├── recipes │ └── default.rb ├── templates └── default └── mackerel-agent.conf.erb
Cookbookのファイル構成を説明します。
・「cookbooks」フォルダ配下に「mackerel-kcps-win」フォルダを配置します
・「Recipe」、「File」、「Template」を「mackerel-kcps-win」フォルダに配置します
・「CHANGELOG.md」には、変更履歴、「README.md」には、Cookbookの説明を記述します
・「metadata.rb」は、Cookbook名や作成者情報などのメタ情報を記述します
KCPSにMackerelをChefで導入する
KCPSに、前章で紹介したChefのCookbookを適用します。このCookbookを適用すると、自動でMackerelエージェントが導入されて、システムメトリックに加え、カスタムメトリックとしてIISの接続数をグラフ化することができます。Cookbookを適用するKCPS上の仮想サーバには、あらかじめ以下の設定を行います。
・OSはWindows Server 2012 R2
・Windows版のChefDKをインストール (こちらのChef社のページから入手)
・Webサーバ (IIS) のインストール
ChefDKをインストールすると「chef-client」コマンドが使用できます。試しにコマンドプロンプトを起動して以下のコマンドを実行してください。
PS > chef-client --version
実行すると以下のようにバージョンが表示されます。
Chef: 12.5.1
Chefには、ChefサーバからCookbookを適用する方法とサーバ無しで適用する方法があります。今回は、サーバ無しの方法で適用します。適用には、「chef-client」コマンドを使用します。「chef-client」コマンドを実行するために以下のファイルを用意します。
・Cookbook
さきほど説明したMackerelエージェントを導入するCookbookのことです。「mackerel-kcps-win」フォルダに「Recipe」、「File」、「Template」などをまとめます。
・client.rb
Cookbookの格納場所やCookbook適用に使用するキャッシュを格納する場所を指定します。
・windows.json
実行するCookbookの名前を指定します。今回は、「mackerel-kcps-win」です。
client.rbに、以下のように記述します。
file_cache_path "C:/chef-repo/cache" cookbook_path "C:/chef-repo/cookbooks" log_level :info
また、windows.jsonに以下のように記述します。
{ "run_list": ["recipe[mackerel-kcps-win]"] }
「Cookbook」、「client.rb」、「windows.json」をまとめて一つの「chef-repo」フォルダに格納します。「chef-repo」フォルダ内に「client.rb」内に定義したように、「cache」と「cookbooks」フォルダを作成しておきます。「chef-repo」フォルダのファイル構成は以下のようになります。
chef-repo/ ├── cache ├── client.rb ├── cookbooks │ └── mackerel-kcps-win │ ├── CHANGELOG.md │ ├── README.md │ ├── files │ │ └── default │ │ └── WebServiceConnections.ps1 │ ├── metadata.rb │ ├── recipes │ │ └── default.rb │ └── templates │ └── default │ └── mackerel-agent.conf.erb └── windows.json
Cookbookを適用する準備が整いました。「chef-repo」フォルダを今回は、C:\の直下に配置し、コマンドプロンプトを起動して、cdコマンドでC:\chef-repoに移動します。
PS > cd C:\chef-repo
以下のコマンドでCookbookを適用します。
PS > chef-client -z -c client.rb -j windows.json
以下のような結果が出力されていれば、Cookbookの適用は成功です。
Chef Client finished, 6/6 resources updated in 23 seconds
以下は、「chef-client」コマンドを実行した動画です。実行後に、「mackerel-agent」がプログラムにインストールされていることが確認できます。
「7 Metrics」の部分を確認すると、システムメトリックに加えて、カスタムメトリックに「web_service」が追加されています。
さいごに
今回はMackerelのカスタムメトリックの登録方法と自動化フレームワークであるChefを利用してKCPSの仮想サーバにMackerelを導入する方法を説明しました。今までエンジニアがコマンドの投入によって行っていたサーバ構築が、Chefを利用すれば、より正確に、より素早く構築することができます。KCPSでは、Chefサーバを準備しています。今回説明したMackerelの導入およびカスタムメトリックの登録を自動化するCookbookを活用した新サービスを検討しておりますので、ご期待ください。