3

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リソースを使用してみましたが、同じ結果が得られます。

4

3 に答える 3

4

chef runが開始する前に19.26-3ディレクトリが存在する場合、それは簡単です。シンボリックリンクを作成する場合は、そのためのリンクリソースを使用することをお勧めします。

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

編集:ロビンが提案したようにバージョンに割り当てる前に、正規表現と呼び出しストリップを修正して答えを修正しました。

于 2013-01-28T18:56:16.260 に答える
1

シンボリックリンクを作成するためにシェルを呼び出しているようです。その場合、これを行うためのはるかに優れた方法は、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)によって提供されるものを理解するようになった人は、古いシェルスクリプトをクックブックにドロップしようとする人よりもはるかに幸せで効果的です。

リソースとプロバイダーおよび軽量リソースのドキュメントを読むことを強くお勧めします

于 2013-02-09T06:08:45.533 に答える
0

ドル記号をエスケープしてみましたか?

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