2017-05-30 42 views
1

中的命令行我想在屬性中生成MAC地址和UUID,然後將值傳遞給模板。 是這樣的:執行屬性

Attribute/default.rb

default['libvirt']['xml_mac_Adrr'] = 'openssl rand -hex 6 | sed 's/\(..\)/\1:/g; s/:$//'' 
default['libvirt']['xml_uuid'] = 'uuidgen virbr0' 

Template/network.erb

<uuid><%= node['libvirt']['xml_uuid'] %></uuid> 
  <mac address='<%= node['libvirt']['xml_mac_Adrr']%>'/> 

我怎麼能這樣做?

UPDATE 我想修改default.xml網絡虛擬網絡。基本上,我們必須這樣做virsh-net command 現在我想使用一個模板來將UUID & MAC地址值傳遞給XML文件並在來賓機器中對其進行修改。 這是我的食譜:

template '/etc/libvirt/qemu/network/default.xml' do 
source 'qemu-network.erb' 
owner "root" 
group "root" 
mode "0644" 
end 

回答

1

呦可以使用反引號來執行內部紅寶石shell命令並捕獲響應:

default['libvirt']['xml_mac_Adrr'] = `openssl rand -hex 6 | sed 's/\(..\)/\1:/g; s/:$//'` 
default['libvirt']['xml_uuid'] = `uuidgen virbr0` 

編輯:

我看到的第二個問題是,你有在控制器中使用實例變量與視圖共享信息。所以最好的辦法是:

@mac = `openssl rand -hex 6 | sed 's/\(..\)/\1:/g; s/:$//'` 
@uuid = `uuidgen virbr0` 

然後在視圖級,您可以使用:

<uuid><%[email protected] %></uuid> 
<mac address='<%[email protected] %>'/> 
+0

可悲的廚師屬性文件不能很好地處理反引號,並且問題被無標記地標記爲RoR。 – Tensibai

+0

acctualy我試圖修改虛擬網絡的default.xml。你對這個命令的建議是對的。我沒有任何運行default.rb的錯誤。但我無法將該命令的值傳遞給erb文件。我會用recpie更新我的問題。 – amir

1

在廚師依靠系統命令應該通過shell_out方法(包括在配方DSL)以避免DSL解釋器運行時出現一些怪異現象,並得到方法來清理輸出。

我會走這條路:

default['libvirt']['xml_mac_Adrr'] = Chef::ShellOut.new("openssl rand -hex 6 | sed 's/\(..\)/\1:/g; s/:$//'").stdout.chomp 
default['libvirt']['xml_uuid'] = Chef::ShellOut.new('uuidgen virbr0').stdout.chomp 

但是,這裏有一個問題,在每次運行中,一個新的MAC地址會被產生,所以你應該使用normal,避免重新定義它,這是最簡單的感動進入配方,在你的模板代碼應該做的之前在配方文件中:

node.normal['libvirt']['xml_mac_Adrr'] = shell_out("openssl rand -hex 6 | sed 's/\(..\)/\1:/g; s/:$//'").stdout.chomp unless node['libvirt'].includes?('xml_mac_Adrr') 
+1

非常感謝解釋! – amir

相關問題