使用本地文件作为 Puppet 模板

使用本地文件作为 Puppet 模板

我是一名 Java 软件开发人员,正在尝试找到一种智能方法来分发和配置我的应用程序。为此,我构建了一个 rpm 包,并且我们已经设置了一个卫星。目标操作系统是 Red Hat Enterprise。对于配置管理,我们使用 puppet。

到目前为止,一切都运行良好。我们正在根据 Puppet 中的节点配置设置数据库连接字符串和主机名。这些进入 Puppet Master 中的 erb 模板文件。

但是现在,我需要修补 RPM 中的一个文件。这是一个在构建时生成的文件,并且会随着每次构建而更改,因此我们不想将其放入 puppet 中。其中有一个标识符(可自由选择,如 <% baseURL %>)。不幸的是,我们需要在此文件中设置一个基本 URL,该 URL 取决于它所在的节点。我考虑过将我们的文件作为 .erb 放入 RPM 中,但似乎 puppet 无法使用目标系统中的本地文件作为模板,在我见过的所有示例中,模板都位于 puppet master 上。

另一个问题是,如果包更新或者 baseUrl 配置发生变化,则必须从模板转换为真实配置文件。

我想利用木偶模板来实现这一点,但我不确定它是否有效。

我当前的解决方案是:我使用 puppet 在 /etc/myapp/webstart_baseurl 中的每台机器上创建一个与节点相关的文件。它看起来像:

MYAPP_WEBSTART_BASEURL=http\\:\\/\\/10.12.1.42\\/myapp_ws\\/
export MYAPP_WEBSTART_BASEURL

然后我编写了一个 shell 脚本,并把它包含在我的 RPM 中。它位于 /usr/bin/patchHostnameForWebstart.sh 中。

#!/bin/sh

#the file where to load the baseUrl from (in property $MYAPP_WEBSTART_BASEURL)
MYAPP_WEBSTART_SERVERCONFIG=/etc/myapp/webstart_baseurl

MYAPP_JNLP_TOKEN=@@myapp.webstart.baseurl@@

if [ -f $MYAPP_WEBSTART_SERVERCONFIG ]
then
    source $MYAPP_WEBSTART_SERVERCONFIG
    echo "found config for webstart server, baseUrl is $MYAPP_WEBSTART_BASEURL"
    echo "replacing tokens MYAPP_JNLP_TOKEN .."

    find /var/www/html/myapp_ws -name *.jnlp -print -exec sed -i  "s/${MYAPP_JNLP_TOKEN}/${MYAPP_WEBSTART_BASEURL}/g" {} \;
    echo "url tokens of all .jnlp files in /var/www/html/myapp_ws have been processed"

else
    echo "WARNING! no config for webstart server found, baseUrl of .jnlp files might not be set"
    exit 1

fi

将脚本与 puppet 分开的优点是,如果 baseUrl 配置发生变化,它可以直接在 rpm install 中运行,也可以从 puppet 运行。

但是,这个解决方案的缺点是我必须自己实现替换,并且需要以这种非常丑陋的双引号方式编写 baseUrl 配置,其中包含很多反斜杠。我认为如果其他人更改它,这很容易出错。

任何改进建议都很好。提前致谢

米歇尔

答案1

puppet 可以使用本地信息..如果您编写了一个设置事实的 facter 脚本..您可以从 puppet 内部引用该值。

例子

$ facter puppetversion
2.6.4

我可以在模板或 pp 文件中使用 $puppetversion 来获取 2.6.4。编写 facter 脚本非常简单,您可以使用 puppet 分发 facter 脚本并将其放置在正确的位置,这样当您运行 facter 时,它就会将其添加到列表中。

http://projects.puppetlabs.com/projects/1/wiki/Adding_Facts

答案2

为什么不执行 perl 脚本来修补它?

$baseURL = "/path/with/$fact/inside"
exec { "perl -p -i.bak -e 's^\Q<% baseURL %>\E^$baseURL^' /path/to/file/":
    onlyif  => "grep -q '<% baseURL %>' /path/to/file",
    require => Package['yourrpm'],
}

相关内容