2012-09-28 91 views
3

我對廚師比較陌生,所以我可能會錯過一些非常基本的東西。經過多次搜索,我沒有找到我需要的東西,所以這裏是:管理廚師角色衝突

在廚師,我有角色是衝突。我需要某種類型的所有服務器都具有roleA,但具有roleB的服務器除外。

我能想到的形容,那就是用一個例子,最好的辦法:

syslog1,syslog2

WEB1,web2上,WEB3

DB1,DB2

MAIL1,mail2

此環境中的每個服務器(幾十臺)都有一個名爲syslog_client的角色,除了需要具有syslog_server角色的syslog1和syslog2之外。

syslog-server和syslog-client角色衝突,因爲它們配置相同的軟件不同。

這些是角色而不是食譜,因爲它們實際上包含了幾個食譜。

我覺得做這樣的:

角色/ base.rb:

name "base" 
description "base configuration" 
override_attributes(
) 
default_attributes(
) 
run_list(
    "recipe[one]", 
    "recipe[two]", 
    "recipe[three]", 
    "role[uno]" 
) 

unless node[:roles].include?('syslog_server') 
    run_list('role[syslog_client]') 
end 

問題存在的節點對象並不在這一點上存在。我曾考慮將其轉化爲食譜,但我無法想出一個在那裏做的好方法。我能夠在基礎配方使用此:

unless node[:roles].include?('syslog_server') 
    node[:roles]+=['syslog_client'] 
end 

的角色屬性,這增加syslog_client(不)正確,但它永遠不會實際運行syslog_client作用。

我曾考慮將syslog_client移動到獨立的配方而不是角色,並將角色屬性移動到環境中。這將工作,因爲那時我可以撥打include_recipe "syslog::client"。問題在於,我們幾乎所有的食譜都是從角色(而不是其他食譜)中分配出來的,我擔心做出這樣的改變會創造一個難以追蹤的一次性過程。除此之外,正如我已經提到的,這些實際上是幾種食譜,所以將它們作爲單一配方添加並不理想。

我在當前工作的環境中有許多不同的服務器類型/角色,並且向它們添加角色[syslog_client]是可行的,但並不理想。由於多人在此工作,似乎有人會忘記將配方添加到新角色中。

在理想的世界中,像我的第一個解決方案是可能的,因爲這可以讓我們保持儘可能一致的環境。不過,我願意接受其他選擇。

所以包裹起來,我想我需要的是有人來告訴我如何:

  1. 使第一個解決方案的工作。僅當其他角色不存在時纔將角色添加到運行列表中
  2. 如果我不能擁有#1,我希望通過我列出的方式或其他想法達到此目的的最佳方式的

請讓我知道如果我錯過任何關於我們的廚師設置的細節將有所幫助。

免責聲明:上面的例子實際上是我實際試圖實現的一個非常簡化的版本。我甚至沒有使用系統日誌,但它所使用的公司非常關注安全問題,並且不會對他們公開發布的環境的細節感到滿意。如果我遺漏了任何東西,我會盡可能詳細,我需要添加更多信息。

+1

嘿,本,也許我很困惑你的設置,但爲什麼你沒有一個單獨的服務器角色應用於這兩個節點,不會調用syslog_client?如果您將客戶端和服務器角色分開,則可以先指定syslog角色,然後再指定其他必需的配方。我想我不明白你是如何衝突的,除非你想把東西變成一個角色。 – jstim

+0

這正是問題所在。這個角色是應用於所有服務器的「基礎」角色。它配置用戶,服務器上的一些基本環境內容等。通過將syslog_client添加到基本角色,我們能夠確保每個服務器都獲得syslog_client。但我希望能夠告訴syslog_server角色取消syslog_client角色。 – ben

+1

基礎角色中是否還有其他的服務器和客戶端通用的東西?我想我只想爲所有需要的任何東西擔當基本角色,然後再調用服務器或客戶端角色。基本上在base和任何特定於節點的配置之間添加另一個角色級別。對不起,如果我錯過了你正在做出的區別。 – jstim

回答

1

擴展上面說的是什麼與創建兩個角色的問題。客戶端和服務器

客戶端角色包括基本角色和客戶端功能。它將應用於所有服務器,通過在所有其他角色中用此角色替換對「base」的引用。意味着這些角色仍然可以獲得基礎,但也可以獲得客戶。

服務器是一個獨立的角色,它只適用於那些服務器,並具有基礎和服務器角色?

通過這種方式,客戶端和服務器都可以將基礎角色應用到它們,而無需重複定義基礎角色的定義。您仍然可以根據需要管理該基本角色,但是在創建角色時使用聚合?

創建新角色時,用戶不會從添加基地開始,而是添加syslog_client角色,這也會爲他們提供基礎。

對我來說,這感覺就像廚師推動你創造角色的方式。我們擁有的1個角色適用於所有服務器,其中一些適用於1個服務器子類,但不是其他角色。這樣我們的葉子角色就像被應用的葉子角色實際上由4或5個其他角色組成。常見的建模方式可以在不需要內部邏輯的情況下進行共享?

另一個選擇是將客戶端配方添加到每個節點,第一步是檢查節點角色,如果它說服務器基本上跳過配方執行?這與您想要用來添加配方的邏輯是一樣的,但它會存在於配方中並控制執行?

unless node[:roles].include?('syslog_server') 
    #Do your client install 
end 
+0

這實際上是我做的: '除非節點[:roles] .include?('syslog_server')' 我對這個解決方案不滿意,它已經導致了混淆,但我必須從這個問題,這是我在分配的時間內能做的最好的。我已經接受了你的回答,因爲我從來沒有回過來親自發帖。感謝您的建議 – ben