ちょっと話題の記事

Chefのテストツール kitchen-ec2を使う – 導入、チュートリアル

2014.05.28

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは。望月です。
最近、社内で利用しているchefクックブックの数が増えてきています。それ自体は非常に良いことなのですが、そろそろ本腰入れてChefのテストを書いていかなければならないと思うようになりました。
その第一歩として、test-kitchenとkitchen-ec2を利用して、chefの実行からテストまでを自動化することを試してみました。今日はまず、インストールから実行までの手順をまとめてみます。

test-kitchenとは

test-kitchenは、Chefで記述されたレシピの実行・テストを補助するためのツールセットです。

test-kitchenの特徴は、Chefの実行を行うために起動するVMの、起動先のクラウドや仮想化ツールをプラグインで選択できることです。VagrantやDocker、EC2などを起動先として選択できます。
弊社がAWS上にLinuxサーバを構築する際にはAmazon Linuxがよく用いられますが、Amazon LinuxはEC2上で動作させないと様々な問題がある *1ので、今回はtest-kitchenからEC2を扱うためのkitchen-ec2を利用して、test-kitchenの使い方をひと通り試してみます。

インストール

手元のマシンはMac OS X 10.9にて実行しています。まず、test-kitchenkitchen-ec2をインストールします。

$ gem install test-kitchen

$ kitchen version
Test Kitchen version 1.2.1

$ gem install kitchen-ec2

次に、chefのクックブックが存在するリポジトリに移動し、kitchenを利用するための準備を行います。今回はApacheのクックブックで検証しています。

$ cd path/to/cookbook_dir
$ kitchen init --driver=kitchen-ec2
      create  .kitchen.yml
      create  test/integration/default
      create  .gitignore
      append  .gitignore
      append  .gitignore
         run  gem install kitchen-ec2 from "."
Successfully installed kitchen-ec2-0.8.0
1 gem installed

kitchen initを利用することにより、test-kitchenで利用するファイル群が生成されます。生成された.kitchen.ymlがtest-kitchenの設定ファイルになります。
--driverオプションで、VMの起動先(利用するkitchenプラグイン)を指定します。今回はkitchen-ec2の利用が目的なのでその通り入力しています。

Amazon Linuxをkitchen-ec2で利用するために、Amazon Linux最新版のAMI IDを設定ファイルに記載する必要があります。kitchen-ec2のREADMEを参考に、以下の様なkitchen.ymlを作成しました。

driver:
  name: ec2
  aws_access_key_id: <%= ENV['AWS_ACCESS_KEY'] %>
  aws_secret_access_key: <%= ENV['AWS_SECRET_KEY'] %>
  aws_ssh_key_id: <%= ENV['AWS_KEY_PAIR'] %>
  ssh_key: <%= File.expand_path('~/.ssh/#{ENV['AWS_KEY_PAIR']}.pem') %>
  security_group_ids: ["sg-abcd1234"]
  region: ap-northeast-1
  availability_zone: ap-northeast-1a
  require_chef_omnibus: true

provisioner:
  name: chef_solo

platforms:
  - name: AmazonLinux-201403
    driver:
      image_id: ami-c9562fc8
      username: ec2-user

suites:
  - name: default
    run_list:
      - recipe[apache24::default]
    attributes:

.kitchen.ymlはerb形式をサポートしているので、上に示したような形で変数を埋め込むことが可能です。アクセスキーやシークレットキー、キーペアは環境変数から読み込むようにしています。

これでkitchenのセットアップは完了です。kitchen createコマンドをInstance Nameを引数につけて実行することで、レシピを適用する仮想マシンを起動することが出来ます。Instance Nameはkitchen listコマンドで確認できます。

mochizukimasao@HL00044 $ kitchen list
Instance                    Driver  Provisioner  Last Action
default-AmazonLinux-201403  Ec2     ChefSolo     <Not Created>

Instance Nameは.kitchen.ymlに記述されたplatform nameとsuite nameを基に生成されます。今回はdefault-AmazonLinux-201403がInstance Nameとなります。

さて、それではkitchen createを実行してみます。EC2インスタンスが起動します。

mochizukimasao@HL00044 $ kitchen create default-AmazonLinux-201403
-----> Starting Kitchen (v1.2.1)
-----> Creating <default-AmazonLinux-201403>...
       EC2 instance <i-xxxxxxxx> created.
...............       (server ready)
       Waiting for ec2-xx-xxx-xx-xx.ap-northeast-1.compute.amazonaws.com:22...
       <snip>
       (ssh ready)\n
       Finished creating <default-AmazonLinux-201403> (1m53.79s).
-----> Kitchen is finished. (1m54.82s)

起動後は、kitchen convergeコマンドを実行することで、リモートのVMに対して以下のことが実行されます。

  • Instanceにchef-soloのインストール
  • Instanceにrecipeのアップロード
  • recipeの実行
$ kitchen converge default-AmazonLinux-201403
-----> Starting Kitchen (v1.2.1)
-----> Converging <default-AmazonLinux-201403>...
       Preparing files for transfer
       Preparing current project directory as a cookbook
       Removing non-cookbook files before transfer
       Preparing data bags
       Preparing nodes
-----> Installing Chef Omnibus (true)
<snip>
       Chef Client finished, 8/8 resources updated in 20.486205403 seconds
       Finished converging <default-AmazonLinux-201403> (0m50.08s).
-----> Kitchen is finished. (0m51.21s)

# 状態の確認
$ kitchen list
Instance                    Driver  Provisioner  Last Action
default-AmazonLinux-201403  Ec2     ChefSolo     Converged

kitchen listコマンドを実行すると、今のInstanceの状態が取得できます。kitchen convergeを実行した後は[Last Action]が[Converged]になっていることが確認できます。
また、Instanceの終了にはkitchen destroy を実行します。

まとめ

今回はChefのテストツールであるtest-kitchenとそのEC2用プラグインであるkitchen-ec2の導入と動作確認を行いました。今まで手作業で実施していたEC2の起動やknife solo prepareのchefを実行するための前準備をいい感じにラッピングしてくれています。

ですが、今回の内容は、単純にEC2インスタンスを起動してchefレシピを実行しただけです。
test-kitchenを導入した真の目的である、テスト実行については次回以降のブログにて書きます。

参考資料

脚注

  1. yumのamznリポジトリが利用できない等。