2017-10-12 155 views
0

我申請一個本地清單來測試execfile資源:木偶文件資源運行,除非

class test_file { 
    exec { "touch /tmp/testfile": 
    path => ["/bin", "/usr/bin", "/sbin", "/usr/sbin"], 
    unless => "test -d /tmp 2>/dev/null", 
    } 

    file { "/tmp/success": 
    mode => "0777", 
    owner => "root", 
    group => "staff", 
    source => "file:///Users/Shared/success", 
    require => Exec["touch /tmp/testfile"], 
    } 
} 

我期待發生的事情:exec運行和退出,因爲unless聲明返回0,所以文件資源從不運行,並且/tmp中都沒有創建文件。

到底發生了什麼:file資源始終運行,並複製「成功」文件/tmp

我在MacOS 10.11和10.12既木偶劑4.10和5.3.2運行此。 ..與結果相同。我只是試圖運行一個條件,說不要複製文件,如果某些命令退出成功。任何見解或方向將不勝感激。

回答

1

你誤會了Puppet的工作方式。 。

require metaparameter聲明中哪些資源應該被應用的順序*鑑於您的清單,木偶只承諾了Exec的資源 - 如果在所有應用 - 將永遠文件資源之前應用。

還有另一個metaparameter,subscribe。如果資源訂閱到其他資源,則Puppet會嘗試「刷新」該資源,如果它訂閱的資源更改狀態。

不幸的是,你不能在這裏使用它,因爲文件資源忽略了「刷新事件」。

你能做什麼,雖然這是一個有點難看,就是:

class test_file() { 
    Exec { 
    path => ["/bin", "/usr/bin", "/sbin", "/usr/sbin"], 
    } 

    exec { "touch /tmp/testfile": 
    unless => "test -d /tmp 2>/dev/null", 
    } 

    exec { "cp /Users/Shared/success /tmp/success": 
    subscribe => Exec["touch /tmp/testfile"], 
    refreshonly => true, 
    } 
} 

*的要求metaparameter還可以防止第二資源從根本上,如果第一資源逾期不申請被應用。請參閱文檔中的failed dependencies部分。

+0

雖然他只是爲了訓練而這樣做,所以我不知道他是否真的想在真實的環境中做這種設計的場景。在那種情況下,他可能會有一個'file'做第一個動作,一個'exec'做第二個動作。 –

+0

這不太對。對'Exec'具有'require'需求的'File'不僅建立了應用程序的順序,而且如果試圖應用'Exec'被創建並失敗,它也阻止了'File'的應用。但是,'Exec'失敗當然不同於它沒有被同步化(在這種情況下,通過它的'unless'命令確定)。 –

+0

我加了一個關於這個的腳註。 –