我在无主配置中使用Puppet 4.5并尝试创建一个Puppet函数来读取分配角色和环境的简单配置文件。我没有与hiera / facter集成,我可以改变。
文件格式为:
host1::java_app_node::qa
host2::nodejs_app_node::prod
将读取此文件的Puppet函数位于名为homebase
的模块中。我想函数返回散列配置值的散列或散列数组。这将让我在模板中使用它们。
在modules/homebase/manifests/init.pp
我定义:
$role_file = 'puppet://role.lst'
然后我创建了modules/homebase/functions/get_roles.pp
,如下所示:
function homebase::get_roles() {
$func_name = 'homebase::get_roles()'
if ! File.exists?($::homebase::role_file) {
fail("Could not find #{$::homebase::role_file}")
}
hosts = { }
File.open($::homebase::role_file).each |line| {
parts = line.split(/::/)
hosts[parts[0]] = { 'host' => parts[0], 'role' => parts[1], 'env' => parts[2] }
}
return hosts
}
在其他课程中,我想打电话:
class myapp {
$servers = homebase::get_roles().each | k, v | {
$v['host'] if $v['role'] =~ /myapp/ && $v['env'] == $environment
}
file { 'myapp.cfg':
ensure => file,
path => '/opt/myapp/myapp.cfg',
source => template("/myapp/myapp.cfg.erb"),
mode => '0644',
owner => myuser,
group => myuser,
}
}
似乎有更好的方法来做到这一点。我完全不在基地吗?
答案 0 :(得分:1)
事实证明,这是一种更简单的方法,而不是尝试创建一个函数来读取非标准配置文件。相反,我使用site.pp
文件来创建node {}
个条目。我还参数化了myapp
类以根据节点获取输入。
所以我的site.pp
看起来像是:
node 'server1.mydomain', 'server2.mydomain' {
$myvar = [ 'val1', 'val2' ]
class { 'myapp':
values => $myvar
}
}
这可能会有所改善。其中一个问题是使用非Puppet配置文件,我能够控制我的bash包装器脚本中的执行。但是,当使用节点定义时,大部分需求都消失了。