在 Chef 14 中加载 Provider 的新方法:Chef::ProviderResolver

39次阅读
没有评论

问题描述

在迁移从 Chef 12 到 Chef 14 的过程中遇到了问题。在 Chef 14 中,加载 Provider 的方式与之前的版本有所不同。用户遇到了一个无法加载 Chef::Provider::DeployKeyGithub 的问题。以下是用户的代码和错误信息:

deploy_key deploy_key_name do
  provider Chef::Provider::DeployKeyGithub
  path "/home/#{current_user}/.ssh"
  credentials({
    :token => File.read('/root/someid').strip
  })
  repo 'test/test_config'
  owner 'root'
  group 'root'
  mode '0400'
  action :add
end

错误信息:

NameError---------
uninitialized constant Chef::Provider::DeployKeyGithub

用户希望知道在 Chef 14 客户端中加载 Provider 的新方式。

解决方案

请注意以下操作可能因版本差异而有所变化,请在执行操作前做好备份。
在 Chef 14 中,加载 Provider 的方式有所变化,可以使用 Chef::ProviderResolver 来实现。以下是解决方案的步骤:

使用 Chef::ProviderResolver 加载 Provider

在 Chef 14 中,可以使用 Chef::ProviderResolver 来加载 Provider。下面是你可以采用的方法:

deploy_key deploy_key_name do
  provider Chef::ProviderResolver.new(node, find_resource!("deploy_key
"), :nothing).resolve path "/home/#{current_user}/.ssh" credentials({ :token => File.read('/root/someid').strip }) repo 'test/test_config' owner 'root' group 'root' mode '0400' action :add end

在上面的代码中,我们使用了 Chef::ProviderResolver 来加载 deploy_key 的 Provider。这将解决在 Chef 14 中加载 Provider 的问题。

注意事项

  • 请确保你的代码中引用的 deploy_key 资源是一个正确定义的资源,并且在你的代码中能够找到。如果这个资源来自于一个外部 cookbook,你需要确保这个 cookbook 在 Chef 14 中仍然兼容。

附加解决方案

有用户提到使用新的 Chef::ProviderResolver 语法来加载 Provider,但也有用户提到无法成功让 cookbook 工作。如果你无法成功使用 Chef::ProviderResolver 来加载 Provider,你可以尝试以下附加解决方案:

查找更新的 Cookbook 版本

有用户在 GitHub 上找到了一个经过更新的 deploy_key cookbook 版本,解决了在 Chef 14 中的兼容性问题。你可以尝试使用这个版本,它可能会绕过你遇到的问题。你可以在这个链接找到这个更新的版本:https://github.com/alvlapo/cookbook-deploy_key

总结

在 Chef 14 中,加载 Provider 的方式有所变化。你可以使用 Chef::ProviderResolver 来加载 Provider,确保你的代码在新的版本中能够正常工作。如果遇到问题,你可以尝试查找更新的 Cookbook 版本,以解决兼容性问题。

正文完