2016-02-27 40 views
0

我的Ubuntu上運行這個簡單的木偶代碼14.04機器,按照以逗號分隔的路徑列表創建文件夾:木偶Exec用命令的mkdir -p不會失敗,但不創建文件夾

define local_dirs ($comma_separated_dirs) { 
    $folders = split($comma_separated_dirs, ',') 

    exec { $folders: 
     command => "mkdir -p ${name} && chmod 0777 ${name}" 
    } 
} 

這個資源就是用來定義如下(在這種情況下 - 只是一個單一的文件夾,沒有逗號,其他模塊確實需要這種「分裂」的邏輯):

local_dirs { 'create-dir': 
    comma_separated_dirs => "/data/disk1" 
} 

當我運行它,我看到下面的日誌行,表明exec命令實際執行:

Notice: /Stage[main]/My_module/Local_dirs[create-dir]/Exec[/data/disk1]/returns: executed successfully 

但是,該文件夾從未創建,運行ls -la /data顯示沒有這樣的文件夾。

一些更多的事實值得注意:

  • 木偶以root身份運行,所以它不是有可能是權限問題
  • 木偶版本3.7.2

請告知可能是什麼問題在這裏,或者 - 如果還有其他方法可以使用Puppet創建任意數量的任意深度的文件夾結構 - 我很樂意用任何等同的東西替換exec命令。我使用的不是傀儡的file資源,由於它是無法自動創建所需的父目錄(見here

編輯:我在會饒了我的每個文件夾的任何編碼作爲一種方法特別感興趣從根目錄開始的層次結構文件夾數組(例如['/data', '/data/disk1', '/data/disk1/user1'])。

+0

爲什麼downvote? –

回答

3

你必須爲$name變量的值的錯誤預期。我們假定你是,當你在資源聲明中使用它...

exec { $folders: 
    command => "mkdir -p ${name} && chmod 0777 ${name}" 
} 

...它代表的資源的名稱被宣佈。不是這種情況。它意味着該聲明中的內容與外部相同:聲明被評估的已定義類型的實例的名稱/標題(local_dirs實例,其名稱顯然爲'create-dirs')。因此,mkdir因此在任何Puppet的工作目錄中都會創建該名稱的目錄。

您可以通過插入另一級定義類型來包裝您的Exec來解決問題。但是,如果您願意啓用未來的解析器,那麼前瞻性方向將是使用新的each()函數而不是陣列標題聲明您的多個Exec資源。

3

而不是使用exec,使用木偶文件資源。首先創建一個你想創建的目錄數組,然後使用該數組作爲文件資源標題。

$folders = [ '/example', '/example/folder2', '/example/folder2/folder3' ] 

file { "$folders" : 
    ensure => directory, 
    owner => 'root', 
    group => 'root', 
    mode => '0777', 
} 
+0

也許我應該改寫這個問題來使這個更清晰 - 我知道我可以使用'file'並列出路徑中的目錄來完成這個工作,但這正是我想要阻止的,因爲我有很多模塊使用這個'local_dirs'定義的資源,可能需要創建多個文件夾,並且每個文件夾都有相當深的層次結構,因此這些列表將很長並且容易出錯。我正在尋找一種方法來使用'local_dirs'資源從各種模塊中隱藏這些細節。 –

+0

您可以將$文件夾的數組值放入hiera中,然後在需要目錄樹時執行hiera查找。 – Flannon