Fork me on GitHub
Suzf  Blog

Puppet 将模块绘制成依赖关系图

依赖使关系迅速变得复杂,并且很容易结束循环依赖,(其中A依赖B,B又依赖A)这将引起
puppet编译错误并停止工作,幸运的是,puppet的图表选项可以很容易生成一个资源之间的依赖
关系图,它可以帮助我们解决这些问题。

准备工作:

1.安装看图文件所需要的graphviz软件包:
# apt-get install graphviz
如何做
1.创建/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"],
}
}
2.复制已经存在的ntp.conf文件到admin模块files目录:
# cp /etc/ntp.conf /etc/puppet/modules/admin/files
3. 添加要执行这个类的客户端节点:
node cookbook {
include admin::ntp
}
4.客户端运行puppet:
# puppet agent --test
info: Retrieving plugin
info: Caching catalog for cookbook.bitfieldconsulting.com
err: Could not apply complete catalog: Found dependency cycles in
the following relationships: File[/etc/ntp.conf] => Package[ntp],
Package[ntp] => File[/etc/ntp.conf], Package[ntp] => Service[ntp],
File[/etc/ntp.conf] => Service[ntp]; try using the '--graph'
option and open the '.dot' files in OmniGraffle or GraphViz
notice: Finished catalog run in 0.42 seconds
5.查看图片文件是否已创建
# ls /var/lib/puppet/state/graphs/
expanded_relationships.dot relationships.dot resources.dot
6.创建一个图形化的关系依赖图:
# dot -Tpng -o relationships.png /var/lib/puppet/state/graphs/relationships.dot
7.查看图片:如下图所示
# eog relationships.png

是如何工作的
当你使用puppet --graph(或者在配置文件里启用图形化),puppet 会生成三个DOT格式的
三个文件(图形语言)
resource.dot 显示资源的类和次结构,但没有依赖关系。
releationships.dot 以箭头显示资源之间的依赖关系,如上图
expanded_relationships.dot 一个更详细的版本关系图
dot工具(graphviz软件包的一部分)可以将这些图像等转换为png格式进行查看。
在关系图中,每个资源在你的代码中显示为一个气球,用带箭头的线,连接他们表示依赖,在上面的
例子中我们可以看到,在文件/etc/ntp.conf与软件包ntp之间的依赖关系,

为了解决相互依赖关系的问题,所以你要做的就是删除依赖关系之一的线,因此可以打破循环。
还有更多

即使你不用去寻找bug,资源和关系图都非常有用,如果你有一个非常复杂的网络类和资源,
例如:研究资源图表可以让你看起来更简单,一目了然,同样,当依赖关系变得过于复杂,从阅读
代码到理解,图表跟文档相比较是更有用的。
[总结]
本章节puppet 如何绘画资源依赖关系图就到此结束,接下来下章会介绍如何调试puppet代码,
这对puppet 新手来说很重要,在写出漂亮的puppet代码的时候,还必须会调试它,本系列
都是按照puppet cookbook进行翻译的,错误在所难免,如有错误,欢迎指出谢谢!