最近、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が間違って上がっちゃうことも無いので、
非常に良い感じです。