puppet の依存関係で困った時の対処
に、 --graph
option を利用して、依存関係やリソースの一覧を見える化して眺めるとといいことがあるかもしれません。
詳細はこちらです。
出し方
puppet apply に --graph
オプションを付与すると graphdir
で指定された場所に .dot
フォーマットで生成されます。--graphdir=
オプションで画像の生成先を指定することもできます。
テキストファイルなのでそのまま開いて頑張って読むこともできますが、せっかくなので画像化してみます。画像化するにあたり puppetlbas では
- omnigraffle https://www.omnigroup.com/omnigraffle/
- graphviz http://www.graphviz.org/
を紹介していますが、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
relationships.png
個人的な発見としては
require parameter
やarrow operator
は複数の依存でもちゃんと数珠つなぎに見える化されるrequire function
は、class 先の依存関係までは評価されていない- このあたり ->
include function
は resources としては認識されるけど依存関係は関係ないことがわかるcontain function
は relationships 上では矢印として表現されておらず、resources を見ると class がまるっと配下になっている(contain という意味そのものか)- このあたり ->
未だに Puppet の依存関係ではまるのでちゃんと整理したい...