apt な cookbook

以下なリポジトリから clone してます。

  • git://github.com/opscode-cookbooks/apt.git

recipes/default.rb ですが以下が分からなかったので確認を入れるなど。

# provides /var/lib/apt/periodic/update-success-stamp on apt-get update
package "update-notifier-common" do
  notifies :run, resources(:execute => "apt-get-update"), :immediately
end

これ、update-notifier-common パケジが導入されたらすぐに apt-get-update を実行せよ、って意味なのかどうなのか。ちょっとざっくりしかこのパケジの機能が理解できてないんですが、これで良いのだろうなぁ、で良いのかどうか。
以下、default.rb のざっくりを列挙しときます。

  • /var/lib/apt/periodic/update-success-stamp が無ければ apt-get update
    • 失敗してもスルー (ignore_failure true)
  • 何もしない apt-get upate がある
  • 何もしない apt-get -y autoremove がある
  • 何もしない apt-get -y autoclean がある
  • update-notifier-common パケジが導入されたらすぐに apt-get update
  • /varlib/apt/periodic/update-success-stamp のタイムスタンプを見て apt-get update
  • /var/cache/local および /var/cache/local/preseeding なディレクトリを作成
    • root:root で 00755

試験

ディレクトリの作成と、ファイル削除して実行とかタイムスタンプ操作して実行とか? つうかそもそもどうやって ssh な接続をして云々なのかを確認しないとアレ。
諸々確認します。

lib/serverspec/backend/ssh.rb

do_check! とか ssh_exec! などというメソドが定義されています。do_check! が public に開放されてるメソドか。あら、lib/serverspec/backend/exec.rb にも do_check というソレが定義されてますね。
よくよく見てみると Ssh クラスは Exec クラスを継承してました。ということはどちらもあり得るのか。あ、serverspec-init する時にこれを選択してるのか。lib/serverspec/setup.rb にありますね。成程。

module Serverspec
  class Setup
    def self.run
      prompt = <<-EOF
Select a backend type:

  1) SSH
  2) Exec (local)
  3) Puppet providers (local)

Select number: 
EOF
      print prompt.chop
      num = gets.to_i - 1
      puts

      @backend_type = [ 'Ssh', 'Exec', 'Puppet' ][num]

で、backend_type の値で spec_helper.rb の中身が変わるのか。ちなみに spec_helper.rb の先頭らへんで以下な include があり

include Serverspec::Helper::Ssh

lib/serverspec/helper/ssh.rb で backend の値が Ssh なオブジェクトの参照に、ということになっている模様です。ふむふむ。
ええと、そゆ意味では backend は試験からも見えてる、という理解で良いのかな。そうであれば backend.do_check を使ってコマンドをタタけるのかどうなのか。

irb で確認してみた。

irb(main):001:0> require './spec/spec_helper.rb'
=> true
irb(main):002:0> backend
TypeError: nil is not a symbol
        from /home/rms/.rbenv/versions/1.9.3-p385/lib/ruby/gems/1.9.1/gems/serverspec-0.2.19/lib/serverspec/helper/detect_os.rb:5:in `const_get'
        from /home/rms/.rbenv/versions/1.9.3-p385/lib/ruby/gems/1.9.1/gems/serverspec-0.2.19/lib/serverspec/helper/detect_os.rb:5:in `commands'
        from /home/rms/.rbenv/versions/1.9.3-p385/lib/ruby/gems/1.9.1/gems/serverspec-0.2.19/lib/serverspec/helper/ssh.rb:5:in `backend'
        from (irb):2
        from /home/rms/.rbenv/versions/1.9.3-p385/bin/irb:12:in `<main>'

む、駄目だ。以下も微妙。

irb(main):003:0> include Serverspec::Helper::Ssh
=> Object
irb(main):004:0> require 'serverspec'
=> false

本当は spec/spec_helper.rb を require できた時点で backend は見えてないと、という理解がダウトなのかな。
つうかそもそも Serverspec::Helper::Ssh を include した時点で、ってこれは irb なプロンプトで云々しちゃ駄目なのかな。

できた

> require 'serverspec'
=> true
> xx = Serverspec::Helper::Ssh
=> Object
> xx.backend("ls")
=> #<Serverspec::Backend::Ssh:0x00000000f978d8 @commands="ls">

これ、spec_helper で include してるので、試験の中では呼び出し可能なはず。出力が必要なコマンドでなければそのまんま、で OK なのかな。
ちょいへろへろ気味なので apt なソレで確認、ってのは別途ということにて。