Windows Chef ClientをChef Serverに自動で繋ぐ

 

Windows ServerのCofigurationをChefでやろうとした場合、

ssh + rsyncが必要なknife-soloは現実的ではないため、

効率的に管理しようと思ったらやっぱりChef Serverを使うのかなと思いチャレンジしています。

 

そんな中、Linux Chef ClientをChef Serverに繋ぐ例は、

いくつか見つけることができましたが、

やはりWindows ServerはさすがのGoogle先生もご存じないご様子だったので、

自力で頑張ってみました。

 

前提条件

  • Windows 2008 R2 or later
  • PowerShell 3.0 or higher
  • Chef Server側のenvironmentはあらかじめ作成しておく
    (これはWindowsに限らずですが…)
  • Amazon S3のPrivate Bucket
    (validatorキーの受け渡しに使います)

 

こんな感じです。

YOUR_*

な所は各々書き換えて使います。

validatorキー含め必要なものは全て外部から取るようにしているので、

まっさらなサーバから流すだけで接続させられます。

Chef Clientの起動スパンは5分毎、

WindowsのScheduledJobは「いつまで」を登録しなければならず、

ここは無限にはできない(PowerShell4.0~はできるらしいけど)ので、

とりあえず適当に大きい値8192日になっていますが、

特に起動スパン5分はあまり一般的ではないようなので用途に合わせて変えてください。

ここらへん↓

$SpanMinutes   = 5
$DurationDays  = 8192

 

EC2の場合

以下で囲んでUserDataから流し込めばRDPで繋ぐこと無く完全自動で繋がせることができます。

あらかじめroleを作っておいて、タグ情報からrun_listにそのroleが指定されたnodeのJSONファイルを生成する等すればそのまま即設定まで完了ですね。

<powershell></powershell>

 

ConfigurationまでChefで完璧にできるようになれば、

Wiondows Serverもログイン無しでセットアップできるとかだいぶ胸熱なので、

ちょっと頑張ってみたいと思いました。

 

 

 


Jenkinsでtest-kitchenのテストに通ったCookbookを自動でChef Serverにアップロードする

 

最近、Chef Serverを触り始めました。

元々、Linuxでknife-soloベースで運用していたのですが、

Windows Server案件が増えてきてknife-soloが使えない(使えるけど色々めんどくさい)ので、

とりあえず試してみようかと。

Client – Server構成ならChef Clientのセットアップさえできれば他に手を入れる必要がないので、

Windows ServerならClient – Server構成が無難なのかなと。

(ChefでWindows Serverのセットアップをするのが無難かどうかはさておきw)

 

そこで、今までJenkins + kitchen-dockerで自動テストをしていたCookbookをわざわざ手元でアップロードするのは面倒だし、

間違いの元なのでそこも自動化したいと思ってやってみました。

 

調べたところ、BerkshelfがChef Serverへのアップロードに対応しているので、

それを使ってアップロードします。

 

以下、実施環境及び前提です。

  • OSはAmazon Linux(CentOSでもたぶん同じ)
  • Jenkinsはyumで入れている。
  • Chef Serverのセットアップ等々は割愛します。
  • test-kitchen及び依存gemはbundler(Gemfile)にて管理されている。

 

まず、Chef Serverからadminキーとvalidatorキーを取得しておきます。

それを、Jenkinsサーバの任意の場所に設置します。

デフォルトではChef Serverの以下にあります。

/etc/chef-server/admin.pem
/etc/chef-server/chef-validator.pem

この辺り、PrivateなJenkinsサーバなら問題無いですが、

CI as a Service + kitchen-ec2等を使っている場合は難しいところですね。

PrivateなS3 Bucketに配置して、AWS Credentialをセキュアな方法で受渡してダウンロードさせるとかでしょうか…?

 

Jenkinsサーバ上で以下を実行し、それぞれ求められる内容を入力します。

(ここで上記の鍵の場所を聞かれます)

$ knife configure -i
$ berks configure -i

 

できあがったファイルをJenkinsのホームディレクトリに移動します。

$ mkdir /var/lib/jenkins/.chef
$ mv ~/.chef/knife.rb /var/lib/jenkins/.chef/
$ chown -R jenkins:jenkins /var/lib/jenkins/.chef
$ mkdir /var/lib/jenkins/.berkshelf
$ mv ~/.chef/knife.rb /var/lib/jenkins/.berkshelf/
$ chown -R jenkins:jenkins /var/lib/jenkins/.berkshelf

 

Chef ServerのSSL証明書が所謂オレオレ の場合は以下を変更します。

$ vi /var/lib/jenkins/.berkshelf/config.json
 "ssl": {"verify": false}

 

そして、Jenkinsのビルドタスクの最後に以下を追加します。

bundle exec berks install
bundle exec berks upload

 

以上でテストに通ったCookbookが依存Cookbook含め、

自動でChef Serverにアップロードされます。

 

bundle install –path=hoge等でCookbookディレクトリ 上にgem群をインストールしている場合は注意が必要です。

gem群もアップロードしようとしてめちゃくちゃ時間がかかる上にアップロード時のvalidationに引っかかって落ちます。

(これ、ハマりましたw)

 

既存のCookbook開発フローを壊さずに効率的にChef Serverも運用でき、

テストが通らないダメCookbookが間違って上がっちゃうことも無いので、

非常に良い感じです。

 

 


Chef Meetup Sapporoの第一回イベント「Chef Casual Talks Sapporo Vol.1」を行いました

 

だいぶ時間が経ってしまいましたが…

タイトルのとおり、先日、「Chef Meetup Sapporo」の第一回イベント「Chef Casual Talks Sapporo Vol.1」を行いました。

 

Tokyo、Kansaiのイベントに便乗させてもらっての突発開催で、

おおっぴらに宣伝しなかったのもあり、

参加人数は少なかったのですが、

そこで発表したスライドがバズったりして、

東京や関西のアーリーアダプタなWEB系のエンジニアには浸透しきった感のあるChefも、

SIerや地方のエンジニア等のアーリーマジョリティ的な層にはまだまだこれからということが分かって良かったです。

そういった層にリーチしていけるように頑張って行きたいです。

(そのためには1人じゃ厳しく、身近にガチで使ってる仲間がほしい所なので、まずそこから…)

 

ちなみに、別にChefを広めたいみたいな慈善事業的な公正明大的な目的というわけではなく、

札幌という地方都市に、Chefとかそういう旬な話がガチでできるインフラエンジニアのクラスタを作りたいっていうことなので、

その辺りに興味があったり賛同していただける方からのコンタクトをお待ちしております:)