Назад | Перейти на главную страницу

использовать локальный файл в качестве шаблона марионетки

Я разработчик программного обеспечения 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 он добавлял его в список.

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'],
}