2017-03-27 36 views
0

我正嘗試通過Puppet(使用Hiera)創建一個文件和一個符號鏈接。我在Ubuntu 16.04上運行,並且使用了所有最新的模塊。 該文件被稱爲「a」,該鏈接被稱爲「b」。這些文件不直接相關。Puppet錯誤:您不能指定多個內容,源,目標

我對節點的init.pp文件:

define hiera::files (
    $ensure, 
    $content= "", 
    $target="/./.", 
    $mode = "", 
    $owner = "root", 
    $force = "false") { 

    file { $title: 
    ensure => $ensure, 
    owner => $owner, 
    force => $force, 
    content => $content, 
    mode => $mode, 
    target => $target, 
    } 
} 

create_resources('hiera::files', hiera_hash('files', {})) 

node "default" { 
    hiera_include('classes') 
} 

還有包含相應數據的node.yaml文件:

files: 
    /etc/a.txt: 
    ensure: "present" 
    mode: "2770" 
    owner: "simon" 
    content: "[d] \n type = sss \n resource = samba_1" 

/etc/b: 
    ensure: "link" 
    target: "/usr/share/b" 
    mode: "777" 

我曾嘗試其他變化,但我總是得到一個錯誤,我不能指定多於一個的contentsource,target。可以兼得嗎?不是針對同一個文件,而是針對單獨的文件,例如我正在嘗試執行的操作?

+1

請注意,您的Hiera數據似乎格式不正確。我懷疑這是在你準備好問題時發生的,而不是真實的數據,但由於我不能確定,所以我沒有采取任何修正。 –

+1

還要注意,通常情況不佳的形式是在頂部範圍聲明資源,包括通過'create_resources()'或其他函數間接地進行聲明。我強烈建議將這些聲明放入類或節點塊中。 –

+0

感謝您的建議 – quant

回答

1

hiera::files默認是這裏的問題,因爲即使你不是在你的Hiera哈希指定contenttarget,他們是被設置:

define hiera::files ($ensure, $content= "", $target="/./.", $mode = "", $owner = "root", $force = "false"){ 

更改$content$target默認undef所以如果你打算使用它們,它們必須被指定。

define hiera::files ($ensure, $content = undef, $target = undef, $mode = "", $owner = "root", $force = "false"){ 

如果你真的需要這些默認值,那麼你就需要一種方法來避免與target,例如在文件/符號鏈接設置target與內容的文件,並content

define hiera::files ($ensure, $content = undef, $target = undef, $mode = "", $owner = "root", $force = "false"){ 
    # Provide a default empty content value when ensure => present, and no content is given 
    $real_content = $ensure ? { 
    "present" => $content ? { 
     undef => "", 
     default => $content, 
    }, 
    default => undef, 
    } 

    # Provide a default /./. target value when ensure => link, and no target is given 
    $real_target = $ensure ? { 
    "link" => $target ? { 
     undef => "/./.", 
     default => $target, 
    }, 
    default => undef, 
    } 

    file { $title: 
    ensure => $ensure, 
    owner => $owner, 
    force => $force, 
    content => $real_content, 
    mode => $mode, 
    target => $real_target, 
    } 
} 

或者最好使用單獨的定義來使行爲清晰。

相關問題