我还没有遇到过可以在本地复制/移动文件的 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 中寻找本地复制/移动资源。
最佳答案
如何复制单个文件
第一种方式
我使用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”
- 源文件
您还可以将 ::File.open("/home/someService").read
包装在 lazy
block 中
...
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
第三种方式
您也可以使用 shell/batch
对于每个目录
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
这只是一个想法,因为此示例中的子路径未正确处理。
关于chef-infra - 如何使用 Chef 在本地移动/复制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19221252/