绘制依赖关系图

依赖关系会迅速变得复杂起来,并且很容易形成 循环依赖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
    

    img/ch02sec05.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),资源和其关系图也非常有用。 如果你为一个非常复杂的网络设计类和资源,研究资源关系图可以让你看起来更简单。 同样,当依赖关系变得过于复杂,通过阅读配置清单难于理解时,关系图比文档就显得更为有用。