如何将变量从我的shell脚本传递到我的厨师模板配方?

时间:2016-08-05 10:35:18

标签: chef

我有一个shell脚本,其输出是一个变量。我通过配方中的bash资源运行该shell脚本。我希望能够通过我的厨师模板访问该变量。反正有吗?

bash resource:
  "My script which outputs a variable"
EOF

我想将此变量输出到template资源。

3 个答案:

答案 0 :(得分:0)

如果要在多个配方中使用,请将输出另存为节点属性。

ruby_block 'get output' do
   block do
      node.default['return_val']=`/tmp/test.sh`
   end
end

template '/tmp/new.sh' do
   source 'test.erb'
   owner 'root'
   group 'root'
   mode '0644'
   variables( lazy {{:config_var => node['return_val']}})
end

厨房产量: -

     * ruby_block[get output] action run
       - execute the ruby block reload client config
     * template[/tmp/new.sh] action create
       - create new file /tmp/new.sh
       - update content in file /tmp/new.sh from none to 2c9c1f
       --- /tmp/new.sh  2016-08-05 13:20:21.678786687 +0000
       +++ /tmp/.chef-new.sh20160805-12338-81wvgw   2016-08-05 13:20:21.678786687 +0000
       @@ -1 +1,2 @@
       +mrigesh
       - change mode from '' to '0644'
       - change owner from '' to 'root'
       - change group from '' to 'root'
       - restore selinux security context

答案 1 :(得分:0)

要对@Mrigesh发布的内容进行细化:

资源本身没有输出或返回值,因此您需要使用较低级别的帮助程序来捕获命令输出。我们为您提供了一个名为shell_out!()的优秀API。最简单的选择是这样的

template '/whatever' do
  # other stuff here
  variables lazy { {config_var: shell_out!('bash /myscript.sh').stdout} }
end

这也使用lazy{}帮助程序来确保命令在收敛时而不是编译时运行,根据您的方案可能不需要。

答案 2 :(得分:0)

有一种更简单的方法,也许不太优雅,但经过了测试。 在您放置的模板中

some_value = <%= `some_bash_command`.strip %>

即您可能要根据计算机上的默认路由选择dynds_iface,将其选择为您简单放置的模板:

dyndns_iface = <%= `ip r|awk '/default via/ {print $5}'`.strip %>

在这里打勾。它获取命令的shell输出。剥离只是删除不必要的空白。