ファイルをローカルにコピー/移動する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でローカルのコピー/移動リソースを探しています。
以下のように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
しかし、私はそれを行うシェフの方法を本当に望んでいました。ファイルのローカルでのコピー/移動は、システム管理者が行う必要がある最も一般的なタスクです。
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
_
また、シェル/バッチを使用することもできます
_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
_
この例のサブパスは正しく処理されないため、これは単なるアイデアです。
この質問はすでに回答され、議論されていますが、ファイルを作成するときに使用する方法は次のとおりです。
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 /ディレクトリのサブディレクトリから、実行中のホストにある指定されたパスにファイルを転送するために使用されますシェフクライアントまたはシェフソロ。
ark cookbookを試してみてください。これによりファイルが抽出され、後でexecute
リソースに気づきます。
あなたがそれをやって受け入れた方法に加えて、コマンドのブロックを実行するのではなく、最初に尋ねた(コピーまたは移動)ようなコマンドを1つだけ実行したい場合は、 execute リソース:
execute "copy_core" do
command "mv /var/tmp/jetty-hightide-7.4.5.v20110725 /opt/jetty"
user "root"
end
たぶん、これは将来これを見ている誰かを助けるでしょう。
これはテキストファイルとバイナリファイルで機能するため、実際には次のようなもの( "binread"に注意)を使用します。特にUNIXシステムとWindowsシステムの両方を使用している場合、「読み取り」を使用すると、バイナリファイルで驚くべき結果が得られます。
file destination do
content IO.binread(source)
action :create
end
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
レシピが既に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