3

我正在尝试将一个 shell 命令嵌入到我的 Chef 食谱中,但是当 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.-]+$') 正在被删除,我最终得到了 command ln -s curr-version-libs

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

4

3 回答 3

4

如果你的19.26-3目录在 chef run 开始之前就已经存在,那么很容易。如果您正在创建符号链接,我建议您使用链接资源。

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

编辑:我通过修复正则表达式并在分配给 Robin 建议的版本之前调用strip来纠正答案。

于 2013-01-28T18:56:16.260 回答
1

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

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

  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

简短的旁白:我已经指导和辅导了许多人来学习 Chef。那些开始了解资源、提供者和轻量级资源(又名 LWRP)所提供的东西的人比那些试图将旧的 shell 脚本放入他们的食谱中的人要快乐和有效得多。

我强烈建议阅读资源和提供者以及轻量级资源文档

于 2013-02-09T06:08:45.533 回答
0

你试过转义美元符号吗?

ln -s \$(ls -1 | grep '^[0-9.-]\+$') curr-version-libs
于 2013-01-28T17:50:34.857 回答