【问题标题】:Node specific settings in a puppet environmentpuppet 环境中的节点特定设置
【发布时间】:2023-03-18 16:13:01
【问题描述】:

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

傀儡服务器:5.1.3
傀儡代理:5.3.2
puppetlabs-java: 2.1.0

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

我目前已将代理配置为指向我的 puppet 服务器和我命名为 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 而另一个不会,但它似乎不尊重我在java.pp 中的任何设置。如何使用 java.pp 文件中的自定义设置仅将 java 安装到 node1

【问题讨论】:

标签: puppet


【解决方案1】:

如果我将 java.pp 放在清单文件夹中,它会将 java 应用于两个节点,无论我是否在任一节点中调用了 include java

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

如果我将include java 放在任一节点上,则可以正常工作,一个节点将获得 java 而另一个则不会,但它似乎不尊重我在 java.pp 中的任何设置。

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

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


关于 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

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

更新完模块数据后,你可能会发现你需要让master过期它的环境缓存。一种方法是重新启动服务。

【讨论】:

  • 为了简化对初学者级别的include java 解释的一部分(针对提问者),include 正在拉入您安装的puppetlabs-java 并忽略您的java.pp,因为它不是在正确的位置。
  • 感谢约翰和马特,这些事情很有意义。我仍然在语法上有点挣扎,我已经在我的环境中添加了一个数据目录并创建了一个java.yaml,其中包含:--- java:distribution: - jre 我尝试在hiera.yaml 中添加名称和路径,但它没有似乎根本没有收集数据?我是在犯一个简单的语法错误还是我误解了你在说什么?
  • 你的YAML在评论中被压扁的方式很难说,但看起来你的数据文件至少有两个问题:(1),你想要的key是java::distribution(类名和参数名之间有两个冒号); (2) 大概你希望值是一个字符串,而不是一个数组,所以失去键和值之间的'-'。
  • 我在这里打错字了,但是我的数据文件有双冒号,我把它改成了一个看起来像java::distribution: jre 的衬里,但它似乎仍然不适用。我在 hiera.yaml 中的 hiera.yaml 中有一条路径设置为 path: java.yaml 虽然我认为从 datadir 被设置为默认值,无论如何它都会选择它?
  • @Merakel,我在回答中添加了一些有关 Hiera 配置的信息。
猜你喜欢
  • 2016-05-28
  • 2018-12-02
  • 2013-03-04
  • 1970-01-01
  • 2017-12-08
  • 2014-09-04
  • 1970-01-01
  • 2015-07-30
  • 1970-01-01
相关资源
最近更新 更多