puppet 重复资源和虚拟资源

puppet 重复资源和虚拟资源

概述

我刚刚开始使用 Puppet,但还未能发现一些问题。

问题

由于规范化,当我将两个类添加到具有相同依赖关系的包的节点时,它会失败。

简单来说,有重复的资源——在本例中是包libssl

注意:软件包被保留以防止安装最新的软件包。

问题

解决这个问题的最佳实践方法是什么?

class ssh {
  package { 'openssh-server':
    ensure  => installed,
    require => Package['libssl'],
  }
  package { 'libssl': ensure => installed, }
}

class apache {
  package { 'apache':
    ensure   => installed,
    require  => Package['libssl'], 
  }        
  package { 'libssl': ensure => installed, }
}

node server {
  include apache
  include openssl-server

答案1

您有两个选择,它们看起来几乎一样。

1:使其成为自己的类。

class ssh {
  package { 'openssh-server':
    ensure => present,
    require => Class['ssl'],
  }
}
class ssl {
  package { 'libssl': ensure => present, }
}

2:虚拟资源

class vpackages {
  @package { 'libssl': }
}
class ssh {
  include vpackages
  package { 'openssh-server':
    ensure => present,
    require => Package['libssl'],
  }
  realize Package['libssl']
}

我发现将依赖关系分解到它们自己的模块中比使用虚拟资源更好。

答案2

如果您使用标准包管理来管理通过 Puppet 安装的包,那么您应该能够省略libsslPuppet 中的包依赖关系,因为这将通过大多数系统上的包管理系统自动处理。

在 Debian/Ubuntu 以及 RedHat/CentOS/SuSE 系统上,包管理工具会查找依赖项,除非您特意停止默认行为,否则当 Puppet 告诉系统安装包时,将包含额外的依赖包(在您的情况下只需openssh-serverapache

答案3

它有点丑陋,但有一个 defined() 函数可以返回 true/false。这样,您可以多次定义资源,但只能在第一次评估时“实现”它们。(使用 puppet 运行阶段!)

例如,

if defined(Package['libssl']) == false {
  package { 'libssl':
    ensure => installed, 
  }
}

相关内容