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 というのが謎。