无主木偶中读取角色、环境文件的功能

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 包装器脚本中控制执行。但是,随着节点定义的出现,大部分需求都消失了。