无法将Bash命令嵌入到Chef配方中

3

我正在尝试将一个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 资源,但是结果相同。


如果在运行命令时grep没有匹配到任何内容,扩展名将被有效地删除。您确定该目录在那个时间存在,并且不是由另一个chef配方稍后创建的吗?您可以执行ls -l> ls_snapshot,然后检查ls_snapshot以查看当时有哪些文件。 - that other guy
3个回答

4
如果在Chef运行之前,您的目录19.26-3已经存在,那就很容易。如果您要创建符号链接,我建议使用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

编辑:我通过修正正则表达式并在Robin建议后调用strip进行赋值,纠正了答案。


那看起来应该可以 - 我明天会试一下并让你知道我的进展。谢谢! - Robin
好的,你的第二个建议证明是正确的 - 第一个执行顺序错误。此外,我不得不从正则表达式中删除反斜杠,并且我必须执行 version = version.delete("\n") 来剥离链接名称中的尾随垃圾。再次感谢! - Robin
为什么您只推荐使用“link”资源来创建符号链接?此外,您在代码中执行的所有命令行操作都可以使用Ruby核心或标准库类更轻松地、更具可移植性地执行。 - Jordan Dea-Mattson
我从未说过我只推荐它用于符号链接。这是创建任何链接的方法,甚至在Windows节点上也可以使用。关于命令行操作,可以使用Ruby执行。我不太擅长Ruby,只是复制了OP代码。我想你可以详细说明并提供自己的答案。 - Draco Ater

1
看起来你正在调用shell来创建符号链接。在这种情况下,更好的方法是使用Chef link resource。我永远不会使用scriptexecute资源来做你正在做的事情。
使用链接资源,您将执行以下操作:
  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。那些理解资源、提供者和轻量级资源(又称LWRPs)所提供的内容的人比那些仅尝试将旧的shell脚本放入其cookbook的人更加快乐和有效。

我强烈推荐阅读资源和提供者以及轻量级资源文档。


0

你尝试过转义美元符号吗?

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

是的,我已经尝试过转义它们,但没有任何区别。我还尝试使用反引号,同样的结果。 - Robin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接