我對廚師比較陌生,所以我可能會錯過一些非常基本的東西。經過多次搜索,我沒有找到我需要的東西,所以這裏是:管理廚師角色衝突
在廚師,我有角色是衝突。我需要某種類型的所有服務器都具有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,我希望通過我列出的方式或其他想法達到此目的的最佳方式的
請讓我知道如果我錯過任何關於我們的廚師設置的細節將有所幫助。
免責聲明:上面的例子實際上是我實際試圖實現的一個非常簡化的版本。我甚至沒有使用系統日誌,但它所使用的公司非常關注安全問題,並且不會對他們公開發布的環境的細節感到滿意。如果我遺漏了任何東西,我會盡可能詳細,我需要添加更多信息。
嘿,本,也許我很困惑你的設置,但爲什麼你沒有一個單獨的服務器角色應用於這兩個節點,不會調用syslog_client?如果您將客戶端和服務器角色分開,則可以先指定syslog角色,然後再指定其他必需的配方。我想我不明白你是如何衝突的,除非你想把東西變成一個角色。 – jstim
這正是問題所在。這個角色是應用於所有服務器的「基礎」角色。它配置用戶,服務器上的一些基本環境內容等。通過將syslog_client添加到基本角色,我們能夠確保每個服務器都獲得syslog_client。但我希望能夠告訴syslog_server角色取消syslog_client角色。 – ben
基礎角色中是否還有其他的服務器和客戶端通用的東西?我想我只想爲所有需要的任何東西擔當基本角色,然後再調用服務器或客戶端角色。基本上在base和任何特定於節點的配置之間添加另一個角色級別。對不起,如果我錯過了你正在做出的區別。 – jstim