Vagrand, Puppet, Guard (5)

Test Driven Infrastructure with Vagrant, Puppet and Guard というエントリを参考に色々検証してます。jenkins を apt で導入するナニを書いてみました。いくつかメモを以下に。

前提

このソリューションは Nodeless puppet というナニを前提にしているようで、エントリポイントは manifests/site.pp で以下な形になってて

node default {
  include truth::enforcer
}

truth::enforcer で has_role の戻りを見て処理を振り分けてる模様。例えば vagrant-guard-demo の実装は以下。

class truth::enforcer {

  group { "puppet":
    ensure => "present",
  }

  if has_role("webserver") {
    include role::webserver
    Group["puppet"] -> Class["role::webserver"] 
    notice("I am a webserver")
  }
}

has_role は module/truth/lib/puppet/parser/functions/has_role.rb で定義されていて server_tags という Facts から値を取得しとるのですが、逆に Facter に値を設定しているのは modules/truth/lib/facter/server_tags.rb で定義は以下。

Facter.add("server_tags") do
  setcode do
    tags=File.readlines("/data/etc/server_tags").map{|line| line.strip}.join(",")
    tags
  end
end

デフォな /data/etc/server_tags の中身は以下。

role:webserver=true

server_tags.rb を誰が呼んでいるのかはスルーで。

ということで

新たに何かを追加というか作成していく中では

  • /data/etc/server_tags に role:hoge=true を追加
  • /modules/role/manifests に hoge.pp を追加
    • クラス名は role::hoge
  • /moeules/role/rspec/classes/role_hoge_rspec.rb を追加

というカンジになるのかな。あと、cucumber ですが、不勉強で features/catalog_policy.feature に role::hoge を追加する程度しかカバーできてません。
とりあえず順に何したかな記録を。

rspec-puppet

基本的にはマニフェストの記述を確認するのみ、なのかな。例えば jenkins を apt で導入するナニが以下とすると
# 足りてないですが

class role::jenkins {
  exec { jenkins:
    command => "apt-get install -fy jenkins"
  }
}

rspec な試験は以下になるようです。

require "#{File.join(File.dirname(__FILE__),'..','spec_helper')}"

describe 'role::jenkins', :type => :class do
  it { should contain_exec('jenkins').with_command('apt-get install -fy jenkins') }
}

これ、UT って言えるのかなぁ的ナニ。実は現状、apt というナニを include しておるのですが、deprecated なソレを連発しているらしく、cucumber でエラーが沢山な状況です。

cucumber-puppet

こちら、あまりよく分かってません。とりあえず /puppet-repo/features/catalog_policy.feature を以下にしているのみ、です。

Feature: Catalog policy
  In order to ensure basic correctness
  I want all catalogs to obey my policy

  Scenario Outline: Generic policy for all server roles
    Given a node with role "<server_role>"
    When I compile its catalog
    Then compilation should succeed
    And all resource dependencies should resolve

    Examples:
      | server_role |
      | role::webserver |
      | role::jenkins |

基本的にはマニフェストが評価されて role::hoge があれば OK なんでしょうけど、server_role というのが謎。