2014-12-27 46 views
0

新來的傀儡,試圖讓這個模塊工作,但發現它非常令人沮喪。工頭/ Puppet模塊pdxcat/collectd。散列語法

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 ::插件服務器::網絡 我曾嘗試:

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

和無數其他選項。

有人請讓我知道如何寫一個有效的散列?

清單:

[[email protected] ~]# 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'], 
    } 
} 
+0

你把這個散列放在哪裏?它在Foreman中,在一個智能類參數下,還是在Puppet清單中? –

+0

它會在Foreman的智能類參數 – Werner

回答

0

將散列數據當成爲工頭智能類參數(或智能可變的),你需要做兩件事情把它傳遞給木偶正確:

  1. 設置數據類型在參數哈希,JSON或YAML
  2. 使用JSON或YAML來表示數據

首先將確保木偶被賦予的,而不是看起來像一個哈希(字符串數據的實際哈希值,我認爲這可能是你得到的錯誤的原因),第二個允許工頭解析你輸入的內容。

導航在工頭配置>木偶類> collectd ::插件::網絡>智能類參數>服務器,並設置類型JSON(或散,或YAML,如果你喜歡)。

接下來,更改參數的數值(默認值或者一個覆蓋進一步向下):

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

JSON語法,如果你把它比作木偶的DSL,你會注意到它對鍵/值分隔符使用冒號而不是=>,並且僅對字符串使用雙引號。請注意,尾隨逗號在JSON中無效。

你可以複製the documentation或其他答案的示例參數,用分隔符和引號替換爲JSON。

等效YAML格式是:

--- 
    127.0.0.1: 
    port: "25826" 

工頭將接受當「哈希」或「陣列」模式,IIRC它將存儲/默認檢索它在YAML格式。

如果福爾曼在保存參數時發生錯誤,可能是由於您輸入的數據格式所致。對於JSON和YAML都有很多驗證和刪除工具,例如jsonlint.com或json_verify(yajl包的一部分),所以首先通過它運行數據。

關於在Foreman手冊4.2.6 Smart Matchers中複雜數據類型的更多信息。

如果在此之後你仍然從Puppet得到一個錯誤,請進入Foreman主頁,點擊YAML按鈕並複製/粘貼YAML輸出的classes:部分(這是傳遞給Puppet的部分),小心保留空白。

+0

非常感謝你,非常詳細和全面的答案,併爲未來的鬥爭提供了一些工具!我會爲鏈接添加書籤,正則表達式的類似頁面在過去幫助過我。 – Werner

1

能否請您附上不工作清單的片段?

在這裏你可以找到木偶類型的描述:https://docs.puppetlabs.com/puppet/latest/reference/lang_datatypes.html,還有關於散列。

根據文檔:

散列被寫成用大括號包圍的鍵/值對;一個鍵與它的值相隔a =>(箭頭,胖逗號或散列火箭),並且相鄰的對之間用逗號分隔。最終值和大括號之間允許有一個可選的尾部逗號。

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

所以肯定你必須改變「(」括號「{」之後還重點應該是「=>」不「:」 像這樣的東西應該工作:

servers => { '127.0.0.1' => 
    { 'port' => '25826', }, 
} 
+0

下。簡而言之,在Ruby中將它們編寫爲Ruby哈希或常量哈希引用。 –

+0

雖然我曾嘗試過,但我想也許Foreman的語法不同? – Werner