puppet,根据主机名值或唯一随机值设置模板变量

时间:2014-07-24 11:47:10

标签: puppet

我想在几台Linux机器上部署配置文件,并且需要确保该配置文件中的某个变量对每台机器都有唯一的值。到目前为止,我已经通过以下方式发送了相同的配置文件:

file {
    "/etc/nxserver/node.conf":
    mode => 644,
    ensure => file,
    source => "puppet:///modules/nxserver/nxserver-node.conf";
}

我认为切换到模板就像用source替换content一样简单:

file {
    "/etc/nxserver/node.conf":
    mode => 644,
    group => root,
    content => template("nxserver/nxserver-node.erb"),

}

nxserver-node.erb文件中,我可以通过以下方式设置感兴趣的变量:

# This file is managed by puppet
... random config stuff ...
somevariable = <%= hostname %>

我的问题:

  • 有没有办法处理&amp;在erb文件中提取<%= hostname %>的部分内容?例如。我的主机名可能是&#34; desktop-01234&#34;,我想使用&#34; 01234&#34;只有一点。我怎么做到这一点?
  • 或者,我可以指定一系列有效值,这些有效值唯一但随机分配给erb文件中的变量吗?例如。 somevariable可以是表示某个端口号的变量,范围为1000 - 4000.我需要确保在每个木偶主机上此变量具有不同的值。我怎么做到这一点?

编辑:我可以使用
fqdn_rand(MAX, [SEED])生成一个对每个主机名唯一的随机数,但根据文档,它将返回random whole number greater than or equal to 0 and less than MAX

<% Puppet::Parser::Functions.function('fqdn_rand') -%>
<% value = scope.function_fqdn_rand(['10000']) -%>
somevariable=<%= value.to_s %>

我已尝试使用+以及add添加偏移量,但+似乎是为字符串保留的,add函数未知。

2 个答案:

答案 0 :(得分:0)

以下完全符合我的要求:

<% Puppet::Parser::Functions.function('fqdn_rand') -%>
<% offset = "1000".to_i -%>
<% value = scope.function_fqdn_rand(['10000']).to_i + offset -%>
somevariable=<%= value.to_s %>

答案 1 :(得分:0)

在ERB模板中,您可以完成Ruby所能做的一切。 String方法特别有用。

例如,要从主机名中删除前缀,可以使用

somevariable = <%= @hostname.sub(/^desktop-/, '') %>