在属性中执行命令行

时间:2017-05-30 14:20:56

标签: templates attributes chef cookbook

我想在属性中生成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']%>'/>

我该怎么做?

更新 我想修改虚拟网络的default.xml网络。基本上,我们必须通过virsh-net command来完成 现在我想使用模板传递UUID&amp; MAC地址值到XML文件并在客户机中修改它。 这是我的食谱:

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

2 个答案:

答案 0 :(得分:1)

Yo可以使用反引号在ruby中执行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><%=@uuid %></uuid>
<mac address='<%=@mac %>'/>

答案 1 :(得分: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')