54

我还没有遇到可以在本地复制/移动文件的 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 中寻找本地复制/移动资源。

4

8 回答 8

110

如何复制单个文件

第一种方式

我使用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").readlazy块包装

...
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

第三种方式

您也可以使用外壳/批处理

对于每个目录

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

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

于 2013-10-31T12:45:01.973 回答
15

我通过使用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

但我真的希望有一种厨师的方式来做这件事。在本地复制/移动文件将是系统管理员需要做的最通用的任务。

于 2013-10-07T10:38:24.070 回答
15

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

  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

来自厨师文档:https ://docs.chef.io/resources/cookbook_file/

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

于 2014-02-17T21:45:37.243 回答
9

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

于 2013-10-07T17:32:03.260 回答
4

除了您完成并接受它的方式之外,如果您只想像最初要求的那样运行一个命令(复制或移动),而不是运行一个命令块,那么您可以使用执行资源来执行此操作:

execute "copy_core" do
    command "mv /var/tmp/jetty-hightide-7.4.5.v20110725 /opt/jetty"
    user "root"
end

也许这会帮助其他人在未来看到这个。

于 2015-07-23T10:42:42.007 回答
2

我实际上会使用类似以下的内容(注意“binread”),因为这适用于文本文件和二进制文件。使用“读取”会对二进制文件产生令人惊讶的结果,特别是如果您同时使用 unix 和 Windows 系统。

file destination do
  content IO.binread(source)
  action  :create
end
于 2016-10-20T06:50:04.337 回答
0

如果您的配方已经绑定到 Windows,您可以使用嵌入式 PowerShell 脚本,如下所示:

# Copy files from "C:/foo/lib" to "C:/foo"
powershell_script "copy_lib" do
  code <<-EOH
    $ErrorActionPreference = "Stop"
      Get-ChildItem -Path "C:/foo/lib" -File | Foreach-Object {
        Copy-Item -Path $_.Fullname -Destination "C:/foo" -Force
      }
  EOH
end

# Delete "C:/foo/lib" folder
powershell_script "delete_lib" do
  code <<-EOH
    $ErrorActionPreference = "Stop"
    Remove-Item -Path "C:/foo/lib" -Recurse
  EOH
end
于 2017-12-08T18:56:30.323 回答
-1

在 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
于 2015-07-21T10:23:25.650 回答