LoginSignup
23
21

More than 5 years have passed since last update.

Test-Kitchenの対応プロビジョナを増やした Itamae, chef-apply

Last updated at Posted at 2015-03-05

Test-Kithenは、

  • どこかにVMをつくって
  • 好きなプロビジョニングを適用して
  • 適当なテストスイートを実行する

というツールです。

あらすじ

  1. 普段からTest-Kithenを色々な用途で使っているので、解説をまとめようと思った。
  2. 拡張の仕方も説明できるかな ?
    • VMのドライバは作ったことがある: kitchen-zcloudjp
    • テストのプラグインも作ったことがある: busser-shindo
    • プロビジョナは作ったことがない。
  3. ついでだから何かプロビジョナの対応を作る。

『何かプロビジョナ』、すでにTest-Kitchen対応があると思っていたが無かった次の2つにした。

Test-Kitchenのプロビジョナづくり。

Test-Kitchenの拡張は、基本的に対象のBaseを継承してから任意のメソッドを上書きすることで行います。

プロビジョナ実行内のメソッドならこんな感じです。

Provisioerのメソッド(一部抜粋) 軽い解説
install_command VM内にプロビジョナをインストールするコマンドライン(sh -cで実行)
init_command VM内のSandboxを初期化するコマンドライン(sh -cで実行)
prepare_command VM内でプロビジョナを実行する前に実行するコマンドライン(sh -cで実行)
run_command VM内で実行するプロビジョナのコマンドライン(sh -cで実行)
create_sandbox ホストOSでレシピ等を一時的に配置(Sandbox)するRubyコード
cleanup_sandbox ホストOSのSandboxを掃除するRubyコード

これらを次のような感じで上書き。

  1. VMにItamaeをインストール
    • Chef-ApplyはChefに便乗
  2. kitchen以下のファイルをVMの/tmp/kitchenに転送
  3. 事前準備があったらVM内で実行
  4. ランリストを元にItamae/Chef-Applyを実行

Itamaeでプロビジョニング

kitchen-itamaeはRubygemsで公開しました。

実際に使って見る場合、kitchen-itamaeのデモとして実装済の機能をほぼ試せるようにしてるので参考になるはずです。

Test-KithenでItamaeプロビジョナを使用するには、kitchen/(任意)以下にItamaeのRecipeを配置します。

kitchen/
├── nodes
│   ├── node1.json
│   └── node2.json
└── recipes
    ├── package1.rb
    └── package2.rb

で、.kitchen.ymlprovisionerとしてitamaeを指定。

.kitchen.yml(itamae)
---
driver:
  name: vagrant
  customize:
    cpus: 2

provisioner:
  name: itamae

platforms:
  - name: ubuntu-14.04
    provisioner:
      node_json: nodes/node1.json
  - name: centos-6.6
    provisioner:
      node_json: nodes/node2.json

suites:
  - name: default
    run_list:
      - recipes/package1.rb
      - recipes/package2.rb

Test-Kitchenは定義ファイルの.kitchen.yml内にある、driver, provisioner, platforms, suitesの各所から同じキーをマージするので色々な所で個別の設定を生やしておけます。
kitchen diagnoseコマンドでコンフィグの重なり具合をいつでも確認できるので、何か変更したら都度確認してみるといいでしょう。

ちなみにrun_listattributeだけは特別な名前で、アレイ同士が合成されたりとChefでのDeep Mergeを踏襲しています。

追記:
.kitchen.ymlattributeを記述すると、node_jsonの中身とマージします。
同じキーはattributeのほうを優先し、ファイルの使い回しや、環境依存設定の上書きをしやすいように。

あとはkitchen converge(kitchen test)でVM作成とItamaeが実行されます。

Itamaeプラグインを使う

これはkitchen-itamaeのデモにあるとおり、kitchen/Gemfileを設置すればItamae実行前にBundlerでインストールするようにしています。

kitchen/
├── Gemfile
├── nodes
│   ├── node1.json
│   └── node2.json
├── recipes
│   ├── file.rb
│   ├── git.rb
│   ├── mail_alias.rb
│   ├── package1.rb
│   ├── package2.rb
│   └── selinux.rb
└── templates
    └── template.erb

Gemfileに使用するプラグインを書いたら、あとはinclude_recipeするなど好きなように。

Chef-Applyでプロビジョニング

Test-Kitchenのプロビジョナ、よく見たら標準にchef-applyがありませんでした。
既にあるshellプロビジョナでも普通にまかなえますけど、折角なのでこちらは単品公開ではなく本家にPRしています。

Add Provisioner chef_apply by sawanoboly · Pull Request #623 · test-kitchen/test-kitchen

Recipeを置くディレクトリはapply/(変更可)です。

apply/
├── hoge.rb
├── recipe1.rb
└── recipe2.rb

あとはrun_listにレシピの名前を書いたらおわり。

.kitchen.yml(chef_apply)
---
driver:
  name: vagrant

provisioner:
  name: chef_apply

platforms:
  - name: ubuntu-12.04
  - name: centos-6.4

suites:
  - name: default
    run_list:
      - recipe1
      - recipe2

と、こんな感じの設定になりますね。

23
21
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23
21