无法将bash命令嵌入Chef Recipe中

时间:2013-01-28 17:35:55

标签: bash chef

我正在尝试将shell命令嵌入到我的Chef Recipe中,但是当Chef执行命令时,它似乎出错了。这是有问题的资源:

script "create libs symlink" do
  interpreter "bash"
  user "root"
  cwd "/home/robin/test"
  code <<-EOH
ln -s $(ls -1 | grep '^[0-9.-]\+$') curr-version-libs
  EOH
end

/home/robin/test目录包含一个名为19.26-3的文件夹,所以我期待一个名为curr-version-libs的符号链接指向19.26-3

相反,我最终得到了一个循环符号链接:

drwxr-xr-x 4 root root  4096 Jan 17 22:35 19.26-3
drwxr-xr-x 2 root root  4096 Jan 17 22:35 config
lrwxrwxrwx 1 root root    17 Jan 28 17:31 curr-version-libs -> curr-version-libs

似乎$(ls -1 | grep'^ [0-9 .-] + $')被删除了,我最终得到了ln -s curr-version-libs命令。

有谁知道这里发生了什么?我尝试过使用execute资源,但结果相同。

3 个答案:

答案 0 :(得分:4)

如果您的 19.26-3 目录在Chef运行开始之前就已存在,那么很容易。如果您要创建符号链接,我建议您使用 link 资源。

version = `ls /home/robin/test/ -1 | grep '^[0-9.-]+$'`.strip

link "/home/robin/test/curr-version-libs" do
  to ::File.join( "/home/robin/test", version )
end

但如果不存在,我建议使用ruby_block并动态定义链接资源。

ruby_block "create libs symlink" do
  block do
    version = `ls /home/robin/test/ -1 | grep '^[0-9.-]+$'`.strip
    res = Chef::Resource::Link.new( "/home/robin/test/curr-version-libs", run_context )
    res.to ::File.join( "/home/robin/test", version )
    res.run_action :create
  end
end

编辑:我在修改正则表达式并调用 strip 之前更正了答案,然后再分配给Robin提出的版本。

答案 1 :(得分:1)

看来你正在调用shell来创建一个sym链接。在这种情况下,更好的方法是使用Chef link resource。我永远不会使用脚本执行资源来做你正在做的事情。

使用链接资源,您将执行以下操作:

  link "/home/robin/test/curr-version-libs" do
    to '/home/robin/test/19.26-3'
    user 'root'
    group 'root'
    link_type :symbolic 
    action :create
  end

快速评论:我已经指导并辅导了许多人来做厨师。那些了解资源,提供商和轻量级资源(也称为LWRP)所提供内容的人比那些试图将旧的shell脚本放入他们的烹饪书中的人更快乐和有效。

我强烈建议您阅读Resource and ProvidersLightweight Resources文档

答案 2 :(得分:0)

你试过逃避美元符号吗?

ln -s \$(ls -1 | grep '^[0-9.-]\+$') curr-version-libs