我通过 puppet 管理多台机器。这些机器位于不同的物理位置。每个位置都有特定的位置编号。
我有一个配置文件,其中需要有正确的位置编号。
所以/etc/abc.conf的内容如下:
this=that
location=$LOCATION_NUMBER
bananas=tasty
当文件被推送到机器时,我需要 $LOCATION_NUMBER 实际上是位置编号。
我可以用 puppet 管理这个文件吗?如何管理?
如果我为 LOCATION_NUMBER 导出一个因素,那么当 Puppet 将文件推送到机器时,它能写入正确的位置编号吗?
谢谢。
答案1
您要做的就是创建模板。它是 Puppet 的核心功能,非常有用。您可以编写一个 eRB 格式的文件,该文件可以使用 Ruby 代码和 Facter 变量来构建文件。以下是示例:
file { '/etc/my_config_file':
ensure => present,
owner => 'root',
group => 'root',
mode => 0700,
content => template('module/my_config_file.erb'),
}
现在,在您的模块层次结构下templates/
(不是 files/
), 放置文件my_config_file.erb
:
this=that
location=<%= LOCATION_NUMBER %>
bananas=tasty
格式<%= %>
表示执行一些 Ruby 代码并返回结果。在这种情况下,所有事实都可以作为局部变量使用,例如ipaddress
或lsbmajdistrelease
(LOCATION_NUMBER
您的自定义事实)。您还可以使用任何其他不直接在 中返回结果的 Ruby 代码<% %>
,例如if
语句:
<% if LOCATION_NUMBER == 7 %>
custom_config=true
<% else %>
custom_config=false
<% end %>
编辑:当我重新阅读这个答案时,我想建议你不要在 Fact 名称中使用大写字母。在 Ruby 中,以大写字母开头的变量是不可变的。虽然我不确定这是否真的一个问题,它违反了惯例。
答案2
此外,你可以将 $LOCATION_NUMBER 变量存储为由电子海图。您可以使用 ENC 让特定位置(或域)、组或主机名中的主机获得特定变量。目前有多种预先构建并可用的优质免费 ENC,包括 Dashboard 和 The Foreman。