[英]Puppet exec with command mkdir -p does not fail but does not create folder
我在Ubuntu 14.04機器上運行此簡單的木偶代碼,以根據逗號分隔的路徑列表創建文件夾:
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
顯示沒有這樣的文件夾。
還有一些值得注意的事實:
請在這里提出問題的建議,或者-如果還有其他方法可以使用Puppet創建任意數量的任意深度的文件夾結構-我很樂意將exec
命令替換為任何等效命令。 我沒有使用puppet的file
資源,因為它無法自動創建必要的父目錄(請參閱此處 )
編輯 :我對一種方式特別感興趣,該方式將使我免於將每個文件夾的任何編碼作為從根開始遵循層次結構的文件夾數組(例如['/data', '/data/disk1', '/data/disk1/user1']
)。
不要使用exec,而要使用人偶文件資源。 首先,創建要創建的目錄的數組,然后將該數組用作文件資源標題。
$folders = [ '/example', '/example/folder2', '/example/folder2/folder3' ]
file { "$folders" :
ensure => directory,
owner => 'root',
group => 'root',
mode => '0777',
}
您對$name
變量的值有錯誤的期望。 您假設在資源聲明中使用它時...
exec { $folders: command => "mkdir -p ${name} && chmod 0777 ${name}" }
...它代表要聲明的資源的名稱。 不是這種情況。 這意味着該聲明內部與外部的含義相同:聲明在其中進行評估的已定義類型的實例的名稱/標題( local_dirs
實例,其名稱顯然是'create-dirs'
)。 因此, mkdir
會在Puppet的工作目錄中創建該目錄的目錄。
您可以通過插入另一級定義的類型來包裝Exec
來解決此問題。 但是,如果您願意啟用將來的解析器,那么前瞻性的方向是使用新的each()
函數而不是數組標題來聲明您的多個Exec
資源。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.