【问题标题】:remote_file in linux using windows sharelinux中使用windows共享的remote_file
【发布时间】:2016-02-28 04:35:36
【问题描述】:

我正在尝试使用 Windows 共享来复制文件。它在 Windows 中工作正常,因为当我使用 linux 时它会出错。

remote_file 'download' do 
source 'file:////server/repo/client.zip' 
path "/etc/chef/client.zip" 
end

错误日志

Errno::ENOENT ------------- 没有这样的文件或目录@rb_sysopen - /server/repo/client.zip

Resource Declaration: --------------------- 
# In 52: remote_file 'download' do 
53: source 'file:////server/repo/client.zip' 
54: path "/etc/chef/client.zip" 
56: end 
57: #end

【问题讨论】:

  • 显然 linux 不知道如何将本应是本地文件的 file:// 神奇地转换为 cifs UNC 路径。您必须解决问题,安装目标共享,使用安装点作为源,然后卸载它。
  • 感谢天思白。您还可以建议维护用于厨师自动化的包(可执行文件)的最佳实践。
  • 综合更新食谱帮助厨师客户保持最新
  • 不,我问的是食谱中使用的二进制文件。比如java.exe等软件。我打算使用文件共享。存储二进制文件的最佳方式是什么。
  • 任何类型的工件存储库、nexus、工件或简单的 http Web 服务器,这一切都取决于您的工作流程和您的需求。通常是与平台无关的方式,http 是 IMO 的最佳候选者

标签: linux chef-infra chef-recipe windows-share


【解决方案1】:

这在 UNC 路径上完全有效的事实有点偶然(尽管以免有人误以为它不会被删除 AFAIK)。 Linux 没有类似的模式。您可以使用 execute 资源和 cp 来涵盖基本用例。

execute 'cp /from /to' do
  creates '/to'
end

【讨论】:

  • File.readfile 需要将整个文件缓冲到内存中,remote_file 缓冲到可能干扰自动 NFS 内容的临时文件,这是通常的 Linux 等效于 CIFS网络 URI。
  • creates 是特定于execute 的守卫,它的后代。相当于not_if { ::File.exist?('/to') }
  • 不确定我读的是什么而不是创建第一个......现在你说了,这听起来很明显。以前的cmet不管,我会清理它们
【解决方案2】:

你可以试试:

remote_file 'download' do 
  source '\\server\repo\client.zip' 
  path "/etc/chef/client.zip" 
end

remote_file 资源通过 Chef::Provider::RemoteFile::NetworkFile 类支持 Windows 网络路径(如果有人想在源中挖掘更多信息)。

remote_file 下的调度程序键关闭前导双反击“\\”,因此这些字符必须是反击而不是正斜杠。另请注意,我使用的是单引号而不是双引号 - 如果使用双引号(用于插值或仅用于样式),则需要自行转义回击,它变为 source "\\\\server\\repo\\client.zip"。我相当肯定 ruby​​ 本身会容忍将其余的回击更改为正斜杠(所以source '\\server/repo/client.zip' 可能是合法的?),但这看起来很尴尬。

此功能在 12.4.0 中首次发布于 https://github.com/chef/chef/pull/3336

【讨论】:

  • - 它应该可以工作。确保您使用的是至少 12.4.0 并确保您删除了 url 的 file:// 部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-17
  • 1970-01-01
  • 1970-01-01
  • 2011-02-28
  • 2015-05-20
  • 2013-09-01
  • 1970-01-01
相关资源
最近更新 更多