タグ別アーカイブ: LWRP

AttributesにHashを使いたくなったらLWRPにしろ(Chef)

本日の反省文です。ご査収ください。

 

元々、Cookbookを書く時に、

「AttributesにHashを使いたくなったらLWRPにしろ」

というオレオレルールがありました。

 

これは、Cookbookの再利用性を確保して見通しよくするために、

なんとなく決めた自分なりの基準の一つだったのですが、

今日(2014.10.09)、それを破った手抜きCookbookで問題が起きましたorz

 

Chefにはattributesを定義できる場所が色々ありますが、

それらはざっくり言うと以下の様な感じで扱われます。

(ソースを流し見して把握しただけなので、間違いがあるかもしれません。また、説明しやすいように若干正確な挙動とは異なっています。)

  1. それぞれで定義されているattributesをHash化する(というかそもそもHashみたいな感じ)
  2. それぞれのHashをそれぞれ末端まで再帰的にmergeする
  3. Hashの末端で被った部分は優先順位に応じて上書きする

参考までに該当箇所のソース

 

問題は上記の2の部分で、

nodesやらrolesやらenvironmentsで定義したattributesの中にHashがあると、

それは「末端」ではないので、上書きではなくmergeされてしまいます。

 

つまり、上書きしたつもりがmergeされていて、

Cookbookのデフォルトとenvironmentsで定義した値が合わさって、

余計な設定が入ってしまったのです。

 

補足:

Cookbokkを書き直さずに上書きさせたい場合は、

override attributesに定義すると、とりあえず上手く行きます。

 

ということで、最後にもう一度…

「AttributesにHashを使いたくなったらLWRPにしろ」

 

手抜きは本当に(・A・)イクナイ!!

 


Windows向けのChefカスタムリソース(LWRP)を作ってみた

作ったのは以下の2つです。

WindowsだとTest-kitchen+Serverspecで良い感じにテストできないので、VirtualBoxとEC2で手動による動作確認はしてますが、動かないケースがあるかもしれません(;´Д`)

  1. Windows Serverでcronライクな定期処理を行うためのリソース(windows_scheduler)

  2. パフォーマンス等の内部情報を取得してCloudWatchに投げてくれるリソース(powershell_cloudwatch)

2は、内部で1を使用することにより、定期的にCloudWatchにPutしてくれる感じです。

Linuxサーバの監視は、vmstatとかpsとかの各種コマンドで取得した値を整形して、

AWSCLIでCloudWatchにPutさせることで監視を行っており、

これもChefのレシピになっているので新しいサーバが増えたらサクッと流すだけになっているので、

それと同じことをWindows Serverでもやりたかったので、作ってみました。

 

詳しい内容はREADMEやソースを見ていただくとして、

以下、概要です。

 

windows_scheduler Cookbook

  • windows_scheduler_jobというリソースを追加します。

PowerShellのScheduledJobというコマンドレットを使用しており、今のところそれしか需要がないので分単位での定期処理でPowerShellの実行のみサポートしています。ScheduledTaskというコマンドレットを使用するとPowerShell以外の定期処理を行えます(が、未対応ですw)

また、今回はじめて知ったのだけど、Windowsのタスクスケジューラは、デフォルトで前の同じタスクが終わっていない場合は次のタスクを実行してくれないのですが、そこはcronと同じように重複起動して欲しかったので変えるオプションを付加しています(リソースに与えるattributeで変更可能)

 

powershell_cloudwatch Cookbook

  • powershell_cloudwatch_couterというリソースを追加します。
  • powershell_cloudwatch_processというリソースを追加します。

PowerShellのGet-Couterというコマンドレットを使用して、PerformanceCounterという内部的なパフォーマンス情報を収扱うためのオブジェクトを取得します。それにより、実行時を切り取った値ではなく、指定されたインターバルで指定された回数取得し、その最小最大やサンプル数と合計値といったCloudWatchが扱える値のそれぞれに分類してPutします。

それに加えて、Get-Processというコマンドレットを使用してプロセス数をPutするためのリソースも作りました。こちらは、実行時を切り取った値をPutします。

 

Windows ServerをChefで色々やろうと思うと、

やはりPowerShellの知識は切っても切れないものとなりそうです。

というか、Windows Serverの管理においてPowerShellが必須なんでしょうね…

 

最初はちょっと楽しかったけど、やっぱり途中からちょっとつらかったですwww