如何使用Chef在本地移动/复制文件

sla*_*fer 50 chef-infra

我还没有遇到将在本地复制/移动文件的Chef资源.例如,我想下载jetty hightide并解压缩它.完成后,将所有文件复制到特定文件夹中,如下所示:

# mv /var/tmp/jetty-hightide-7.4.5.v20110725/* /opt/jetty/
Run Code Online (Sandbox Code Playgroud)

解压后,BTW,jettyhightide会给你一个文件夹,并在文件夹里面放置其余的文件.因此unzip jetty-hightide-7.4.5.v20110725.zip -d /opt/jetty/它是无用的,因为它将创建一个目录,/opt/jetty/jetty-hightide-7.4.5.v20110725/*而我真正想要的是/opt/jetty/*.因此,我正在寻找Chef的本地复制/移动资源.

CAM*_*BAP 103

如何复制单个文件

第一种方式

我使用file语句来复制文件(编译时检查)

file "/etc/init.d/someService" do
  owner 'root'
  group 'root'
  mode 0755
  content ::File.open("/home/someService").read
  action :create
end
Run Code Online (Sandbox Code Playgroud)

这里 :

  • "/etc/init.d/someService" - 目标文件,
  • "/home/someService" - 源文件

你也可以::File.open("/home/someService").readlazy块包装

...
lazy { ::File.open("/home/someService").read }
...
Run Code Online (Sandbox Code Playgroud)

第二种方式

用户remote_file声明(运行时检查)

remote_file "Copy service file" do 
  path "/etc/init.d/someService" 
  source "file:///home/someService"
  owner 'root'
  group 'root'
  mode 0755
end
Run Code Online (Sandbox Code Playgroud)

第三种方式

您也可以使用shell/batch

For-each目录

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
Run Code Online (Sandbox Code Playgroud)

这只是一个想法,因为此示例中的子路径未正确处理.

  • 请添加一条注释,即`remote_file`和`file`之间的差异也是'file`在**compile**时执行,而`remote_file`在**run**时执行.因此,当您需要在运行时使用文件时 - "remote_file"是一个很好的解决方法. (5认同)
  • 很棒的答案!我特别喜欢上面的'第一种方式',因为如果文件内容没有改变,它将不会更新文件.值得一提的是,如果源文件由Chef管理,那么:: File.open*必须*包装在一个惰性块中,否则Chef将无法在编译时找到该文件.lazy属性仅在Chef> = 11.6,> = 10.28(我相信)中可用. (4认同)
  • 同样``IO.read("/ home/someService")`还有点短. (3认同)
  • 最好指出使用远程文件将解决Chef需要文件在编译时存在的问题. (3认同)
  • 请务必注意,对于二进制文件,您需要将其更改为 `IO.read(curr_path, mode: 'rb')` 否则可能会损坏目标文件。 (2认同)

sla*_*fer 13

我通过使用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
Run Code Online (Sandbox Code Playgroud)

但我真的希望厨师这样做.在本地复制/移动文件将是系统管理员需要做的最通用的任务.


Mar*_*reu 13

我知道这个问题已经得到解答和讨论,但这是我在创建文件时使用的方法.

  1. 首先在cookbook的files/default文件夹下包含该文件
  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
Run Code Online (Sandbox Code Playgroud)

来自厨师文档:http://docs.opscode.com/resource_cookbook_file.html

cookbook_file资源用于将文件从cookbook中files /目录的子目录传输到位于运行chef-client或chef-solo的主机上的指定路径.

  • 这篇文章是关于将目标机器上已有的文件移动到目标机器上的另一个位置.cookbook_file无法做到这一点.cookbook_file用于将文件从cookbook复制到目标机器,而不是在目标机器周围. (4认同)

Ste*_*ing 9

你可以尝试一下方舟食谱.这会为您提取文件,然后您会注意到execute资源.