2015-07-21 38 views
1

我有一個Puppet類,其中包括設置一大堆Debian存儲庫,執行apt-get更新,然後安裝一些包。當if語句存在時定義puppet類的排序

排序必須嚴格如下:

  1. 設置APT源
  2. apt-get的更新
  3. 安裝應用程序包

要定義排序,我已經使用了以下在聲明所有資源後進行鏈接:

File['/etc/apt/apt.conf','/etc/apt/sources.list'] -> 
Exec['apt-get update'] -> 
Class['vim','sudo', ..., ..., ] 

但是,這裏是問題:

如果我只設置主機是虛擬機的vim進行安裝,並且執行Puppet的主機是物理主機,則運行將失敗。我認爲這是因爲它試圖按照我的鏈接運行Class ['vim'],但由於if語句的內容未被解析,無法找到類聲明。

下面是代碼:

if $::is_virtual == 'true' { 
    class {'vim': 
     set_default => true, 
    } 
} 

我可以解決此加入了「需要=>執行[‘apt-get的更新’]」我的VIM資源聲明,並從我的鎖鏈取出,但這感覺有點哈克。這裏是我的類的聲明看起來像一次我這樣做:

if $::is_virtual == 'true' { 
    class {'vim': 
     requires => Exec['apt-get update'], 
     set_default => true, 
    } 
} 

沒有任何人有處理這種順序問題的任何其他方法?無論如何,我可以處理在有條件聲明中可能或不可以通過鏈接觸發的排序類嗎?任何建議表示讚賞。

+1

像這樣編寫依賴關係鏈正是因爲你正在處理的問題。通過require/notify/subscribe來處理依賴關係要安全得多。 –

回答

0

您的方法使用require是合理的。如果你確實必須堅持鏈接操作符,你可以將if塊包裝在另一個類中。

class site::vim { 
    if $::is_virtual == 'true' { ... } 
} 

然後包括和鏈Class[site::vim],這將履行自身的is_virtual值。