アンチパターンな運用をしていて、このたびきちんとcookbook単位でバージョン管理しようと決意。serverの使い方を覚えた。単一Cookbookをchef-repoなしに独立に開発する流れがどこにもまとまっていなかったのでメモ。いちおう自分の考える王道のようなものになっているはず。Chefはchefdkでインストールしてあるものとする。今回はサーバーの基本設定をまとめたbase-settingsというcookbookの作成を例に取る。新しいCookbookを作る場合は以下のコマンドで作る。-oオプションでカレントディレクトリに作成場所を指定する。templatesさっき「knifeの設定がないよ」と言われたので下のように作成する。Serverを使わないのでlocal_modeをtrueにしておく。/etc/chef/client.pemのエラーがなくなる。local_modeで使っていると.chef/local-mode-cacheができるのでこいつをgitignoreしておく。initしてバージョン管理に乗せる。GitHubへの登録は省略。recipes/default.rbtest-kitchenの設定cookbookのテストは基本的にtest-kitchenの仮想マシン上で行う。Vagrantfileは作らない。testする方がオススメ。installed.gitignoreに追記され.kitchen.ymlが新しく追加された。.kitchen.ymlはtest-kitchenで使う種々の設定を書くファイルで非常に重要。デフォルトでは以下のようになっている。attributes:driverは仮想マシンを立ち上げる環境を指定する。デフォルトだとvagrantなのでこれでよい。他にもec2やdockerを指定できるらしい。platformsはテストするサーバーOSを指定する。開発マシンのスペックと相談かな。provisionerがdeprectedなchef_soloなのでこれをchef_zeroにする。あとplatformsのOSのバージョンが古いので新しくする。結果以下のようになる。testが動くので動かしてみる。新しく仮想マシンを立ち上げるときに結構時間かかるので、仮想マシン壊さないように--destroy=neverをつけるととっても捗る。あと-cをつけると複数の仮想マシンを並列にテストしてくれるので速い。chef-clientがインストールされる。仮想マシンごとに色分けして出力されるのがわかりやすい。recipeもテストコードはなにも書いていないので何も実行されない。ここまででtest-kitchenの最低限の設定は完了。commitしておくとよい。レシピを書いてテストコードを回す設定がだいたい終わったので、早速テストコードとrecipeを書く。文法チェックだけしてくれる。-oオプションではcookbookの設置されているディレクトリを指定する必要があることに注意。(14m58.54s)無事にレシピを適用できテストも通過した。default-centos-66でsshログインして手動で確認すればよい。依存cookbookの解決supermarket.chef.ioにあるコミュニティクックブックはぜひ積極的に使いましょう。先人の知恵は活用すべし。サービスを動かすサーバーなどセキュリティ要件が大きい場合はよくクックブックの中身を読むこと。自分はなるべくダウンロードが多いものを選ぶようにしている。今回は以下のSELinuxのクックブックを使う。Chef公式でかつダウンロード数がずば抜けて多かったので信用度高い。https://supermarket.chef.io/cookbooks/selinux追加が必要なのはmetadata.rbとBerksfile。metadata.rbを編集して依存クックブックを記入する。dependsという項目に依存cookbookを書く。ついでにmaintainerなどの必要事項を書き足しておく。'0.1.0'またBerksfileを作成して以下のようにする。initで様々作成できるがこれは使わない。"https://supermarket.chef.io"metadataこのmetadataというのがポイント。test-kitchenを使った時にBerkshelfで依存cookbookをダウンロードしてくれる。この状態でselinuxクックブックが使えるようになったというわけ。recipes/default.rbを以下のように編集。長いけどcentosの方のみ変更があったのでこちらを載せる。(0m29.39s)Berksfileでcookbokの依存パケージが解決され、仮想マシンに同期されている様子がわかる。無事にSELinuxの無効も済んだよう。テストコードselinux_spec.rbを後から書いた。.gitignoreに追加しておいたほうがよい。attributesの使い方environmentsやrolesやnodesオブジェクトに書くattributesも.kitchen.ymlで指定することで利用できる。SSHのルートログイン不許可とパスワード認証無効を設定する。これもChef謹製で2009年に作成されて着々とアップデートされているので信頼できそう。https://supermarket.chef.io/cookbooks/opensshこのcookbookはattributeに細かい設定をするようになっている。依存クックブックを解決するためにmetadata.rbに追加。'0.1.0'そんでrecipeに追記。"openssh::default"とりあえずattributesを書かない状態で適用してみる。成功したのを確認したら.kitchen.ymlにattributeを書いていく。どのような形でattributesを書けばいいかはソースのattributesを見るとわかる。nodesやenvironmentsにはjsonで書くがこちらはyamlなので注意。convergeすれば望んだ状態になるはず。(0m10.03s)./etc/ssh/sshd_configに二行追加されて、restartがnotifyされて無事適用された。bagsを置くディレクトリを指定して、その場所にdata_bagsを作ってやればよい。bagsなので、test/ディレクトリ以下に入れるとよいかも。ikuとwowを追加して、これを使ってユーザー作成を行う。.kitchen.ymlは以下のようになる。