如何向 puppet 模块传递参数?

如何向 puppet 模块传递参数?

配置 puppet 模块的最佳实践是什么?我有 puppet 2.7.11。我觉得这种方式很混乱,看起来像使用全局变量。

node default {
   $always_apt_update = true
   include apt
}

我是否应该创建一个继承原始配置的类?文档似乎有太多版本,我不确定哪一个适合我。

更新:

当我尝试这个时:

  class { 'apt': 
    always_update => 'true',
  } 

我收到一个错误:

Error 400 on SERVER: Invalid parameter always_update at /etc/puppet/manifests/nodes.pp:32

答案1

您应该使用参数化类而不是全局变量。

例如:

node default {
  class {'apt': 
    always_update =>true 
  }
}
class apt ($always_update = true ) {
  // code 
}

node 'example.com' { 
  class { bar: }
}

有关更多信息,请参阅 Puppet 文档:

答案2

这些答案似乎有点过时,使用新版本的 puppet 即 3.7.x,可以使用 Hiera 传递类参数。像类声明这样的资源不再被视为最佳实践。

虽然第二个答案确实使用了 Hiera,但它明确使用了“hiera”函数,这又是一种不太可取的做法。

新的解决方案看起来是这样的:

/etc/puppet/manifests/site.pp

node default {
    include apt
}

/etc/puppet/modules/apt/manifests/init.pp

class apt ($always_update = true ) {
  // code 
}

/etc/puppet/hieradata/<filename>.yaml

apt::always_update: true

Hiera 数据 yaml 文件可以根据需要具有不同的参数值。

答案3

目前推荐的做法是使用希拉。它内置于 3.x 中,但在 2.7 中您需要单独安装它。

然后,您可以从清单中的 Hiera 获取该apt类别的数据:

$always_apt_update = hiera("always_apt_update")

使用像这样的 Hiera 配置..

:hierarchy:
  - %{::clientcert}
  - common

..节点(从事实中提取clientcert)在查找中将比common.yaml文件具有更高的优先级。

因此,使用always_apt_update: falseinnode1.example.com.yamlalways_apt_update: truein 时common.yaml,node1 最终会将该变量设置为 false,而其他节点则将其默认设置为 true。

相关内容