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