2014-05-08 187 views
2

我使用chef-cookbook-hostname cookbook來設置節點的主機名。我不希望我的主機名在屬性文件中被硬編碼(默認['set_fqdn'])。在廚師食譜中使用變量

而是從VM定義XML文件中讀取主機名。我想出了以下默認配方,但顯然變量fqdn沒有給定值。有什麼想法爲什麼會發生這種情況,或者更好地完成我的任務?

ruby_block "Find-VM-Hostname" do 
    block do 
    require 'rexml/document' 
    require 'net/http' 
    url = 'http://chef-workstation/services.xml' 
    file = Net::HTTP.get_response(URI.parse(url)).body 
    doc = REXML::Document.new(file) 
    REXML::XPath.each(doc, "service_parameters/parameter") do |element| 
    if element.attributes["name"].include?"Hostname" 
     fqdn = element.attributes["value"] #this statement does not give value to fqdn 
    end 
    end 
    end 
    action :nothing 
end 
if fqdn 
    fqdn = fqdn.sub('*', node.name) 
    fqdn =~ /^([^.]+)/ 
    hostname = Regexp.last_match[1] 

    case node['platform'] 
    when 'freebsd' 
    directory '/etc/rc.conf.d' do 
     mode '0755' 
    end 

    file '/etc/rc.conf.d/hostname' do 
     content "hostname=#{fqdn}\n" 
     mode '0644' 
     notifies :reload, 'ohai[reload]' 
    end 
    else 
    file '/etc/hostname' do 
     content "#{hostname}\n" 
     mode '0644' 
     notifies :reload, 'ohai[reload]', :immediately 
    end 
    end 

回答

9

這裏的問題的根源是,你設置ruby_block的範圍內FQDN變量,並試圖在編譯階段要參考變量。 ruby_block資源允許在收斂階段運行ruby代碼。

鑑於您似乎在使用fqdn來設置資源集,它看起來好像您可以從ruby代碼周圍刪除ruby塊。例如

fqdn = // logic to get fqdn 

file '/tmp/file' do 
    content "fqdn=#{fqdn}" 
end 
+1

它解決了這個問題,效果很好!感謝您及時的回覆。 – user3617894

+7

然後,您應該將答案標記爲正確。 – StephenKing

6

我在廚師文檔中發現了這個。我遇到了類似的問題。我要去嘗試node.run_state。此信息位於此頁面的底部https://docs.chef.io/recipes.html

使用node.run_state在廚師 - 客戶端運行期間存儲瞬態數據。這些數據可以在資源之間傳遞,然後在執行階段進行評估。 run_state是一個空的哈希,總是在主廚客戶端運行結束時丟棄。

例如,下面的處方將安裝Apache Web服務器,隨機選擇PHP或Perl作爲腳本語言,然後再安裝腳本語言:

package "httpd" do 
    action :install 
end 

ruby_block "randomly_choose_language" do 
    block do 
    if Random.rand > 0.5 
     node.run_state['scripting_language'] = 'php' 
    else 
     node.run_state['scripting_language'] = 'perl' 
    end 
    end 
end 

package "scripting_language" do 
    package_name lazy { node.run_state['scripting_language'] } 
    action :install 
end 
+0

我試過類似的東西(在run_state中指定一個變量並在模板中檢索它),並且node.run_state命令總是在程序包調用中返回一個空值,所以這看起來並不普遍。 –

0

請點擊此鏈接 http://lists.opscode.com/sympa/arc/chef/2015-03/msg00266.html 你可以使用node.run_state [:variables]來解析一個變量到另一個配方

這是我的代碼:: file.rb

node.run_state [:script_1] = 「foo」 的 include_recipe '規定::複製'

和其他copy.rb文件把下面的代碼::

copy.rb

文件名= node.run_state [:script_1] 提出 「名稱是#{文件名}」

0

我用node.run_state [ '變量']出於相同的目的,是成功ABL e去做。請在下面找到基本的示例代碼。

`ruby_block 「RESOURCE_NAME」 做 塊做 node.run_state [ 'port_value'] = 1432 結束 結束

​​

我希望這將有助於。

+0

要使用'#{node.run_state ['variable']}在配方中獲取run_state的值, –