企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
### 绘制依赖关系图 依赖关系会迅速变得复杂起来,并且很容易形成 **循环依赖**(**circular dependency**) (即 A 依赖 B,B 又依赖 A),这将导致 Puppet 发生错误并停止工作。 幸运的是, Puppet 的 --graph 选项可以很容易生成一个资源之间的依赖关系图, 它可以帮助我们解决循环依赖的问题。 #### 准备工作 使用如下命令安装查看图片文件所需的 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 文件到 Puppet: ``` # 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 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 ``` 5. 使用上面建议的 --graph 选项运行 Puppet: ``` # puppet agent --test --graph ``` 6. 检查已经创建的图片文件: ``` # ls /var/lib/puppet/state/graphs/ expanded_relationships.dot relationships.dot resources.dot ``` 7. 创建一个图形化的关系依赖图 ``` # dot -Tpng -o relationships.png \ /var/lib/puppet/state/graphs/relationships.dot ``` 8. 使用如下命令查看关系依赖图: ``` # eog relationships.png ``` ![https://box.kancloud.cn/2016-05-12_5733eecec3c64.png](https://box.kancloud.cn/2016-05-12_5733eecec3c64.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),资源和其关系图也非常有用。 如果你为一个非常复杂的网络设计类和资源,研究资源关系图可以让你看起来更简单。 同样,当依赖关系变得过于复杂,通过阅读配置清单难于理解时,关系图比文档就显得更为有用。