Puppet - 将哈希作为类参数传递

Mik*_*ell 5 puppet

试着这样做:

# nodes.pp
node 'dev-a-1.sn1.vpc1.example.com' inherits project_j1n_sn1_vpc1_dev {

    class { 'custom::core':
        overrides => {
            'openssh' => {'settings' => {'external_access' => 'true'}}, # Allow direct mounting for dev
            'rsyslog' => {'settings' => {'role' => 'node', 'filters' => {'php' => {'target' => 'remote'}, 'mail' => {'target' => 'remote'}}}}
        }
    }
}

# custom::core
class custom::core($overrides = {}) {

    if (has_key($overrides, 'openssh')) {

        $settings = $overrides['openssh']['settings']

        # Doesn't work
        create_resources('openssh', $settings)

        # Doesn't work
        class { 'openssh': $settings }
    }
}
Run Code Online (Sandbox Code Playgroud)

是否可以调用一个类并传递一个哈希作为参数?

Puppet/Puppetmaster v2.7.26-1(Centos 6.7)

Fel*_*ank 5

Puppet 4+ 中有一种方法。

class { 'ssh':
  * => $settings
}
Run Code Online (Sandbox Code Playgroud)

在roidelapluie 的博客上了解所有相关信息。


pti*_*rno 2

我的一位同事想出了一个很好的解决方案来解决过去2+puppet 中类似的问题。已利用create_resources此。

http://www.followski.com/quick-note-how-to-use-create_resources-to-initialize-a-class-in-puppet/

你的代码可能看起来像这样:

节点.pp

node 'dev-a-1.sn1.vpc1.example.com' inherits project_j1n_sn1_vpc1_dev {

    class { 'custom::core':
        overrides => {
            'openssh' => {'settings' => {'external_access' => 'true'}}, # Allow direct mounting for dev
            'rsyslog' => {'settings' => {'role' => 'node', 'filters' => {'php' => {'target' => 'remote'}, 'mail' => {'target' => 'remote'}}}}
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

定制::核心

class custom::core($overrides = {}) {

    if (has_key($overrides, 'openssh')) {

        $settings = $overrides['openssh']['settings']

        create_resources('class', { 'openssh' => $settings })
    }
}
Run Code Online (Sandbox Code Playgroud)

您会注意到,在上面链接的示例中,它看起来像create_resources('class', $params),但是假设您有一个散列,其键是类名(即openssh),其值是要设置的参数。我上面提到的例子本质上做了同样的事情。

您的节点定义也可以如下所示:

node 'dev-a-1.sn1.vpc1.example.com' inherits project_j1n_sn1_vpc1_dev {

    class { 'custom::core':
        overrides => {
            'openssh' => {'external_access' => 'true'}, # Allow direct mounting for dev
            'rsyslog' => {'role' => 'node', 'filters' => {'php' => {'target' => 'remote'}, 'mail' => {'target' => 'remote'}}}
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

你的班级是这样的:

class custom::core($overrides = {}) {
  if (has_key($overrides, 'openssh')) {
    create_resources('class', {'openssh' => $overrides['openssh'])
  }

  if (has_key($overrides, 'rsyslog')) {
    create_resources('class', {'rsyslog' => $overrides['rsyslog'])
  }
}
Run Code Online (Sandbox Code Playgroud)

我想你现在明白了。

几年前我们经常使用这个。然而,您可能需要考虑升级您的傀儡基础设施。

希望这对您有所帮助,或者至少为您指明了正确的方向。