2017-05-31 55 views
0

我有一個有趣的問題,我通過創建Chef資源來處理一些我可能需要的其他食譜中的任務來重構食譜。舉例來說,我已經創建了以下行動:action_class.class_eval方法不能與執行資源的環境屬性

resource_name :my_command 

action :run do 
    execute "Execute my command" do 
    environment ({"SETTINGS_FOLDER" => node['settings']['folder']}) 
    command "#{command_exe} -some -params" 
    end 
end 

action_class.class_eval do 
    def command_exe 
    "#{node['command']['folder']}\\bin\\command.exe" 
    end 
end 

當我打電話my_command從它按預期工作的祕訣。不過,我還有其他actions,這個資源將執行,將全部使用相同的environment。所以我所做的就是重構的資源看起來像這樣:

resource_name :command 

action :run do 
    execute "Execute my command" do 
    environment env 
    command "#{command_exe} -some -params" 
    end 
end 

action_class.class_eval do 
    def command_exe 
    "#{node['command']['folder']}\\bin\\command.exe" 
    end 

    def env 
    {"SETTINGS_FOLDER" => node['settings']['folder']} 
    end 
end 

現在發生的事情是,一旦chef-client執行它看起來好像機器上的SETTINGS_FOLDER環境變量風這樣看的my_command資源:

SETTINGS_FOLDER = ""C:\my\settings\folder""

注意加倍的雙引號?我不知道爲什麼會這樣,但它使我command.exe很生氣:(

['settings']['folder']屬性在菜譜的attributes/default.rb像這樣定義的:

default['settings']['folder'] = 'C:\\my\\settings\\folder' 

我的節點運行廚師客戶13.0.118

編輯我覺得一倍雙引號是紅鯡魚。我覺得只是記錄儀代表了這樣的哈希值。我的新想法是,也許env方法沒有被之前評估被傳遞給environment,而是函數引用本身被傳遞。忍受我,Ruby不是我的第一語言......

+0

你在最後一個例子中有不匹配的引號,你確定這是你的嗎? – coderanger

+0

@coderanger好抓,固定起來。這在我的屬性文件中是正確的,只是在這裏錯誤地轉錄了它 – ThaDon

回答

1

「env」方法名稱可能是一個保留字,或者在運行後期會變得很st ped。可能爲該方法嘗試一個不同的名稱?

+0

你是對的!我在'execute'資源文檔中發現了這一點:'env是環境的別名'將方法名更改爲'enviro'工作 – ThaDon