Deployment

使用本地文件作為人偶模板

  • September 20, 2011

我是 Java 軟體的開發人員,並試圖找到一種聰明的方法來讓我的應用程序在我們的數據中心中分發和配置。為此,我建構了一個 rpm 包,我們已經設置了一個衛星。目標作業系統是 Red Hat Enterprise。對於配置管理,我們使用 puppet。

到目前為止,一切都執行良好。我們正在根據 puppet 中的節點配置設置數據庫連接字元串和主機名。這些進入我們在 puppet master 中也有的 erb 模板文件。

但現在,我需要修補作為 RPM 一部分的單個文件。這是一個在建構時生成的文件,每次建構都會更改,因此我們不喜歡將它放入 puppet 中。有一個標識符(自由選擇,如 <% baseURL %>)。不幸的是,我們需要在這個文件中設置一個基本 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 分開的優點是它可以直接在 rpm install 中執行,也可以從 puppet 中執行,以防 baseUrl 配置發生變化。

然而,這個解決方案的缺點是我必須在我的 onw 上實現替換,並且我需要以這種非常醜陋的雙引號方式編寫 baseUrl 配置,並帶有很多反斜杠。我認為如果其他人應該更改它,這很容易出錯。

任何改進建議都會很棒。提前致謝

米歇爾

puppet 可以使用本地資訊..如果您編寫一個設置事實的因素腳本..您可以從 puppet 內部引用該值。

例子

$ facter puppetversion
2.6.4

我可以在我的模板或 pp 文件中使用 $puppetversion 來獲得 2.6.4。編寫 facter 腳本非常簡單,您可以使用 puppet 分發 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&lt;% baseURL %&gt;\E^$baseURL^' /path/to/file/":
   onlyif  =&gt; "grep -q '&lt;% baseURL %&gt;' /path/to/file",
   require =&gt; Package['yourrpm'],
}

引用自:https://serverfault.com/questions/312959