1

puppet 的新手并试图让这个模块工作,但发现它非常令人沮丧。

Error: Could not retrieve catalog from remote server: Error 400 on SERVER: can't convert String into Hash at /etc/puppet/modules/collectd/manifests/plugin/network.pp:28

我正在努力的插件是这个: https ://forge.puppetlabs.com/pdxcat/collectd#class-collectdpluginnetwork

我尝试设置的值是我尝试过的 collectd::plugin::network 下的服务器:

('127.0.0.1': port => 25826,) and 
('hostname' '127.0.0.1' 'port' 25826) and '127.0.0.1': port => 25826,

以及无数其他选择。

有人可以让我知道如何编写有效的哈希吗?

清单:

[root@foreman ~]# cat /etc/puppet/modules/collectd/manifests/plugin/network/server.pp
#
define collectd::plugin::network::server (
  $ensure        = 'present',
  $username      = undef,
  $password      = undef,
  $port          = undef,
  $securitylevel = undef,
  $interface     = undef,
) {
  include collectd::params
  include collectd::plugin::network

  $conf_dir = $collectd::params::plugin_conf_dir

  validate_string($name)

  file { "${conf_dir}/network-server-${name}.conf":
    ensure  => $ensure,
    mode    => '0640',
    owner   => 'root',
    group   => $collectd::params::root_group,
    content => template('collectd/plugin/network/server.conf.erb'),
    notify  => Service['collectd'],
  }
}
4

2 回答 2

1

您能否附上无效的清单片段?

在这里你可以找到 puppet 类型的描述:https ://docs.puppetlabs.com/puppet/latest/reference/lang_datatypes.html ,也关于哈希。

根据文档:

散列被写成用花括号括起来的键/值对;一个键与它的值由一个 => (箭头、粗逗号或散列火箭)分隔,相邻的对由逗号分隔。在最终值和右花括号之间允许使用可选的尾随逗号。

{ key1 => 'val1', key2 => 'val2' }

所以肯定你必须将“(”括号更改为“{”。在键之后应该是“=>”而不是“:”这样的东西应该可以工作:

servers => { '127.0.0.1' =>
  { 'port' => '25826', },
}
于 2014-12-27T12:17:17.107 回答
0

将哈希数据放入 Foreman 智能类参数(或智能变量)时,需要做两件事才能将其正确传递给 Puppet:

  1. 将参数上的数据类型设置为 Hash、JSON 或 YAML
  2. 使用 JSON 或 YAML 来表示数据

第一个将确保 Puppet 得到一个实际的数据散列,而不是一个看起来像散列的字符串(我认为这可能是你得到错误的原因),第二个允许 Foreman 解析你输入的内容。

在 Foreman 中导航到Configure > Puppet classes > collectd::plugin::network > Smart class parameters > servers,然后将Type设置为JSON(或 Hash,或 YAML,如果您愿意)。

接下来,将参数的值(默认值或进一步向下的覆盖)更改为:

{"127.0.0.1":{"port":"25826"}}

这是JSON语法,如果将其与 Puppet 的 DSL 进行比较,您会注意到它使用冒号而不是 => 作为键/值分隔符,并且仅对字符串使用双引号。请注意尾随逗号在 JSON 中无效。

您几乎可以从文档或其他答案中复制示例参数,替换分隔符和引号将其转换为 JSON。

等效的 YAML 格式为:

---
  127.0.0.1: 
    port: "25826"

Foreman 将在“Hash”或“Array”模式下接受,IIRC 默认情况下会以 YAML 格式存储/检索它。

如果 Foreman 在保存参数时出错,可能是由于您输入的数据格式。JSON 和 YAML 都有许多验证和 linting 工具,例如jsonlint.com或 json_verify(yajl 包的一部分),所以首先通过它运行数据。

Foreman 手册中的4.2.6 Smart Matchers部分提供了有关复杂数据类型的更多信息。

如果在此之后仍然从 Puppet 收到错误,请转到 Foreman 中的主机页面,单击 YAML 按钮并复制/粘贴classes:YAML 输出的部分(这是传递给 Puppet 的内容),注意保留空白。

于 2014-12-30T13:35:18.410 回答