![使用本地文件作为 Puppet 模板](https://linux22.com/image/561867/%E4%BD%BF%E7%94%A8%E6%9C%AC%E5%9C%B0%E6%96%87%E4%BB%B6%E4%BD%9C%E4%B8%BA%20Puppet%20%E6%A8%A1%E6%9D%BF.png)
我是一名 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 时,它就会将其添加到列表中。
答案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'],
}