puppet:尝试使用definition $ title作为hiera变量名的一部分

时间:2014-06-10 10:55:38

标签: puppet definition hosts hiera

我们正在使用puppet模块来创建我们的主机条目,并且它变得相当大。目前我们有这个

host { hiera('server1-hostname'):
ip           => hiera('server1-ip-host'),
host_aliases => 'server1',
}

我们每台服务器都有一次。我们还有一个开发和生产环境,服务器数量略有不同,而且一切都变得有点混乱。

为了简化它,我尝试了这个

define hosts::addhost () {
host { hiera("${title}-hostname"):
ip           => hiera("${title}-ip-host"),
host_aliases => $title,
}
}

然后在课堂上,

$hostlist = server1, server2

addhost {$hostlist: }

但这给了我各种错误,例如

'语法错误:&#39 ;;预期'}'

这可能吗?这只是一个标点符号问题还是需要完全不同的方法?

1 个答案:

答案 0 :(得分:1)

使用exported resources来解决这个问题会少一些麻烦。

每个服务器都依赖$::hostname

等事实导出自己的主机条目
@@host { "$::fqdn": ip => $::ipaddress_eth0, host_aliases => $::hostname, tag => "server-list" }

并且还从所有(其他)机器中排出所有这些资源

Host<<| tag == "server-list" |>>

您当然可以使用Hiera来覆盖值,例如如果facter选择了错误的IP地址,则导出特定的IP地址。

@@host { "$::fqdn": 
  ip => hiera('hosts-ip-address', $::ipaddress_eth0),
  host_aliases => $::hostname,
  tag => "server-list"
}

如果您坚持在Hiera中获取完整数据,您可能需要考虑以下结构

hosts:
  "server1-hostname":
    ip: "a.b.c.d"
    host_aliases: server1
  "server2-hostname":
    ...

并在清单中

create_resources('host', hiera('hosts'))

但这是多余的信息,因为它可以为你收集所有这些信息(见上)。