使用本地文件作为傀儡模板

我是一个java软件的开发人员,并试图find一个聪明的方式来让我的应用程序在我们的数据中心分布和configuration。 为此,我build立了一个rpm包,并且build立了一个卫星。 目标操作系统是Red Hat Enterprise。 对于configurationpipe理我们使用木偶

到现在为止,一切运行良好。 我们根据puppet中的节点configuration来设置数据库连接string和主机名。 这些进入erb模板文件,我们也有木偶大师。

但现在,我需要修补一个属于RPM的单个文件。 这是一个在构build时生成的文件,每个构build都会随之更改,所以我们不喜欢把它放到傀儡中。 有一个标识符(自由select,如<%baseURL%>)。 不幸的是,我们需要在这个文件中设置一个基本的URL,这取决于它所在的节点。 我想将我们的文件作为.erb存放在RPM中,但似乎puppet不能使用目标系统的本地文件作为模板,在我看过的所有例子中,模板都位于puppet master上。

另一个问题是,如果程序包被更新或baseUrlconfiguration发生变化,则必须从模板转换为真正的configuration文件。

我想利用这个木偶模板,但我不知道这是否工作。

我目前的解决scheme是:我使用木偶在/ etc / myapp / webstart_baseurl中的每台机器上创build一个依赖于节点的文件。 看起来像:

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分离脚本的优点是,它可以直接在rpm install和puppet中运行,以防baseUrlconfiguration发生变化。

然而,这个解决scheme的缺点是我必须在我的onw上实现replace,并且我需要用这个非常丑陋,双引号的方式写下baseUrlconfiguration,并且有很多反斜杠。 我认为这是相当容易出错的,如果有人应该改变它。

任何改进build议将是伟大的。 提前致谢

米歇尔

木偶可以使用本地信息..如果你写一个facter脚本来设置一个事实..你可以从木偶内部引用这个值。

 $ facter puppetversion 2.6.4 

我可以在我的模板或pp文件中使用$ puppetversion来获取2.6.4。 编写一个facter脚本是非常简单的,你可以使用木偶来分发facter脚本,把它放在正确的位置,所以当你运行facter时,它会把它添加到列表中。

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

为什么不执行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'], }