我正在尝试将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
资源,但结果相同。
答案 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 Providers和Lightweight Resources文档
答案 2 :(得分:0)
你试过逃避美元符号吗?
ln -s \$(ls -1 | grep '^[0-9.-]\+$') curr-version-libs