Я разработчик программного обеспечения Java и пытаюсь найти разумный способ распространения и настройки моего приложения в нашем центре обработки данных. Для этого я создаю пакет rpm, и мы настроили сателлит. Целевая ОС - Red Hat Enterprise. Для управления конфигурацией мы используем марионетку.
До сих пор все работает нормально. Мы устанавливаем строки подключения к БД и имена хостов на основе конфигураций узлов в марионетке. Они входят в файлы шаблонов erb, которые также есть в мастере марионеток.
Но теперь мне нужно исправить один файл, который является частью RPM. Это файл, который создается при сборке и изменяется при каждой сборке, поэтому нам не нравится помещать его в марионетку. Идентификатор находится в (произвольно выбранный, например, <% baseURL%>). К сожалению, нам нужно установить базовый URL-адрес в этом файле, который зависит от узла, на котором он находится. Я думал о том, чтобы поместить наш файл в RPM как .erb, но похоже, что марионетка не может использовать локальные файлы из целевой системы в качестве шаблонов, во всех примерах, которые я видел, шаблоны расположены на мастере марионетки.
Другая проблема заключается в том, что преобразование из шаблона в реальный файл конфигурации должно происходить, если либо пакет обновляется, либо изменяется конфигурация baseUrl.
Я хотел бы использовать для этого шаблон марионетки, но не уверен, что это работает.
Мое текущее решение: я использую марионетку для создания файла, зависящего от узла, на каждой машине в / etc / myapp / webstart_baseurl. Это выглядит как:
MYAPP_WEBSTART_BASEURL=http\\:\\/\\/10.12.1.42\\/myapp_ws\\/
export MYAPP_WEBSTART_BASEURL
Затем я написал сценарий оболочки, который включил в свой 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
Преимущество отделения скрипта от марионетки заключается в том, что его можно запускать непосредственно в rpm install, а также из марионетки в случае изменения конфигурации baseUrl.
Однако недостатком этого решения является то, что мне пришлось реализовать замену в моем onw и что мне нужно написать конфигурацию baseUrl таким уродливым способом с двойными кавычками с большим количеством обратных косых черт. Я думаю, что это довольно чревато ошибками, если кто-то другой изменит это.
Любые предложения по улучшению были бы замечательными. заранее спасибо
Мишель
puppet может использовать локальную информацию .. Если вы напишете фактический сценарий, который устанавливает факт ... вы можете ссылаться на это значение изнутри puppet.
пример
$ facter puppetversion
2.6.4
Я могу использовать $ puppetversion в моем шаблоне или файле pp, чтобы получить версию 2.6.4. Написать фактер-скрипт довольно просто, и вы можете использовать марионетку, чтобы распространить фактер-скрипт, чтобы поместить его в нужное место, чтобы при запуске facter он добавлял его в список.
Почему бы не запустить 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'],
}