我正在尝试用 puppet 管理我的/etc/hosts
文件,但我不喜欢内部的“主机”类型,如果可能的话,我想使用我自己的模板。
因此我定义了一个“主机”资源:
# Basic hosts configuration
class hosts {
# Host resource
define host (
$address,
$names
) {
}
Network::Hosts::Host {
before => File['/etc/hosts']
}
# Configure hosts file
file {
"/etc/hosts":
ensure => present,
checksum => md5,
owner => root,
group => root,
mode => 0644,
content => template("network/hosts.erb"),
}
在其他地方,我定义了主机资源:
network::hosts::host { 'puppet.test.lan':
address => '192.168.56.101',
names => 'puppet',
}
我想在模板中包含已定义主机的列表,但我不知道如何迭代资源及其属性。我尝试使用字符串连接,但无法正常工作,而且不太优雅。
我如何遍历所有已定义的主机并将它们从模板中包含进去?
答案1
你可以使用 RIPienaar 的puppet-concat模块,您可以在其中通过许多较小的文件或模板构建单个文件。
定义看起来会像这样:
define host($address, $names) {
concat::fragment{"hosts-$address":
target => "/etc/hosts",
content => template("network/hosts_single.erb")
}
}
模板hosts_single.erb
将代表文件中的一行。您可能还会添加一个标题片段,并设置order => "01"
为确保它位于生成文件的顶部(默认值为 10)。
答案2
我会看看奥吉阿斯图书馆用于管理/etc/hosts
文件中的条目。它是 Puppet 的先决条件,因此已安装。您可能需要下载额外的 augeas 包才能访问augtool
命令行实用程序。这对于在 Puppet 集成之前进行测试很有用。
主站点上列出的 hosts 文件条目示例: http://augeas.net/tour.html
或者
http://honglus.blogspot.com/2012/01/augeas-quick-start.html
我想您也可以分发一个标准主机文件,然后只需修改每个主机需要唯一的行......