问题描述
在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
资源进行适当的修改,以便在下载文件时记录日志。
以下是实现的步骤:
- 创建一个自定义资源(例如,
custom_remote_file
)以定制remote_file
行为。您需要在自定义资源中添加日志记录的逻辑。 - 在自定义资源的提供者中,根据下载情况,记录所使用的源。
以下是一个示例代码:
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资源库中的功能来解决。您可以根据实际需求选择适合您情况的解决方案。