Марионетка, сопоставляющая несколько имен хостов агентов структуре данных params.pp
У меня есть модуль под названием appserver
в моих кукольных модулях. В этом модуле проявляется у меня есть params.pp
файл, который наследуется init.pp
файл. В params.pp
У меня есть следующая структура данных.
$servers = {
appserver-mgr => { axis2 => {subDomain => 'mgt',},
carbon => {subDomain => 'mgt',},
serverOptions => '-Dsetup',
server_home => $carbon_home, },
appserver-wkr => { axis2 => {subDomain => 'worker', members => ['appserver-mgr2-ip']},
carbon => {subDomain => 'worker',},
serverOptions => '-DworkerNode=true',
server_home => $carbon_home, },
}
В моем init.pp
файл Я заполняю свои шаблоны следующим образом, используя указанную структуру данных.
define fill_templates($axis2, $carbon, $clustering, $serverOptions, $server_home) {
$ipAdd = $::ipaddress
$hostName = $::hostname
if $hostName == "${name}" {
notify {"host name match found for $hostName for $ipAdd":}
file { "${server_home}/repository/conf/axis2/axis2.xml":
ensure => file,
content => template('appserver/axis2.xml.erb'),
}
->
file { "${server_home}/repository/conf/carbon.xml":
ensure => file,
content => template('appserver/carbon.xml.erb'),
}
->
file { "${server_home}/repository/conf/tomcat/catalina-server.xml":
ensure => file,
content => template('appserver/catalina-server.xml.erb'),
}
}
}
Согласно текущему методу, если найден соответствующий узел (скажем, appserver-mgr
) соответствующие значения структуры данных извлекаются и применяются к шаблонам. В настоящее время эти скрипты работают как положено.
Теперь я хочу изменить это следующим образом.
У меня есть кластер, содержащий следующие узлы.
appserver-mgr-1
appserver-mgr-2
appserver-mgr-3
appserver-wkr-1
appserver-wkr-2
appserver-wkr-3
appserver-wkr-4
appserver-wkr-5
Используя ту же структуру данных в params.pp
файл, как я могу применить appserver-mgr
конфигурация для *.mgr
узлы 1-3 и appserver-wkr
конфигурация для *.wkr
узлы 1-5?
Могу ли я использовать регулярные выражения для этой задачи?
1 ответ
Я совершенно уверен, что было бы возможно согнуть Puppet DSL, чтобы сделать то, что вам нужно здесь. Тем не менее, гораздо лучший подход к этому вопросу - Hiera.
node /appserver-mgr/ {
$node_class = 'appserver'
$node_subclass = 'manager'
}
node /appserver-wrk/ {
$node_class = 'appserver'
$node_subclass = 'worker'
}
Использовать node_class
а также node_subclass
переменные в вашей иерархии.
# /etc/puppet/hiera.yaml
---
:backends:
- yaml
:yaml:
:datadir: /etc/puppet/hieradata
:hierarchy:
- "%{::clientcert}"
- "class-%{node_class}-%{node_subclass}"
- "class-%{node_class}"
- common
Теперь вы можете определять свои данные прямо в YAML для Hiera, а не params.pp
,
# /etc/puppet/hieradata/class-appserver-manager.yaml
servers:
axis2:
subDomain: mgt
carbon:
subDomain: mgt
serverOptions: -Dsetup
server_home: %{carbon_home}
а для работника:
# /etc/puppet/hieradata/class-appserver-worker.yaml
servers:
axis2:
subDomain: worker
members:
- appserver-mgr2-ip
carbon:
subDomain: worker
serverOptions: -DworkerNode=true
server_home: %{carbon_home}
В вашем params
класс, тогда достаточно следующее:
$servers = hiera('servers')
Или ты даже не заморачиваешься с params
класс, и просто заменить использование $servers
переменная с hiera
звонки. Но делать только один звонок в params
Урок стиля - хорошая практика.
Примечание. Использование значения переменной %{carbon_home}
из Hiera несколько опасно, вы можете захотеть жестко закодировать фактическое значение в YAML там.