2013-12-09 55 views
11

我正在嘗試使用Chef來管理新的虛擬機。我正在使用專門的廚師服務器,並從單獨的工作站虛擬機執行所有這些工作。設置獨特廚師節點屬性的最佳實踐

我現在正在做的方式是克隆一個基本的虛擬機映像,然後使用刀引導來安裝廚師,並使虛擬機處於一致的狀態。

我可以指定vm的環境或運行列表;我可以覆蓋我的環境中的某些設置,例如我在測試環境的「overrides」塊中設置了chef-client間隔,以便在測試時每60秒運行一次客戶端,所以我不必每次都手動運行chef-client。

舉例來說,我的工作流程是這樣的:

  • 克隆VM模板並啓動VM

  • 手動設置主機名(更新/ etc /主機名和/ etc/hosts文件),並重新啓動

  • 引導與初始配方節點

    knife bootstrap chef-test1 -r 'recipe[ntp],recipe[chef-client]'

  • 編輯節點,以反映新的環境

我有是設置每個節點的屬性問題。我想使用hostname cookbook來設置節點的主機名,如果我將它設置在一個角色中,那麼每個服務器都必須創建一個新角色。但是,當我試圖引導和包括這個角色時,我得到一個錯誤:

chef-test1 * log[Please set the set_fqdn attribute to desired hostname] action write[2013-12-09T16:26:56-07:00] WARN: Please set the set_fqdn attribute to desired hostname 

當我引導,而不在於配方,並嘗試編輯節點並設置「set_fqdn」屬性,我無法保存屬性,例如此JSON:

{ 
    "name": "chef-test1", 
    "set_fqdn": "chef-test1.local.fqdn", 
    "chef_environment": "test-dev1", 
    "normal": { 
    "tags": [ 

    ] 
    }, 
    "run_list": [ 
    "recipe[ntp]", 
    "recipe[chef-client]", 
    "recipe[hostname]" 
    ] 
} 

,當我離開了我的編輯器,刀告訴我:

Node not updated, skipping node save 

我試圖編輯廚師GUI這個屬性和屬性將不保存。

我發現this guy誰在/etc/chef/chef.json中創建了json,基本上做了我所期望的,但我不確定/etc/chef/chef.json如何發揮作用(更新它對於每個新節點?我不使用廚師獨奏,所以也許這就是我的困惑所在)。

根據this email thread無法用knife node edit覆蓋默認屬性,但「set_fqdn」不是默認值。我想,以避免創建每個節點的作用,我想我可以使用主機名菜譜,以緩解需要手動設置主機名,是這樣的:

knife bootstrap saucy64 -r 'recipe[ntp],recipe[chef-client],recipe[hostname]' --json '"{ set_fqdn": "chef-test1.local.tld", "chef_client": { "interval": "600" }'

knife bootstrap fedora19 -r 'recipe[ntp],recipe[chef-client],recipe[hostname]' --json '"{ set_fqdn": "chef-test2.local.tld", "chef_client": { "interval": "60" }'

我很欣賞的幫助。

+0

我在使用ec2實例的主廚設置主機名的同樣困難。請幫助 – user3086014

回答

6

我看到了一些問題:

  • 期間knife node edit,你不能設置屬性作爲頂級屬性旁邊的FQDN等等。你必須把它放在下面normal。這是defaultoverride之間的等級。見Attribute Precedence
  • 使用knife node edit的氣味。我寧願不這樣做(對於主機名可能沒問題,但對於其他任何情況,都不可能跟蹤版本控制中的這些更改)。嘗試讓hostname cookbook運行。
  • 將屬性寫出去chef.json文件應該是恕我直言,也避免了。你的邏輯應該在你的食譜內
  • 你應該有一個base角色/食譜或類似的,包括每個節點有(如ntpchef-client,也是主機名)的微不足道的東西。
  • 您可以在bootstrapping直接設置環境也:-E myenv(但,是的,我想知道這是爲什麼不記錄)
  • 可以引導過程中設置的節點名,太:-N NAME--node-name NAME
+0

感謝您的反饋。 - 所以它似乎li – user1106405

+0

感謝您的反饋。 (在評論中沒有新的行,所以我對你的不錯列表中的文字混亂表示歉意)。 - 所以看起來最簡單的是爲每個新的虛擬機創建一個角色,我可以在覆蓋區域設置「set_fqdn」;在我腦海中的另一個想法是自動生成名稱的方式,但我認爲這是一條路。 - 好。我真的只是試圖讓食譜工作,但我想我明白這可能會長期不穩定。 - 我怎麼做到這一點?也許一個「基礎」的食譜,抓住數據庫的主機名? – user1106405

+0

- 好吧,好主意。謝謝。 - 它實際上是在'knife help bootstrap'或'knife boostrap --help'下記錄下來的,謝謝指出,儘管如此,這可以緩解引導後編輯它的需要。 - 設置節點名稱只會爲主廚設置它,但不會更改節點的主機名稱。 – user1106405

0

這工作:

knife bootstrap 192.168.15.43 -r 'recipe[hostname],recipe[ntp],recipe[chef-client]' -j '{"set_fqdn": "chef-test2"}' 

(也發現閱讀knife help bootstrap幫助)

This stackoverflow answer使用類似的語法。

編輯:好吧,幾乎這會創建兩個節點條目。需要與-n參數指定節點名稱:

knife bootstrap 192.168.15.43 -r 'recipe[hostname],recipe[ntp],recipe[chef-client]' -j '{"set_fqdn": "chef-test2"}' -N chef-test2 

knife bootstrap 192.168.15.43 --run-list 'recipe[hostname],recipe[ntp],recipe[chef-client]' --json-attributes '{"set_fqdn": "chef-test2"}' --node-name chef-test2 
+0

也請使用-E標誌而不是使用_default指定環境 – user1106405

2

怎麼樣,其基於定義的node.name當你引導節點的主機名的處方,我wrote one這是原來的廚師叉子-hostname食譜。