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::p lugin::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'],
}
}
您能否附上不起作用的清单片段?
在这里你可以找到木偶类型的描述:https://docs.puppetlabs.com/puppet/latest/reference/lang_datatypes.html,也是关于哈希的。
根据文档:
哈希被写为用大括号括起来的键/值对;键与其值用 =>(箭头、胖逗号或哈希火箭)分隔,相邻的对用逗号分隔。在最终值和右大括号之间允许使用可选的尾随逗号。
{ key1 => 'val1', key2 => 'val2' }
所以你肯定必须把"("括号改成"{"。同样在键之后应该是"=>"而不是":"这样的事情应该可以工作:
servers => { '127.0.0.1' =>
{ 'port' => '25826', },
}
将哈希数据放入 Foreman 智能类参数(或智能变量)时,您需要做两件事才能将其正确传递给 Puppet:
- 将参数的数据类型设置为哈希、JSON 或 YAML
- 使用 JSON 或 YAML 表示数据
第一个将确保Puppet被赋予一个实际的数据哈希,而不是一个看起来像哈希的字符串(我认为这可能是你得到的错误的原因),第二个允许Foreman解析你输入的内容。
在 Foreman 中导航以配置> Puppet 类>收集::p lugin::network> 智能类参数>服务器,并将类型设置为 JSON(或哈希或 YAML,如果您愿意)。
接下来,将参数的值(默认值或进一步向下的覆盖)更改为:
{"127.0.0.1":{"port":"25826"}}
这是JSON语法,如果你将其与Puppet的DSL进行比较,你会注意到它使用冒号而不是=>作为键/值分隔符,并且只对字符串使用双引号。 请注意,尾随逗号在 JSON 中无效。
几乎您可以从文档或其他答案中复制示例参数,替换分隔符和引号以将其转换为 JSON。
等效的 YAML 格式为:
---
127.0.0.1:
port: "25826"
Foreman 将在"哈希"或"数组"模式下接受,IIRC 默认情况下将以 YAML 格式存储/检索它。
如果 Foreman 在保存参数时出现错误,则可能是由于您输入的数据格式造成的。 JSON和YAML有许多验证和检查工具,例如 jsonlint.com 或json_verify(yajl包的一部分),因此请先通过它运行数据。
有关复杂数据类型的更多信息,请参见 Foreman 手册的第 4.2.6 节智能匹配器。
如果在此之后仍然收到来自 Puppet 的错误,请转到 Foreman 中的主机页面,单击 YAML 按钮并复制/粘贴 YAML 输出的classes:
部分(这是传递给 Puppet 的部分),注意保留空格。