puppet类的require和order之间的区别

时间:2014-04-02 19:56:06

标签: 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

  

- > (订购箭头)使左侧的资源在右侧的资源之前应用。用连字符和a。写的   大于号。

我希望发生以下情况:

  • 在Level1
  • 之前调用Level2
  • 软件包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

  

导致应用所需类中的每个资源   在要求类中的任何资源之前。

我希望发生以下情况:

  • Level3由Level2调用
  • 软件包C已安装
  • Level1由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->一起使用时,我可能会遗漏一些内容。任何反馈都表示赞赏!!

EDIT1

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

EDIT2

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

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

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,但木偶会以任意顺序执行include命令,因此有些命令(必须首先运行!)不会先运行

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

1 个答案:

答案 0 :(得分:2)

以下是一个例子:

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

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

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