【问题标题】:Can't embed bash command in to Chef Recipe无法将 bash 命令嵌入到厨师食谱中
【发布时间】:2013-02-09 14:08:45
【问题描述】:

我正在尝试将一个 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.-]+$') 正在被删除,我最终得到了命令 ln -s curr-version-libs

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

【问题讨论】:

  • 如果grep 在命令运行时不匹配任何内容,扩展将被有效删除。您确定该目录当时存在,并且以后不是由另一个厨师食谱创建的吗?你可以ls -l &gt; ls_snapshot 然后检查 ls_snapshot 看看当时有哪些文件。

标签: bash chef-infra


【解决方案1】:

如果您的 19.26-3 目录在 chef run 开始之前已经存在,那么这很容易。如果您要创建符号链接,我建议您使用 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 的建议分配给版本。

【讨论】:

  • 看起来它会起作用的——我明天试试,现在让你看看我是怎么做的。谢谢!
  • 好的,您的第二个建议结果是赢家 - 第一个执行顺序错误。此外,我必须从正则表达式中删除反斜杠,并且我必须执行 version = version.delete("\n") 以从链接名称中去除尾随垃圾。再次感谢!
  • 为什么只推荐使用 link 资源作为符号链接?此外,您的代码中执行的所有命令行操作都可以使用 Ruby 核心或标准库类以可移植的方式更轻松地执行。
  • 我从来没有说过我只推荐它用于符号链接。这是创建任何链接的方式,甚至是在 Windows 节点上。关于命令行操作,可以使用 Ruby 执行。我不太擅长 ruby​​,只是复制了 OP 代码。我想您可以对此进行详细说明并提供您自己的答案。
【解决方案2】:

看来您正在调用 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。那些开始了解资源、提供者和轻量级资源(又名 LWRP)所提供的东西的人比那些试图将旧的 shell 脚本放入他们的食谱中的人要快乐和有效得多。

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

【讨论】:

    【解决方案3】:

    你试过转义美元符号吗?

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

    【讨论】:

    • 是的,我已经尝试将它们都转义,但没有任何区别。我也尝试过使用反引号,同样的事情
    猜你喜欢
    • 2016-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-01
    • 2013-02-18
    • 1970-01-01
    • 2019-01-29
    • 1970-01-01
    相关资源
    最近更新 更多