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

时间:2013-10-07 09:30:38

标签: chef

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

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

8 个答案:

答案 0 :(得分:102)

如何复制单个文件

第一种方式

我使用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
...
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 / 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

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

答案 1 :(得分: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

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

答案 2 :(得分:13)

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

  1. 首先在cookbook的文件/默认文件夹
  2. 下包含该文件
  3. 然后在您的食谱上使用cookbook_file资源
  4. e.g:

    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资源用于从a传输文件   指定的cookbook中 files / 目录的子目录   位于运行chef-client或chef-solo的主机上的路径。

答案 3 :(得分:9)

您可以试试ark食谱。这会为您提取文件,然后您会注意到execute资源。

答案 4 :(得分:2)

除了你已经完成并接受它的方式,如果你只想运行一个像你最初要求的那样(复制或移动),而不是运行一个命令块,那么你可以用{{{ 3}}资源:

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

也许这将有助于其他人在将来看到这个。

答案 5 :(得分:1)

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

            select ID  , Name  ,  Hobby1    , Hobby2  ,  Hobby3 
             from
             (
             select 
            ID , Name,Hobbies, 
                case when Hobyno ='1' then 'Hobby1' 
                when Hobyno ='2' then 'Hobby2' 
                when Hobyno ='3' then 'Hobby3' 
                else null end as HobyNo 
            from

            (
             select   *,ROW_NUMBER() OVER ( PARTITION  BY id order by id ) HobyNo
              from   #temp
            )a
            where a.HobyNo <4  -- Add if you want more than 3 hobbie also edit case when
             )a 

            pivot
            (
              max(Hobbies)
              for Hobyno in ([Hobby1],[Hobby2],[Hobby3] )
            ) piv;

答案 6 :(得分:0)

在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

答案 7 :(得分: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