0

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?

我可以为这个任务使用正则表达式吗?

4

1 回答 1

1

我很确定可以弯曲 Puppet DSL 来满足您的需要。然而,解决这个问题的更好方法是 Hiera。

node /appserver-mgr/ {
    $node_class    = 'appserver'
    $node_subclass = 'manager'
}
node /appserver-wrk/ {
    $node_class    = 'appserver'
    $node_subclass = 'worker'
}

在层次结构中使用node_classnode_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是一种很好的做法。

注意:使用来自 Hiera 的变量值%{carbon_home}有些危险,您可能希望在 YAML 中硬编码实际值。

于 2014-12-23T10:47:33.127 回答