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

标签 chef-infra

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

最佳答案

如何复制单个文件

第一种方式

我使用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 block 中

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

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

关于chef-infra - 如何使用 Chef 在本地移动/复制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19221252/

相关文章:

chef-infra - 如何更改 Chef 执行顺序?

docker - 如何将 Chef 数据包 secret 传递给 docker 容器?

ruby - 我如何在命令行中捕获值并添加到配方中?

chef-infra - Chef 执行资源, "creates"参数有什么作用?

chef-infra - 使用 Wrapper Recipe 覆盖属性

java - 在 Chef 中禁用 docker 容器日志配置

ruby - Chef - 从 LWRP 中的其他操作调用操作

chef-infra - Knife bootstrap命令不提示密码

chef-infra - Chef 服务器将无法启动 - 在 16011 中启动 Chef-server 失败

chef-infra - Chef - ServerSpec - 访问节点属性