puppet - puppet 类的 require 和 ordering 之间的区别

标签 puppet

我想实现 puppet 类之间的依赖关系,以便类(它们的内容)以确定的方式执行。阅读文档我想出了以下两种方法:

订购

class Level1 {
  Class['Level2']->Class[Level1']
  package { "A":
    ensure => "installed"
  }
}

class Level2 {
  include Level3
  package { "B":
    ensure => "installed"
  }
}

class Level3 {
  package { "C":
    ensure => "installed"
  }
}

根据documentation

-> (ordering arrow) Causes the resource on the left to be applied before the resource on the right. Written with a hyphen and a greater-than sign.

我预计会发生以下情况:

  • Level2 在 Level1 之前调用
  • 安装包 B 或 C(顺序可以是随机的,因为未指定)
  • 安装包 A。

需要

class Level1 {

  require Level2
  package { "A":
    ensure => "installed"
  }

}

class Level2 {
  require Level3
  package { "B":
    ensure => "installed"
  }
}

class Level3 {
  package { "C":
    ensure => "installed"
  }
}

根据documentation

cause every resource in the required classes to be applied before any of the resources in the requiring class.

我预计会发生以下情况:

  • Level3 被 Level2 调用
  • 安装包 C
  • Level2 被 Level1 调用
  • 安装包 B
  • 安装包 A

替代订购

class Level1 {
  Class['Level3']->Class['Level2']->Class[Level1']
  package { "A":
    ensure => "installed"
  }
}

class Level2 {
  package { "B":
    ensure => "installed"
  }
}

class Level3 {
  package { "C":
    ensure => "installed"
  }
}
  • 级别 2 需要级别 1
  • 3 级需要 2 级
  • 软件包 C 已安装
  • 安装包 B
  • 安装包 A

我的假设和结论正确吗? 我已经搞乱这些依赖关系有一段时间了,它们的行为似乎并不像我想象的那样。也许我在与类一起使用 require-> 时遗漏了一些东西。如有任何反馈,我们将不胜感激!!

编辑1

分段似乎是修复两个类之间的依赖关系的良好机制(请参阅 here ),因为您必须手动定义每个类对之间的阶段依赖关系。您将如何使用三级或四级级别的舞台?

编辑2

考虑这个更现实的情况,其中类 a 用作包装器来同时安装多个包。

每个节点都在加载一些预定义的角色:

node 'some-host' {
    include role::processing_machine
}

角色定义如下:

class role::processing_machine {

    include role::ubuntu_desktop_standard_software
    include xorg::lts_12_04_quantal
    include software::standard_packages


    # define order in which classes should be executed
    Class["role::ubuntu_desktop_standard_software"] -> Class["xorg::lts_12_04_quantal"] -> Class["software::standard_packages"] -> Class["role::processing_machine"] 

}

这是role::ubuntu_desktop_standard_software 定义:

class role::ubuntu_desktop_standard_software {
    include role
    include profile::ubuntu_desktop
    include role::server::no_apache

    # define order in which classes should be executed.
    Class["role"] -> Class["profile::ubuntu_desktop"] -> Class["role::server::no_apache"] -> Class["role::ubuntu_desktop_standard_software"]

}

如您所见,我正在尝试链接多个类,以便它们按特定顺序执行(Class["a"] -> Class["b"])。以前我只在我的类中使用 include 但 puppet 会以任意顺序执行 include 命令,因此某些命令(必须先运行!)不会首先运行。

尽管进行了这些链接努力,但 puppet 似乎仍然在执行类随机方式。我究竟做错了什么?是否有更清晰/更好的方法来定义节点,以便我可以确保它们以特定的预定义方式部署?

最佳答案

这是一个例子:

 class L {
   package { "C" :
      ensure => installed,
      require => Package["A", "B",],
   }

   package { "B" :
      ensure => installed,
      require => Package["A"],
   }

   package { "A" :
      ensure => installed,
   }
 }

关于puppet - puppet 类的 require 和 ordering 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22821690/

相关文章:

python - Puppet 只创建一次 virtualenv

java - 为什么net.exe start <servicename>服务启动时报错?

ruby - 如何使用puppet在服务器上设置环境变量?

docker - 如何解决 puppet 认证问题

regex - 用正则表达式替换字符串中的 [ 和 ]

.net - 如何确保 Puppet 代理上安装了 .NET 4.5?

linux - Vagrant、Symfony、chmod 许可证

ruby - `load_missing_constant' : 未初始化的常量 Mocha::Standalone (NameError)

linux - puppet 覆盖模块上的文件资源

tomcat - 无法使用 Puppet 在 Tomcat 上部署 Solr