Chef项目部署服务器遇mysql cookbook RecipeNotFound报错求助
嘿,我之前也踩过类似的坑,从旧版recipe驱动的MySQL cookbook转到新版库型确实需要调整代码逻辑,给你几个可行的解决方向:
核心原因先搞懂
新版(8.x+)的MySQL cookbook已经彻底改成库型cookbook了,不再提供像旧版那样开箱即用的client、server这类recipes,而是提供自定义资源让你按需调用,所以直接用include_recipe 'mysql::client'肯定会报找不到recipe的错误。
具体解决办法
1. 直接使用新版的自定义资源(推荐)
这是官方推荐的方式,灵活性更高。你可以在你的cookbook里直接调用mysql_client资源来实现旧版mysql::client的功能:
# 安装基础MySQL客户端 mysql_client 'default' do action :create end # 如果你的项目需要编译依赖(比如用到mysql的gem),还需要安装开发包 package 'libmysqlclient-dev' do action :install only_if { node['platform_family'] == 'debian' } end
这样就替代了旧版include_recipe 'mysql::client'的作用,而且支持新版Ubuntu系统(比如18.04/20.04等,再也不用卡着Ubuntu14.04了)。
2. 自己封装兼容旧版的过渡recipe
如果你的项目里很多地方都用到了include_recipe 'mysql::client',不想一次性全改,可以在你自己的cookbook里写一个过渡用的recipe:
- 在你的cookbook目录下创建
recipes/mysql_client.rb - 把下面的代码放进去:
# 兼容旧版mysql::client的功能 mysql_client 'default' do action :create end package 'libmysqlclient-dev' do action :install only_if { node['platform_family'] == 'debian' } end
- 然后把项目里所有的
include_recipe 'mysql::client'改成include_recipe 'your_cookbook_name::mysql_client',这样可以逐步过渡,不用一次性改完所有代码。
3. 备选:使用社区封装的兼容cookbook
有些社区开发者基于新版MySQL库封装了类似旧版的recipes,不过这种方式不推荐长期用,毕竟第三方cookbook的维护性没保障,而且官方的资源方式更灵活。如果实在想偷懒,可以找一下活跃维护的这类cookbook,但还是建议尽早转到官方资源的方式。
额外建议:升级服务器系统
旧版MySQL cookbook只支持Ubuntu14.04,但这个版本早就停止官方维护了,安全性和兼容性都很差。新版MySQL cookbook支持更高版本的Ubuntu,趁这次升级的机会把服务器系统也升级到18.04或更高版本,一劳永逸解决系统兼容问题。
内容的提问来源于stack exchange,提问作者Daniel Ristic

