代码之家  ›  专栏  ›  技术社区  ›  leoOrion

木偶依赖管理

  •  0
  • leoOrion  · 技术社区  · 7 年前

    假设我有一个安装包的类( profile::base::tools )另一个类定义了yumrepos( profile::base::yum )这些包需要。

    class profile::base::tools {
       $packages = [
          'package1',
          'package2'
       ]
    
       package { $packages:
         ensure => present,
       }
    }
    

    目前它的运行方式是基本.pp:

    基本.pp:

    include profile::base::yum 
    include profile::base::tools
    
    Class['profile::base::yum'] -> [
        Class['profile::base::tools']]     
    

    所以当我跑的时候 base.pp 它首先创建yum repos,然后安装包。当前 tools.pp 需要首先定义的yumrepos只在 基本.pp

    我的问题是如果我跑了 include profile::base::yum 基本.pp )

    2 回复  |  直到 7 年前
        1
  •  5
  •   John Bollinger    7 年前

    我的问题是如果我跑了工具.pp单独(出于测试目的)是不会的 了解依赖性,因此失败。我可以加上include 中的profile::base::yum工具.pp但我想知道 每个类了解依赖关系的标准,即使它已经存在 在别处定义(如基本.pp)

    puppet/stdlib 模块没有 an assert_private function 这可以帮助您实施预期的使用模式。

    另一方面,公共类应该声明它们的所有依赖项,并在内部安排应用程序需求的任何设置顺序。这确保了使用它们所需要做的就是声明它们本身。关于如何做到这一点,有许多不同的说法。在您的特定情况下,正是您当前在 profile::base 类可以改为(或另外)在中设置 profile::base::tools require 声明:

    class profile::base::tools {
       # 'require' does everything 'include' does, plus establishes a relationship:
       require profile::base::yum
    
       # ...
    
    }
    

    class profile::base::tools {
       include profile::base::yum
    
       $packages = [
          'package1',
          'package2'
       ]
    
       package { $packages:
         ensure  => present,
         require => Class['profile::base::yum'],
       }
    }
    

    在这种情况下,这没有实际意义,但在其他情况下可能有用。这里要注意的是 include yum::profile::base

        2
  •  2
  •   Alex Harvey    7 年前

    不清楚您实际上是如何进行测试的,但是如果您使用Rspec,那么您可以使用 pre_condition post_condition 例如:

    describe 'profile::base::tools' do
      let(:pre_condition) {
        """
        include profile::base::yum
        """
      }
    
      let(:post_condition) {
        """
        Class['profile::base::yum'] -> [
          Class['profile::base::tools']]
        """
      }
    
      it { is_expected.to contain_package('package1') }
      it { is_expected.to contain_package('package2') }
    end
    

    当然,您并不真正需要post条件;将这两个条件都放在pre\条件中就可以了,因为这段代码的顺序实际上并不重要,比如:

      let(:pre_condition) {
        """
        include profile::base::yum
    
        Class['profile::base::yum'] -> [
          Class['profile::base::tools']]
        """
      }