在Chef中使用remote_file下载文件时记录来源

80次阅读
没有评论

问题描述

在Chef中,我们使用remote_file并将source指定为一个数组。这样可以在主服务器不可用的情况下,检查多个服务器以获取所需的文件。我们希望能够记录remote_file实际下载文件时所使用的源。我认为可能会使用log资源,但我不确定如何找出remote_file使用的是提供的源中的哪一个。

以下是一个简化的示例:

urlArray = ['google.com','reddit.com','stackexchange.com']
remote_file 'foo' do
  source urlArray
  notifies :write, "log[Downloaded from: #{sourceUsed}]", :immediate
end

log "Downloaded from: #{sourceUsed}" do
  action :nothing
end

解决方案

请注意以下操作可能涉及对Chef资源的定制修改,建议在操作前备份数据。

方案1:定制remote_file资源

为了在remote_file下载文件时记录所使用的源,您可以通过定制资源的方式来实现。由于Chef资源不会返回任何值,我们需要对remote_file资源进行适当的修改,以便在下载文件时记录日志。

以下是实现的步骤:

  1. 创建一个自定义资源(例如,custom_remote_file)以定制remote_file行为。您需要在自定义资源中添加日志记录的逻辑。
  2. 在自定义资源的提供者中,根据下载情况,记录所使用的源。

以下是一个示例代码:

resource_name :custom_remote_file

property :name, String, name_property: true
property :source, Array, required: true
property :path, String, required: true

action :create do
  source_used = nil

  new_resource.source.each do |src|
    remote_file new_resource.name do
      source src
      path new_resource.path
      action :create
      notifies :write, "log[Downloaded from: #{src}]", :immediate
      only_if { source_used.nil? }  # Download from the first available source
    rescue StandardError
      # Record the failed source if download from this source fails
      source_used = src
      next
    end
    source_used = src if source_used.nil?  # Record the successful source
    break
  end

  log "Downloaded from: #{source_used}" do
    action :nothing
  end
end

在这个示例中,我们创建了一个名为custom_remote_file的自定义资源,它有source(源数组)和path(文件路径)两个属性。在资源的create操作中,我们循环遍历源数组并尝试从每个源下载文件。如果下载成功,我们记录成功的源;如果下载失败,我们记录失败的源。日志记录使用log资源进行。

方案2:更改日志级别

另一种方法是通过更改Chef运行时的日志级别来实现。默认情况下,Chef在警告级别(warn)记录下载失败的源,在信息级别(info)记录尝试的源。您可以将日志级别更改为调试级别(debug),以便获取更详细的源信息。

以下是如何在Chef运行时更改日志级别的示例:

在启动Chef运行之前,使用以下命令行参数:

chef-client --log_level debug

或者,在Chef的配置文件中设置日志级别:

log_level :debug

通过更改日志级别,您可以在日志中找到详细的源信息,以及尝试和失败的情况。

方案3:使用Chef资源库中的功能

另一种方法是通过查看Chef资源库中的功能来实现日志记录。如果您发现Chef资源库已经有满足您需求的功能,您可以考虑使用这些功能。

请注意,定制资源可能涉及到一些额外的开发和测试工作,以确保资源正常工作并满足您的需求。

总结

在Chef中使用remote_file下载文件并记录来源的问题,可以通过定制资源、更改日志级别或使用Chef资源库中的功能来解决。您可以根据实际需求选择适合您情况的解决方案。

正文完