2014-07-22 94 views
3

我是廚師新手,我正致力於爲不同環境輸出不同文件的環境。例如,我想爲分段或生產環境加載不同的robots.txt和.htaccess文件。廚師 - 針對不同環境的不同文件

我從網站上找到了下面的代碼,但我不確定如何完成我想要做的事情。這可以在.erb文件中完成,還是必須存在於.rb文件中?

if node.chef_environment == 'development' do 
# 
# do not configure basic auth 
# 
else 
# 
# configure basic auth 
# 
end 

此外,我將如何能夠動態更改文件中的內容,而不必創建一個完全獨立的文件。例如,我想要根據環境更改js文件中的鏈接。這可以通過一個變量來完成嗎?

+0

如果你真的只是想要更改文件的一小部分,最好用'.erb'文件完成。正如我在答覆中提到的,這可能非常混亂。我認爲將您的項目代碼(如html,js,服務器腳本文件)放在Chef本身中是個不錯的主意;我更喜歡使用源代碼控制系統(比如git或svn)。 –

+0

我感謝您給我的所有幫助,感謝您指引我朝着正確的方向發展。 – gsteigerwald

+0

順便說一下,我使用git進行源代碼控制,但需要有js,php等的一些部分。文件在創建哪個環境時是動態的 – gsteigerwald

回答

2

可能做到這一點,但我會做一個.rb文件。如果你有一個.htaccess.erb文件,它會混雜在一起,所有你不同的環境代碼非常擁擠 - 更難讀/診斷。

我發現有一本專門用於環境設置的烹飪書,讓它的食譜檢測環境並從食譜內的不同位置抓取所有配置文件,這會更清晰。您將爲此使用cookbook_file,remote_directoryremote_file資源。

這是檢測平臺的cookbook_file資源的一個體面的例子。您應該能夠調整它以檢測文件的環境和來源位置,而不是目標路徑。

cookbook_file "application.pm" do 
    path case node['platform'] 
    when "centos","redhat" 
     "/usr/lib/version/1.2.3/dir/application.pm" 
    when "arch" 
     "/usr/share/version/core_version/dir/application.pm" 
    else 
     "/etc/version/dir/application.pm" 
    end 
    source "application-#{node['languages']['perl']['version']}.pm" 
    owner "root" 
    group "root" 
    mode "0644" 
end 

像這樣的事情可能會爲你工作得很好:

cookbook_file ".htaccess" do 
    path "/var/www/" 
    source "apache/#{node['chef_environment'].htaccess" 
    owner "apache" 
    group "apache" 
    mode "0400" 
end 

應該(我生鏽和在一段時間沒有Chef'ed)創建一個名爲.htaccess從複製的文件/<cookbook_directory>/files/apache/development.htaccess在開發環境中的節點上,並從/<cookbook_directory>/files/apache/production.htaccess複製到生產環境中的節點上。因此,每個文件都明確命名並且沒有任何邏輯 - 不太可能犯任何錯誤。

+0

我認爲OP在詢問關於不同平臺(Dev,QA,Production)的不同平臺(Debian,RHEL) –

+1

@charlesbabbage表示同意。第一個代碼塊是鏈接中的複製/粘貼示例。第二個代碼塊正適應它來使用環境而不是平臺。 –

+0

太棒了,非常感謝。至於robots.txt文件,像這樣的工作,以及?我不知道我是否可以從.rb文件創建它,因爲它是一種不同的文件格式。 – gsteigerwald

0

您可以使用模板來爲您的特定環境使用正確的參數進行配置和其他文件。例如,這是我創建的/ etc/sysconfig/network中的腳本/用於ifcfg- *文件模板:

# 
# /etc/sysconfig/network-scripts/ifcfg-<%= @interface %> 
# 
# Generated by Chef for <%= node['hostname'] %> 
# 
<%= @interface %> 
BOOTPROTO=static 
ONBOOT=yes 
NM_CONTROLLED=no 
<%= @hwaddr %> 
<%= @ipaddress %> 
<%= @netmask %> 
<%= @broadcast %> 
<%= @master %> 
<%= @slave %> 

這裏是我的食譜代碼來填充變量。配方有沒有關於實際值的想法,只是對基礎設施的設置,即有環境,有一個特定的環境中不同的子網:

getMac = {} 

# Get "physical" interfaces 
node['network']['interfaces'].keys.sort.each do |iface| 
    if node['network']['interfaces'][iface]['encapsulation'] == 'Ethernet' and 
     node['network']['interfaces'][iface]['type'] != 'bond' 
     node['network']['interfaces'][iface]['addresses'].keys.each do |address| 
      if node['network']['interfaces'][iface]['addresses'][address]['family'] == 'lladdr' 
       getMac[iface]=address 
      end 
     end 
    end 
end 
ip = node['network']['address'][node['hostname']] 
env = 'dot' + ip.split('.')[2] 
netmask = "NETMASK=" + node['network'][env]['netmask'] 
broadcast = "BROADCAST=" + node['network'][env]['broadcast'] 

node['network']['interfaces'].keys.sort.each do |iface| 
    if node['network']['interfaces'][iface]['encapsulation'] == 'Ethernet' and 
     node['network']['interfaces'][iface]['type'] != 'bond' 
     # find the non-primary interface, which is not one of eth0, em1, or eno1[0-9]* 
     # Otherwise, leave IP/netmask/broadcast as assigned above 
     if !iface.match(/ens16|eno1|eth0|em1/) 
      ipaddress = '' 
      netmask = '' 
      broadcast = '' 
     else 
      ipaddress = "IPADDR=" + ip 
     end 
     template "/etc/sysconfig/network-scripts/ifcfg-#{iface}" do 
      source "ifcfg-iface.erb" 
      mode 0644 
      owner "root" 
      group "root" 
      variables({ 
       :interface => "DEVICE=#{iface}", 
       :ipaddress => ipaddress, 
       :netmask => netmask, 
       :broadcast => broadcast, 
       :hwaddr => "HWADDR=#{getMac['iface']}", 
      }) 
     end 
    end 
end 

這裏的環境文件:

override_attributes ({ 
    'network' => { 
     # one environment can use multiple subnets 
     'dotX' => { 
      'broadcast' => "a.b.X.255", 
      'gateway' => "a.b.X.1", 
      'netmask' => "255.255.255.0", 
     }, 
     # all nodes for this environment 
     'address' => { 
      'hostname' => "a.b.X.d", 
     }, 
    }, 
})