无主木偶中读取角色、环境文件的功能
Function to read role, environment file in masterless puppet
我正在使用无主配置的 Puppet 4.5,并尝试创建一个 Puppet 函数来读取分配角色和环境的简单配置文件。我与 hiera/facter 没有任何可以更改的集成。
文件格式为:
host1::java_app_node::qa
host2::nodejs_app_node::prod
将读取此文件的 Puppet 函数位于名为 homebase
的模块中。我想对 return 拆分配置值的散列或散列数组进行操作。这将允许我在模板中使用它们。
在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,
}
}
似乎有更好的方法来做到这一点。我完全没有根据吗?
结果证明有一种更简单的方法,而不是尝试创建一个函数来读取非标准配置文件。相反,我使用 site.pp
文件来创建 node {}
条目。我还参数化了 myapp
class 以根据节点获取输入。
所以我的 site.pp
看起来像:
node 'server1.mydomain', 'server2.mydomain' {
$myvar = [ 'val1', 'val2' ]
class { 'myapp':
values => $myvar
}
}
这可能可以改进。其中一个问题是非 Puppet 配置文件,我还能够在我的 bash 包装器脚本中控制执行。但是,随着节点定义的出现,大部分需求都消失了。
我正在使用无主配置的 Puppet 4.5,并尝试创建一个 Puppet 函数来读取分配角色和环境的简单配置文件。我与 hiera/facter 没有任何可以更改的集成。
文件格式为:
host1::java_app_node::qa
host2::nodejs_app_node::prod
将读取此文件的 Puppet 函数位于名为 homebase
的模块中。我想对 return 拆分配置值的散列或散列数组进行操作。这将允许我在模板中使用它们。
在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,
}
}
似乎有更好的方法来做到这一点。我完全没有根据吗?
结果证明有一种更简单的方法,而不是尝试创建一个函数来读取非标准配置文件。相反,我使用 site.pp
文件来创建 node {}
条目。我还参数化了 myapp
class 以根据节点获取输入。
所以我的 site.pp
看起来像:
node 'server1.mydomain', 'server2.mydomain' {
$myvar = [ 'val1', 'val2' ]
class { 'myapp':
values => $myvar
}
}
这可能可以改进。其中一个问题是非 Puppet 配置文件,我还能够在我的 bash 包装器脚本中控制执行。但是,随着节点定义的出现,大部分需求都消失了。