我想通过分组机器(例如 RH5 和 RH6 机器)在 nodes.pp 中应用“DRY”(不要重复自己)原则,而不是为所有 RH5 和 RH6 服务器添加多行包含内容。
使用以下方式时,tst-01 上的 Puppet 可以正常工作:
node "tst-01" inherits basenode {
但是,当我尝试使用以下配置将服务器组织成组时,它就崩溃了:
node "tst-01" inherits redhat6server {
“inherits redhat6server”的错误是:
err: Could not retrieve catalog; skipping run
[root@tst-01 ~]# puppet agent --test
err: Could not retrieve catalog from remote server: Error 400 on SERVER: Failed to parse template ldap/access.conf: Could not find value for 'netgroup' at 124:/etc/puppet/modules/ldap/templates/access.conf at /etc/puppet/modules/ldap/manifests/init.pp:82 on node tst-01.tst.it.test.com
warning: Not using cache on failed catalog
err: Could not retrieve catalog; skipping run
这是 access.conf 文件,如果将继承设置为“继承基节点”,则它可以正常工作。
[root@puppet]# grep -v "#" /etc/puppet/modules/ldap/templates/access.conf
+ : root : LOCAL
+ : @<%= netgroup %> : ALL
- : ALL : ALL
[root@puppet]#
这是 /etc/puppet/manifests/nodes.pp 中的配置。
# Basenode configuration
node "basenode" {
include resolv_conf
include sshd
include ntpd
include motd
}
# Groups
node "redhat6server" inherits basenode {
include ldap_auth
}
# Testservers
node "tst-01" inherits redhat6server {
$netgroup = tst-01
}
答案1
它可能会失败,因为发生继承前变量$netgroup
被求值,因此目录编译失败。但是,使用此方法将代码与数据分开有局限性,应该避免。
我已经重构了我的傀儡代码来使用层次数据用于数据绑定并实现对类似节点进行分组的相同效果。假设您只需要对 RHEL 服务器进行分组,则简化的示例如下:
将使用以下定义检索分层数据:
hiera.yaml --- :backends: - yaml :hierarchy: - %{::operatingsystem} - %{::hostname} - common :yaml: :datadir: /etc/puppet/hieradata/
和
operatingsystem
都是hostname
。Hierafacts
将尝试数据分辨率对于主机名是以下的 Red Hat 系统,请按以下顺序操作some-rhel-hostname
:- RedHat.yaml
- 某些-rhel-主机名.yaml
- 通用.yaml
这需要以下目录结构和文件:
/etc/puppet/hieradata/ ├── common.yaml ├── RedHat.yaml ├── some-rhel-hostname.yaml └── tst-01.yaml
示例 yaml 文件的内容:
common.yaml --- classes: - resolv_conf - sshd - ntpd - motp RedHat.yaml --- classes: - ladp_auth some-rhel6-hostname.yaml --- classes: - this_host_only ldap_auth::netgroup: foo-bar tst-01.yaml --- ldap_auth::netgroup: tst-01 nodes.pp default { hiera_include(classes) }
注意使用
hiera_include
功能,将返回一个数组全部每个节点的值(来自common.yaml
层次结构解析的值,即,some-rhel-hostname
将包括common.yaml
来自以及ldap_auth
来自其自己的 yaml 文件的所有类)。RedHat.yaml
this_host_only
如何在模块中使用数据绑定取决于
puppet
您使用的版本。检查这里用于指针。