2014-10-20 101 views
0

是否有辦法縮短以下YAML以便不重複相同的資源?有沒有辦法縮短這個YAML?

--- 
    classes: 
    - roles::storage::nfs 
    samba::config::includeconf: 
    - alpha 
    - beta 
    - charlie 
    - delta 
    - echo 
    - foxtrot 
    smb_shares: 
    alpha: 
     name: alpha 
    beta: 
     name: beta 
    charlie: 
     name: charlie 
    delta: 
     name: delta 
    echo: 
     name: echo 
     path: /path/to/file 
    foxtrot: 
     name: foxtrot 

如果有一種方法可以減少任何重複,那就太好了。理想情況下,每個資源名稱只會出現一次。

回答

0

是的,你可以大大減少這兩個優化,其中一個使對方的大部分效果無效。但是你必須你的程序中簡單的序列和映射讀書改變,創建更加智能對象(我稱之爲ShareIncludeSharesShare):

--- 
    classes: 
    - roles::storage::nfs 
    samba::config::includeconf: !ShareInclude 
    - alpha 
    - beta 
    - charlie 
    - delta 
    - echo 
    - foxtrot 
    smb_shares: !Shares 
    echo: !Share 
     path: /path/to/file 

當創建ShareInclude,你應該爲每個序列元素的Share初始名稱與標量值相同,並將其插入到某個全局列表中。

以上處理大部分共享對象,除info外。當

echo: !Share 
    path: /path/to/file 

被處理的臨時匿名Sharepath組作爲一個屬性或其他可回收值被創建(如果該名稱將是不同的,可以被存儲以及)。然後,一旦Shares創建它會知道份額(從映射的關鍵echo)查找的名稱,並採取兩種操作之一:

  1. 如果名字能擡頭,更新Share對象與來自匿名的信息Share
  2. 如果找不到名稱,請通過提供鍵值作爲其名稱來提升匿名共享,然後將其存儲。

這種方式,你必須指定echo兩次,否則就沒有辦法明確path與處理ShareInclude時創建的具體Share對象相關聯。如果這仍然太多,你可以從其他的方式接近它,離開ShareInclude空,隱含使與Shares打交道時,這些條目:

--- 
    classes: 
    - roles::storage::nfs 
    samba::config::includeconf: !ShareInclude 
    smb_shares: !Shares 
    alpha: 
    beta: 
    charlie: 
    delta: 
    echo: 
     path: /path/to/file 
    foxtrot: 

雖然這是有點短,這取決於你的YAML解析器,你可能不在創建Share對象時更長時間有保證的順序。如果你不得不將Shares變成一系列鍵值對,縮短優勢就沒有了。