Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ChefとServerspecでテスト駆動インフラ開発

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

 ChefとServerspecでテスト駆動インフラ開発

Avatar for Creationline

Creationline

December 05, 2025
Tweet

More Decks by Creationline

Other Decks in Technology

Transcript

  1. Excel手順書 Considered Harmful Excel手順書はなぜ「有害と考えられる(Considered Harmful)」か※多少誇張あり 更新されても差分が取れない → 要人の目 テキストなら diff

    が取れるのに 変更履歴が取れないのでファイル名に日付をつけ たり「最新」とか「古い」とかいうディレクトリ を作る、しかもしばしば更新されない → 要新旧 の判断基準 テキストなら VCS に入れられるのに
  2. テスト駆動インフラ開発の実践 Excel確認手順書からServerspecテストを起こ し、設置直後のサーバにかける → すべて失敗 Excel設定手順書からChef Cookbookを起こす Test KitchenでServerspecテストをかけ、Chef Cookbookにバグがないことを確認

    Chef Cookbookをサーバに適用し、Serverspec テストをかける → すべて成功ならば、OK! もし失敗したら、ServerspecテストとChef Cookbookのどちらか/両方を修正して擦り合せ すべて成功になるまで繰り返す
  3. Serverspec 実例(1/2) shared_examples_for 'check /etc/sysconfig/i18n' do describe file( '/etc/sysconfig/i18n' )

    do its( :content ) { should match %r|^LANG="ja_JP.UTF-8"$| } end end ファイル /etc/sysconfig/i18n が文字列 LANG="ja_JP.UTF-8" を含むか確認 自動ならファイルを間違えない! 自動なら文字列を間違えない!
  4. Serverspec 実例(2/2) shared_examples_for 'check cpu core num' do |cpu_cores| host_inventory['cpu']['total'].to_i.times

    do |i| describe host_inventory['cpu'][ i.to_s ]['cpu_cores'] do it { should eq cpu_cores } end end end describe 'check cpu core num' do it_should_behave_like 'check cpu core num', '4' end CPUのコア数を確認する(関数みたいにして引数 (cpu_cores)も使える)
  5. Chef Cookbook実例(1/3) file '/etc/sysconfig/i18n' do owner 'root' group 'root' mode

    '0644' content <<-_EOF_ LANG="ja_JP.UTF-8" SYSFONT="latarcyrheb-sun16" _EOF_ end ファイルの内容をベタ貼り
  6. Chef Cookbook実例(2/3) file '/etc/sudoers' do _file = Chef::Util::FileEdit.new( path )

    _file.search_file_replace_line( %q!^#\s*%wheel\s*ALL=\(ALL\)\s*ALL!, %Q!%wheel\tALL=(ALL)\tALL\n! ) content _file.send( :editor ).lines.join end sed みたいな行置換
  7. Chef Cookbook実例(3/3) # attribute default['service']['enabled'] = %w( nimbus zabbix-agent )

    # recipe node['service']['enabled'].each do |s| service s do action [ :enable, :start ] end end 引数を取ってのサービスのオンオフ
  8. kitchen-verifier-shell 超いかす Chef CookbookのTest Kitchenでのテストは busser-serverspec (作:d-higuchi)より kitchen-verifier-shell (作:sawanoboly)で busser-serverspecだとChef

    Cookbookと Serverspecの結びつきが強すぎる コードを一体化しないといけない TK内で両者を橋渡しするBusserは融通効かない kitchen-verifier-shellなら両コードを分離可能 シェル叩くだけなので仲介者のBusserが不要
  9. よくあるテストの問題 人は見たいものしか見ない 入力テストOK → どんな入力でもOKの欠陥テスト 正規表現マッチングはミスの宝庫 ユニットテスト全OK → 結合した本番で失敗 あるユニットの動作が他ユニットに影響

    Test KitchenならOK → 本番で失敗 TKのネットワークと本番ネットワークの差異 OKになるようにテストを書き、OKだからと安心して しまう → 本末転倒、油断・慢心