Puppet 环境中的节点特定设置

Node specific settings in a puppet environment

我正在学习 puppet,并且 运行 我认为这是一个非常基本的问题。为了简单起见,我使用的是 puppet forge 模块,而不是任何自定义编写的模块。这是我使用的明智版本:

人偶服务器:5.1.3
人偶特工:5.3.2
puppetlabs-java: 2.1.0

当我安装 puppetlabs-java 模块时,我使用的是 --modulepath /etc/puppetlabs/code/modules/.

我目前将我的代理配置为指向我的人偶服务器和我命名为 example 的环境。

目前的环境是这样的:

├── environment.conf
├── hiera.yaml
├── manifests
│   └── init.pp
└── modules
    └── java.pp

我没有对 environment.confhiera.yaml 进行任何操作,它们目前是默认值。我的 init.pp 包含:

node 'node1' {
}

node 'node2' {
}

我的 java.pp 包含:

class { 'java':
  distribution => 'jre',
}

我的问题有两个。如果我将 java.pp 放在清单文件夹中,它会将 java 应用于两个节点,而不管我是否在任一节点中调用了 include java。如果我将 include java 放在任一节点上,它会正常工作并且一个节点将获得 java 而另一个不会,但它似乎不符合我在 [= 中的任何设置20=]。如何使用 java.pp 文件中的自定义设置仅将 java 安装到 node1

if I place the java.pp in the manifest folder it applies java to both nodes, regardless of if I have called out an include java in either node.

是的。目录构建器为每个节点处理环境 manifests 目录中的每个清单文件。您的 java.pp 文件包含 class java 的顶级范围声明,因此如果该文件由目录构建器处理,那么它将包含 class 'java'目标节点的清单。

If I put the include java on either node, that works correctly and one node will get java and the other will not, but it does not appear to be respecting any of the settings I have in the java.pp.

不,不会。 include java(或class { 'java': ... }声明classjava,从而指示目录构建器将class包含在目标节点的目录。这两种形式或多或少是替代品,都将导致目录构建器在环境的模块路径中查找 class java 的定义。您的 java.pp 在该搜索中找不到正确的名称或正确的位置,这很好,因为它实际上不包含所需的定义。

要自定义 class 参数,您应该立即从 external data and automatic data binding 开始。这不是将值绑定到 class 参数的 唯一 方法,但它是您应该更喜欢的机制,尤其是在跨模块边界声明 class 时。


关于 Hiera 的详细信息,用于此目的的非常基本的 Hiera 配置可能包括以下部分:

example/hiera.yaml

# example/hiera.yaml
---
version: 5

defaults:
  datadir: data
  data_hash: yaml_data

hierarchy:
  - name: "Common data"
    path: "common.yaml"

example/data/common.yaml

---
java::distribution: jre

这些文件名中的 "example" 将是同名环境的主目录。请注意,顺便说一下,虽然您 可以 为每个模块添加一个新的层次结构级别,但这并不常见。更典型的做法是使用映射到所配置机器的层次分类的层次结构;上面的命名预示了这样一种安排,其中目前只有一个类别。

更新模块数据后,您可能会发现需要让主节点过期其环境缓存。一种方法是重新启动服务。