如何在厨师本地移动/复制文件
我还没有遇到一个厨师资源,将复制/本地移动文件。 例如,我想下载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/是无用的,因为它会创build一个目录/opt/jetty/jetty-hightide-7.4.5.v20110725/*而我真正想要的是/opt/jetty/* 。 因此,我正在寻找厨师的本地复制/移动资源。 
如何复制单个文件
第一种方式
 我使用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 { ::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 /批处理
对于每个目录
 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 
这只是想法,因为在这个例子中的子path处理不正确。
 我通过使用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 
但我真的希望有一个厨师的方式来做到这一点。 在本地复制/移动文件将是系统pipe理员需要做的最通用的任务。
我知道这个问题已经被回答了,并且被讨论了,但是这里是我在创build文件时使用的方法。
- 首先将该文件包含在食谱的文件/默认文件夹下
-  然后在你的食谱中使用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资源用于将文件从cookbook中files /目录的子目录传输到位于运行chef-client或chef-solo的主机上的指定path。
 你可以试一试方舟食谱。 这会为您提取文件,然后您会注意到execute资源。 
除了你已经完成并接受它的方式之外,如果你只想运行一个像你最初询问(复制或移动)的命令,而不运行一个命令块,那么你可以用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