web-dev-qa-db-ja.com

Chefでローカルにファイルを移動/コピーする方法

ファイルをローカルにコピー/移動するChefリソースにまだ出会っていません。たとえば、 jetty hightide をダウンロードして解凍します。完了したら、次のように、すべてのファイルを特定のフォルダーにコピーします。

# mv /var/tmp/jetty-hightide-7.4.5.v20110725/* /opt/jetty/

ちなみに、解凍したときにjettyhightideはフォルダーを提供し、そのフォルダー内に残りのファイルが配置されます。したがって、unzip jetty-hightide-7.4.5.v20110725.Zip -d /opt/jetty/はディレクトリを作成するので役に立たない/opt/jetty/jetty-hightide-7.4.5.v20110725/*私が本当に欲しいのは/opt/jetty/*。したがって、私はChefでローカルのコピー/移動リソースを探しています。

50
slayedbylucifer

以下のようにbashリソースを使用して動作させました。

bash "install_jettyhightide" do
  code <<-EOL
  unzip /var/tmp/jetty-hightide-7.4.5.v20110725.Zip -d /opt/jetty/
  mv /opt/jetty/jetty-hightide-7.4.5.v20110725/* /opt/jetty/
  cp /opt/jetty/bin/jetty.sh /etc/init.d/jetty
  update-rc.d jetty defaults
  EOL
end

しかし、私はそれを行うシェフの方法を本当に望んでいました。ファイルのローカルでのコピー/移動は、システム管理者が行う必要がある最も一般的なタスクです。

13
slayedbylucifer

単一ファイルをコピーする方法

最初の方法

fileステートメントを使用してファイルをコピーします(コンパイル時チェック)

_file "/etc/init.d/someService" do
  owner 'root'
  group 'root'
  mode 0755
  content ::File.open("/home/someService").read
  action :create
end
_

ここに :

  • _"/etc/init.d/someService"_-ターゲットファイル、
  • _"/home/someService"_-ソースファイル

lazyブロックで::File.open("/home/someService").readをラップすることもできます

_...
lazy { ::File.open("/home/someService").read }
...
_

第二の方法

ユーザー_remote_file_ステートメント(実行時チェック)

_remote_file "Copy service file" do 
  path "/etc/init.d/someService" 
  source "file:///home/someService"
  owner 'root'
  group 'root'
  mode 0755
end
_

第三の方法

また、シェル/バッチを使用することもできます

For-eachディレクトリ

_Dir[ "/some/directory/resources/**/*" ].each do |curr_path|
  file "/some/target/dir/#{Pathname.new(curr_path).basename}" do
    owner 'root'
    group 'root'
    mode 0755
    content lazy { IO.read(curr_path, mode: 'rb').read }
    action :create
  end if File.file?(curr_path)
  directory "/some/target/dir/#{File.dirname(curr_path)}" do
    path curr_path
    owner 'root'
    group 'root'
    mode 0755
    action :create
  end if File.directory?(curr_path)
end
_

この例のサブパスは正しく処理されないため、これは単なるアイデアです。

103
CAMOBAP

この質問はすでに回答され、議論されていますが、ファイルを作成するときに使用する方法は次のとおりです。

  1. 最初に、クックブックのfiles/defaultフォルダーの下にファイルを含めます
  2. 次に、レシピでcookbook_fileリソースを使用します

例えば:

cookbook_file "/server/path/to/file.ext" do
  source "filename.ext"
  owner "root"
  group "root"
  mode 00600
  action :create_if_missing
end

シェフのドキュメントから: http://docs.opscode.com/resource_cookbook_file.html

Cookbook_fileリソースは、クックブックのfiles /ディレクトリのサブディレクトリから、実行中のホストにある指定されたパスにファイルを転送するために使用されますシェフクライアントまたはシェフソロ。

14
Marcos Abreu

ark cookbookを試してみてください。これによりファイルが抽出され、後でexecuteリソースに気づきます。

9
StephenKing

あなたがそれをやって受け入れた方法に加えて、コマンドのブロックを実行するのではなく、最初に尋ねた(コピーまたは移動)ようなコマンドを1つだけ実行したい場合は、 execute リソース:

execute "copy_core" do
    command "mv /var/tmp/jetty-hightide-7.4.5.v20110725 /opt/jetty"
    user "root"
end

たぶん、これは将来これを見ている誰かを助けるでしょう。

2
Titi

これはテキストファイルとバイナリファイルで機能するため、実際には次のようなもの( "binread"に注意)を使用します。特にUNIXシステムとWindowsシステムの両方を使用している場合、「読み取り」を使用すると、バイナリファイルで驚くべき結果が得られます。

file destination do
  content IO.binread(source)
  action  :create
end
1
rui

CHEFでローカルにファイルをコピーするには

file "C:/Users/Administrator/chef/1.xml" 

do         --->       tar content lazy 

{

IO.read("C:/Users/Administrator/chef-repo/cookbooks/2.xml")

} -->src

action :create

end
0
user4627911

レシピが既にWindowsに関連付けられている場合は、次のような埋め込みPowerShellスクリプトを使用できます。

# Copy files from "C:/foo/lib" to "C:/foo"
powershell_script "copy_lib" do
  code <<-EOH
    $ErrorActionPreference = "Stop"
      Get-ChildItem -Path "C:/foo/lib" -File | Foreach-Object {
        Copy-Item -Path $_.Fullname -Destination "C:/foo" -Force
      }
  EOH
end

# Delete "C:/foo/lib" folder
powershell_script "delete_lib" do
  code <<-EOH
    $ErrorActionPreference = "Stop"
    Remove-Item -Path "C:/foo/lib" -Recurse
  EOH
end
0
JoelFan