CucumberでChefの腕前を試す
YungSang
February 11, 2013
YungSang
$ \curl -L https://get.rvm.io | bash -s stable $ source ~/.rvm/scripts/rvm $ rvm requirements $ brew install autoconf automake apple-gcc42 ... # 環境によって異なる $ rvm install 1.9.3
$ gem install bundler
$ mkdir <project-home> $ cd <project-home> $ rvm --rvmrc --create 1.9.3 $ vi Gemfile
source :rubygems gem "cucumber-chef", :git => "git://github.com/Atalanta/cucumber-chef", :tag => "v2.1.0.rc.15" # v2.1.0.rc.12~14 はバグあり gem "vagrant" # v2.1.0.rc.12 以降、Vagrant は別途インストールが必要
$ bundle --path=vendor/bundle
$ mkdir .chef # ダミー $ bundle exec cucumber-chef init $ vi .cucumber-chef/config.rb
provider :vagrant librarian_chef false lxc_user "root" lab_user "ubuntu" prerelease true <中略> # TODO vagrant[:identity_file] = "~/.vagrant.d/insecure_private_key"
$ mkdir -p .cucumber-chef/vagrant $ touch .cucumber-chef/vagrant/knife.rb $ bundle exec cucumber-chef displayconfig # 設定の確認
$ bundle exec vagrant init precise64 $ vi Vagrantfile
config.vm.box = "precise64" config.vm.box_url = "http://files.vagrantup.com/precise64.box" config.vm.customize ["modifyvm", :id, "--memory", 512] # メモリは適宜 <中略> config.vm.forward_port 4000, 4000 config.vm.forward_port 4040, 4040 config.vm.forward_port 8787, 8787
$ bundle exec cucumber-chef setup
※ 環境にもよるが完了まで10分以上かかる
$ bundle exec cc-knife cookbook create chef-client $ bundle exec cucumber-chef create devopserver $ vi features/devopserver/devopserver.feature
@devopserver Feature: Perform test driven infrastructure with Cucumber-Chef In order to learn how to develop test driven infrastructure As an infrastructure developer I want to better understand how to use Cucumber-Chef Background: * I have a server called "devopserver" * "devopserver" is running "ubuntu" "precise" * "devopserver" has been provisioned * the following cookbooks have been uploaded: | cookbook | cookbook_path | | chef-client | ./cookbooks | * the "chef-client::default" recipe has been added to the "devopserver" run list * the chef-client has been run on "devopserver" * I ssh to "devopserver" with the following credentials: | username | keyfile | | $lxc$ | $lxc$ | <以下略>
$ bundle exec cucumber
* cucumber-chef v2.1.0.rc.15 @devopserver Feature: Perform test driven infrastructure with Cucumber-Chef In order to learn how to develop test driven infrastructure As an infrastructure developer I want to better understand how to use Cucumber-Chef Background: # features/devopserver/devopserver.feature:7 * I have a server called "devopserver" # vendor/bundle/ruby/1.9.1/bundler/gems/cucumber-chef-0f94e45a0de5/lib/cucumber/chef/steps/provision_steps.rb:22 * "devopserver" is running "ubuntu" "precise" # vendor/bundle/ruby/1.9.1/bundler/gems/cucumber-chef-0f94e45a0de5/lib/cucumber/chef/steps/provision_steps.rb:26 * "devopserver" has been provisioned # vendor/bundle/ruby/1.9.1/bundler/gems/cucumber-chef-0f94e45a0de5/lib/cucumber/chef/steps/provision_steps.rb:46 * the following cookbooks have been uploaded: # vendor/bundle/ruby/1.9.1/bundler/gems/cucumber-chef-0f94e45a0de5/lib/cucumber/chef/steps/chef_steps.rb:57 | cookbook | cookbook_path | | chef-client | ./cookbooks | * the "chef-client::default" recipe has been added to the "devopserver" run list # vendor/bundle/ruby/1.9.1/bundler/gems/cucumber-chef-0f94e45a0de5/lib/cucumber/chef/steps/provision_steps.rb:54 * the chef-client has been run on "devopserver" # vendor/bundle/ruby/1.9.1/bundler/gems/cucumber-chef-0f94e45a0de5/lib/cucumber/chef/steps/provision_steps.rb:62 * I ssh to "devopserver" with the following credentials: # vendor/bundle/ruby/1.9.1/bundler/gems/cucumber-chef-0f94e45a0de5/lib/cucumber/chef/steps/ssh_steps.rb:28 | username | keyfile | | $lxc$ | $lxc$ | <以下略>
※ 初回起動時のみ precise のルートファイルシステムを作成するため時間が掛かる
※ 空のレシピの為、正常の場合でも最後のシナリオは失敗する
$ bundle exec cucumber-chef destroy devopserver
※ コンテナは破棄されるが、precise のルートファイルシステムは残る。
$ vi features/devopserver/devopserver.feature
@devopserver Feature: Perform test driven infrastructure with Cucumber-Chef In order to learn how to develop test driven infrastructure As an infrastructure developer I want to better understand how to use Cucumber-Chef Background: * I have a server called "devopserver" * "devopserver" is running "ubuntu" "precise" * "devopserver" has been provisioned * the following cookbooks have been uploaded: | cookbook | cookbook_path | | hello-world | ./cookbooks | * the "hello-world::default" recipe has been added to the "devopserver" run list * the chef-client has been run on "devopserver" * I ssh to "devopserver" with the following credentials: | username | keyfile | | $lxc$ | $lxc$ | Scenario: Say "Hello World!" Then file "/tmp/hello-world" should exist And file "/tmp/hello-world" should be owned by "root" And file "/tmp/hello-world" should contain """ Hello World! """
$ mkdir -p cookbooks/hello-world $ touch cookbooks/hello-world/README.md $ vi cookbooks/hello-world/metadata.rb
name "Hello World" version "0.1.0"
$ mkdir -p cookbooks/hello-world/recipes $ vi cookbooks/hello-world/recipes/default.rb
file "/tmp/hello-world" do content "Hello World!\n" owner "root" group "root" mode 0755 action :create end
$ bundle exec cucumber
* cucumber-chef v2.1.0.rc.15 @devopserver Feature: Perform test driven infrastructure with Cucumber-Chef In order to learn how to develop test driven infrastructure As an infrastructure developer I want to better understand how to use Cucumber-Chef Background: # features/devopserver/devopserver.feature:7 * I have a server called "devopserver" # vendor/bundle/ruby/1.9.1/bundler/gems/cucumber-chef-0f94e45a0de5/lib/cucumber/chef/steps/provision_steps.rb:22 * "devopserver" is running "ubuntu" "precise" # vendor/bundle/ruby/1.9.1/bundler/gems/cucumber-chef-0f94e45a0de5/lib/cucumber/chef/steps/provision_steps.rb:26 * "devopserver" has been provisioned # vendor/bundle/ruby/1.9.1/bundler/gems/cucumber-chef-0f94e45a0de5/lib/cucumber/chef/steps/provision_steps.rb:46 * the following cookbooks have been uploaded: # vendor/bundle/ruby/1.9.1/bundler/gems/cucumber-chef-0f94e45a0de5/lib/cucumber/chef/steps/chef_steps.rb:57 | cookbook | cookbook_path | | hello-world | ./cookbooks | * the "hello-world::default" recipe has been added to the "devopserver" run list # vendor/bundle/ruby/1.9.1/bundler/gems/cucumber-chef-0f94e45a0de5/lib/cucumber/chef/steps/provision_steps.rb:54 * the chef-client has been run on "devopserver" # vendor/bundle/ruby/1.9.1/bundler/gems/cucumber-chef-0f94e45a0de5/lib/cucumber/chef/steps/provision_steps.rb:62 * I ssh to "devopserver" with the following credentials: # vendor/bundle/ruby/1.9.1/bundler/gems/cucumber-chef-0f94e45a0de5/lib/cucumber/chef/steps/ssh_steps.rb:28 | username | keyfile | | $lxc$ | $lxc$ | Scenario: Say "Hello World!" # features/devopserver/devopserver.feature:20 hello-world regular file Then file "/tmp/hello-world" should exist # vendor/bundle/ruby/1.9.1/bundler/gems/cucumber-chef-0f94e45a0de5/lib/cucumber/chef/steps/ssh_steps.rb:88 root:root And file "/tmp/hello-world" should be owned by "root" # vendor/bundle/ruby/1.9.1/bundler/gems/cucumber-chef-0f94e45a0de5/lib/cucumber/chef/steps/ssh_steps.rb:122 Hello World! And file "/tmp/hello-world" should contain # vendor/bundle/ruby/1.9.1/bundler/gems/cucumber-chef-0f94e45a0de5/lib/cucumber/chef/steps/ssh_steps.rb:131 """ Hello World! """ 1 scenario (1 passed) 10 steps (10 passed) 0m11.055s
$ bundle exec cucumber-chef halt
$ bundle exec cucumber-chef up
$ bundle exec cucumber-chef destroy
$ gem install foodcritic $ foodcritic cookbooks/hello-world
※ Bundler による実行環境下ではそのままでは動作しない