カテゴリー別アーカイブ: Chef

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とかそういう旬な話がガチでできるインフラエンジニアのクラスタを作りたいっていうことなので、

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

 

 


kitchen-dockerでEC2の料金をかけず、高速にAmazon LinuxでのCookbookのテストを行う方法

2014.04.28 追記:

ライセンスについてのご質問をいただいたので追記しました。

 

最近、Kitchen-dockerでCookbookのテストを流すようになり、

捗ってはいたのですが、

仕事ではCentOSとAmazon Linuxの両方を使うことがあり、

お互いRHEL互換で大体同じで通るとはいえ、

ちゃんと両方でテストしないといけないよな〜と思っていました。

でも、Amazon Linuxを使おうと思うと、

kitchen-ec2とかvagrant-awsとかで立ち上げる感じになって、

やっぱり仮想マシンの立ち上げが遅いんですよね。

あと、課金を気にしなきゃいけないのが一番やりにくい。

 

とりあえず、今やってるCookbookの充実&リファクタリングは早く終わらせたかったので、

CentOSだけで作って後で考えようかと思っていたのですが、

ちょっと良い方法を思いついたので試してみました。

 

 

その内容は、

「Amazon LinuxのDocker Imageって作れたらkitchen-dockerで使えたりしないのかな?」

 

って感じです。で、調べてみたら、

Amazon LinuxのDocker Imageを作った例

※「Amazon Linux Docker Image」のセクション

があったので、いけそうな気がしてやってみました。

 

以下、手順です。

※「marcy/amzn」の所は 各々のリポジトリ名に置き換えてください。

 

①まず、上記リンクの通りにDocker Imageを作成します。

 

②kitchen-dockerの実行に必要な変更を施します。

# docker run -t -i local/amzn /bin/bash
bash-4.1# rm -f /etc/ssh/ssh_host_*
bash-4.1# sed -i 's/^PasswordAuthentication no/PasswordAuthentication yes/' /etc/ssh/sshd_config

Docker Registoryへpushします。

# docker ps -a
 # docker commit ${CONTAINER ID} marcy/amzn
 # docker push marcy/amzn

※${CONTAINER ID}にはdocker ps -aで確認したCONTAINER IDが入ります。

④Tagを切ります(これは無くてもいけるけど)

# docker images
 # docker tag ${IMAGE ID} marcy/amzn:2014.03.1
 # docker push marcy/amzn

※${IMAGE ID}にはdocker imagesで確認したIMAGE IDが入ります。

 

実際には②で施した変更は実行してみて動かなくて直しました。

変更して再度pushするのは以下のような感じです。

# docker run -t -i marcy/amzn /bin/bash
 bash-4.1# 変更実施
 # docker commit ${CONTAINER ID} marcy/amzn
 # docker tag ${IMAGE ID} marcy/amzn:2014.03.1
 # docker push marcy/amzn

リポジトリ上だけ更新しても、

一度取得してしまったkithcen-docker実行側には反映されないので更新します。

# docker pull marcy/amzn:2014.03.1

 

こんな感じでできあがったDocker Imageを、

以下のような.kitchen.ymlで指定してやるとAmazon Linux のテストができます。

CentOSとかだとnameに「centos-6.4」と書くだけで良い感じにしてくれるのですが、

「marcy/amzn-2014.03.1」とかにしてしまうと、

nameから自動生成したファイルを使うような処理で、

スラッシュがディレクトリとして扱われて

「Not such file or directory」で落ちるので注意です。

 

これで、EC2の課金を気にせず、

かつ高速にAmazon Linuxでtest-kitchenのテストが回せます。

 

また、今回作成したDocker ImageはPublicにしてあるので、

使っていただいても構いません。

 

 

あれ?

ていうか、自分の所ではEC2上でやったのですが、

もしかしてコレって…

厳密に同じでは無いものの、

Amazon LinuxがAWS以外でも手軽に動かせるようになったってことでは???

 

2014.04.28 追記:

「ライセンスって大丈夫なの?」とご質問をいただきました。

調べた限りではライセンスについての記述は見当たらず、

AMIの公開が万人に許されていることから、

AWS EC2上かつ個人での利用については問題無い or グレーゾーンであると個人的には解釈していますが、

実施の際は自己責任でお願い致します。

また、よくあるご質問に以下の記載があるので、

Q: Amazon Linux AMI は EC2 以外でサポートされますか?

いいえ。Amazon Linux AMI は、Amazon EC2 内のみで使用可能です。

AWS EC2以外での動作は現状辞めておいた方が良さそうです。

 

 

 

全然別件ですが、もしChefネタなので一応宣伝。

札幌に在住の方がもし居ましたら、

こんなんやりますので、ご興味あればどうぞ。

Chef Meetup Sapporo