在属性中执行命令行

Execute command line in attribute

我想在属性中生成 MAC 地址和 UUID,然后将值传递给模板。 像这样:

Attribute/default.rb:

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

Template/network.erb:

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

我该怎么做?

更新 我想为虚拟网络修改 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

你可以使用反引号在 ruby 中执行 shell 命令并捕获响应:

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

编辑:

我看到的第二个问题是你必须在控制器中使用实例变量来与视图共享信息。所以最好的方法是:

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

然后在视图级别您可以使用:

<uuid><%=@uuid %></uuid>
<mac address='<%=@mac %>'/>

在依赖系统命令的 Chef 中应该通过 shell_out 方法(包含在配方 dsl 中)以避免 DSL 解释器为 运行 时出现一些怪癖并让 methosd 进行清理输出。

我会这样走:

default['libvirt']['xml_mac_Adrr'] = Chef::ShellOut.new("openssl rand -hex 6 | sed 's/\(..\)/:/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/\(..\)/:/g; s/:$//'").stdout.chomp unless node['libvirt'].includes?('xml_mac_Adrr')