如何在厨师本地移动/复制文件

我还没有遇到一个厨师资源,将复制/本地移动文件。 例如,我想下载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文件时使用的方法。

  1. 首先将该文件包含在食谱的文件/默认文件夹下
  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资源用于将文件从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