我还没有遇到将在本地复制/移动文件的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的本地复制/移动资源。
答案 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
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)
我知道这个问题已经得到解答和讨论,但这是我在创建文件时使用的方法。
cookbook_file
资源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