2017-05-30 44 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

相关问题