问题描述
在迁移从 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 版本,以解决兼容性问题。