Puppet 安装在另一个节点定义中定义的软件

Puppet installing software defined in another node's definition

我正在使用 Puppet Enterprise。

# puppet master --version
4.8.1

清单目录 (/etc/puppetlabs/code/environments/production/manifests) 包含以下内容:

iis.pp
rds.pp
site.pp

我在site.pp中有一个节点定义如下图:

# cat site.pp
node 'box A' {
    include iis
}

现在我面临的问题是,如果我创建一个新节点(例如方框 B)并通过创建如下所示的空白定义将其添加到 site.pp,它 仍然 安装实际上属于另一个节点(在本例中为 'box A')定义的软件。

node 'box B' { }

我在 site.pp 中没有在上述两个节点定义之外定义任何 include 语句。

为什么会这样?

更新:

# cat iis.pp
$iis_features = ['Web-Server','Web-WebServer','Web-Asp-Net45','Web-ISAPI-Ext','Web-ISAPI-Filter','NET-Framework-45-ASPNET']

windowsfeature { $iis_features:
  ensure => present,
}

从 Puppet 4 开始,top-level 环境 manifests/ 目录中的所有文件将被自动加载。通常这是为了让您可以定义不同的节点定义或 classes 并在不使用 import 指令(在 Puppet 2 和 3 中使用)的情况下加载它们。

在您的例子中,iis.pprds.ppsite.pp 被解析并在每个节点上使用。 (Directories: The main manifest(s) 有更多关于如何配置的信息。)

要修复它,请使用 Puppet classes 将您的 IIS 配置(windowsfeature 资源)分组到 iis class - 然后您的 include iis 将仅在 "box A".

上使用此配置

更改iis.pp定义一个class:

class iis {
  $iis_features = ['Web-Server','Web-WebServer','Web-Asp-Net45','Web-ISAPI-Ext','Web-ISAPI-Filter','NET-Framework-45-ASPNET']

  windowsfeature { $iis_features:
    ensure => present,
  }
}

理想情况下,将 iis.pp 移动到 /etc/puppetlabs/code/environments/production/modules/iis/manifests/init.pp 以位于标准模块位置。这提供了更好的性能,因为 Puppet 在您使用 include iis.

之前不需要读取 iis.pp