Knife未正确读取knife.rb配置:连接localhost及SSL/ cookbook问题求助
看起来你的Knife确实没正确加载指定knife.rb里的chef_server_url配置,这大概率是配置优先级冲突或者路径相关的隐性问题导致的,我来帮你一步步排查解决:
1. 先确认当前生效的配置
首先你得搞清楚Knife实际在用的chef_server_url是什么,执行这个命令就能看到:
knife configure show chef_server_url
如果输出是https://localhost:443/...这类指向本地的地址,说明你的knife.rb配置被其他优先级更高的配置覆盖了。
Knife的配置加载优先级是这样的(后面的会覆盖前面的):
- 命令行传入的参数(比如
--chef-server-url) - 系统环境变量
CHEF_SERVER_URL - 当前工作目录下的
.chef/knife.rb - 用户主目录(
C:\Users\wdavis\)下的.chef/knife.rb - 系统级全局配置(很少用到)
你可以先检查环境变量是否被设置了:
echo $env:CHEF_SERVER_URL
如果有输出内容,那就是这个环境变量覆盖了你的knife.rb配置,删掉它就好。
2. 验证knife.rb的语法正确性
有时候配置文件里的小语法错误(比如引号没配对、多余的符号)会导致Knife直接跳过加载这个文件。你可以用Ruby来验证语法:
ruby -c C:\users\wdavis\learn-chef\.chef\knife.rb
如果输出Syntax OK,说明语法没问题;如果有报错,按照提示修正对应的语法错误即可。
3. 确认工作目录与配置文件路径匹配
Knife默认会加载当前执行命令所在目录下的.chef/knife.rb。如果你执行knife ssl fetch时,不在C:\users\wdavis\learn-chef\这个目录里,Knife就会去加载其他路径的配置(比如用户主目录下的)。
你可以手动指定配置文件路径来验证:
knife ssl fetch -c C:\users\wdavis\learn-chef\.chef\knife.rb
如果这个命令能正常拉取证书,那就是工作目录的问题。以后执行Knife命令时,要么先切换到learn-chef目录,要么每次都用-c参数指定你的目标knife.rb路径。
4. 关于上传cookbook提示找不到的问题
这个问题和上面的配置问题是同源的:当Knife连接的是localhost的Chef Server(而非你的synchef.url.com),它会去本地Chef Server的仓库找cookbook,自然找不到你本地的文件。解决了chef_server_url的配置问题后,这个问题应该也会随之解决。
另外,上传时如果cookbook不在当前工作目录,记得用-o参数指定本地cookbook的存放路径,比如:
knife cookbook upload my_cookbook -o C:\path\to\your\cookbooks -c C:\users\wdavis\learn-chef\.chef\knife.rb
内容的提问来源于stack exchange,提问作者Wjdavis5

