绘制依赖关系图
依赖关系会迅速变得复杂起来,并且很容易形成 循环依赖(circular dependency) (即 A 依赖 B,B 又依赖 A),这将导致 Puppet 发生错误并停止工作。 幸运的是, Puppet 的 --graph 选项可以很容易生成一个资源之间的依赖关系图, 它可以帮助我们解决循环依赖的问题。
准备工作
使用如下命令安装查看图片文件所需的 graphviz 软件包:
# apt-get install graphviz
操作步骤
创建 /etc/puppet/modules/admin/manifests/ntp.pp 文件,添加包含如下循环依赖的代码:
class admin::ntp { package { "ntp": ensure => installed, require => File["/etc/ntp.conf"], } service { "ntp": ensure => running, require => Package["ntp"], } file { "/etc/ntp.conf": source => "puppet:///modules/admin/ntp.conf", notify => Service["ntp"], require => Package["ntp"], } }
复制已存在的 ntp.conf 文件到 Puppet:
# cp /etc/ntp.conf /etc/puppet/modules/admin/files
在一个节点上包含这个类:
node cookbook { include admin::ntp }
运行 Puppet:
# puppet agent --test info: Retrieving plugin info: Caching catalog for cookbook.bitfieldconsulting.com err: Could not apply complete catalog: Found 1 dependency cycle: (File[/etc/ntp.conf] => Package[ntp] => File[/etc/ntp.conf]); try using the '--graph' option and open the '.dot' files in OmniGraffle or GraphViz notice: Finished catalog run in 0.42 seconds
使用上面建议的 --graph 选项运行 Puppet:
# puppet agent --test --graph
检查已经创建的图片文件:
# ls /var/lib/puppet/state/graphs/ expanded_relationships.dot relationships.dot resources.dot
创建一个图形化的关系依赖图
# dot -Tpng -o relationships.png \ /var/lib/puppet/state/graphs/relationships.dot
使用如下命令查看关系依赖图:
# eog relationships.png
工作原理
当你运行 puppet --graph (或者在 puppet.conf 文件中启用 graph 选项), Puppet 会生成三个 DOT 格式(一种图形语言)的文件。三个文件分别是:
resources.dot:显示资源的类和层次结构,但没有依赖关系
relationships.dot:以箭头显示资源之间的依赖关系,如上图所示
expanded_relationships.dot:一个更详细版本的关系图
dot 工具(是 graphviz 软件包的一部分) 可以将这些文件转换为 PNG 格式进行查看。
在关系图中,你的配置清单中的每个资源显示为一个气球, 用带箭头的线连接它们表示依赖关系。 从上面的例子中我们可以看到,在 File["/etc/ntp.conf"] 和 Package["ntp"] 之间存在循环依赖关系。
为了解决循环依赖问题,你要做的就是删除一条依赖关系线,从而打破循环。
更多用法
即使你不用去寻找错误(bug),资源和其关系图也非常有用。 如果你为一个非常复杂的网络设计类和资源,研究资源关系图可以让你看起来更简单。 同样,当依赖关系变得过于复杂,通过阅读配置清单难于理解时,关系图比文档就显得更为有用。