ちくわ

ちくわにきゅうりを入れるとうまい

puppet の依存関係とかで graph オプションが便利

puppet の依存関係で困った時の対処

に、 --graph option を利用して、依存関係やリソースの一覧を見える化して眺めるとといいことがあるかもしれません。

詳細はこちらです。

出し方

puppet apply に --graph オプションを付与すると graphdir で指定された場所に .dot フォーマットで生成されます。--graphdir= オプションで画像の生成先を指定することもできます。

テキストファイルなのでそのまま開いて頑張って読むこともできますが、せっかくなので画像化してみます。画像化するにあたり puppetlbas では

を紹介していますが、OmniGraffle があればそちらのほうがいいとは思うのですが何分高いので graphviz (free)を利用してみます。

# OS X
% brew install graphviz

こんな感じで .dot から .png へ

% dot -Tpng resources.dot -o resources.png

みてみよう!

% open resources.png

ちょっと深追い

せっかくなので、複数の依存方法がどう可視化できるものなのか試してみました。 (この時の環境は Puppet 4.3.1 / Vagrant Box:puppetlabs/centos-7.2-64-puppet)

検証用の manifest

  • 以下以外に require function , contain function , include function を利用した時の読み込み先として nginx, sshd, chrony の manifest も用意
  • 上記 function のドキュメントはこちら
class test::require_parameter {

  file {'/tmp/rp-test1':
    ensure  => present,
    content => "test",
  }

  file {'/tmp/rp-test2':
    ensure  => present,
    content => "test",
    require => File['/tmp/rp-test1']
  }

  file {'/tmp/rp-test3':
    ensure  => present,
    content => "test",
    require => File['/tmp/rp-test2']
  }

}

class test::require_function {

  require nginx
  contain sshd
  include chrony

  file {'/tmp/rf-test1':
    ensure  => present,
    content => "Hi.",
  }

}

class test::arrow_operator {

  file {'/tmp/ao-test1':
    ensure  => present,
    content => "test",
  }

  file {'/tmp/ao-test2':
    ensure  => present,
    content => "test",
  }

  file {'/tmp/ao-test3':
    ensure  => present,
    content => "test",
  }

  File['/tmp/ao-test1'] -> File['/tmp/ao-test2'] -> File['/tmp/ao-test3']

}

結果

resources.png

f:id:ginbear:20151229023248p:plain

relationships.png

f:id:ginbear:20151229023241p:plain

個人的な発見としては

  • require parameterarrow operator は複数の依存でもちゃんと数珠つなぎに見える化される
  • require function は、class 先の依存関係までは評価されていない
    • このあたり -> f:id:ginbear:20151229023809p:plain:w200
  • include function は resources としては認識されるけど依存関係は関係ないことがわかる
  • contain function は relationships 上では矢印として表現されておらず、resources を見ると class がまるっと配下になっている(contain という意味そのものか)
    • このあたり -> f:id:ginbear:20151229023907p:plain:w300

未だに Puppet の依存関係ではまるのでちゃんと整理したい...