Test Kitchen拉取私有Bitbucket仓库时kitchen converge失败
我之前也碰到过一模一样的情况——手动登录root能克隆,但kitchen converge就是失败,核心原因大多是Chef运行时的环境和你手动操作的root环境不一致,或者配方里有细节没处理到位。下面是几个排查和解决的方向:
1. 检查私钥文件的权限
SSH对私钥的权限要求特别严格,必须是0600(只有所有者可读可写),否则会直接拒绝使用。你配方里创建.ssh目录设了0700没问题,但生成id_rsa的模板资源有没有设置正确权限?
修改你的template资源,补上mode属性:
template '/root/.ssh/id_rsa' do source 'id_rsa.erb' owner 'root' group 'root' mode '0600' # 这行必须加,不然SSH不认这个私钥 action :create end
2. 提前把Bitbucket加入known_hosts
手动登录时,第一次克隆SSH会弹出确认主机密钥的提示,你确认后密钥就存在known_hosts里了,但Chef运行是非交互式的,不会弹出提示,直接就失败了。
解决办法是在配方里提前把Bitbucket的主机密钥写入known_hosts,可以用Chef自带的ssh_known_hosts资源:
ssh_known_hosts 'bitbucket.org' do host_name 'bitbucket.org' key_type 'ssh-rsa' key 'AAAAB3NzaC1yc2EAAAABIwAAAQEAubiN81eDcafrgMeLzaFPsw2kNvEcqTKl/VqLat/MaB33pZy0y3rJZtnqwR2qOOvbwKZYKiEO1O6VqNEBxKvJJelCq0dTXWT5pbO2gDXC6h6QDXCaHo6pOHGPUy+YBaGQRGuSusMEASYiWunYN0vCAI8QaXnWMXNMdFP3jHAJH0eDsoiGnLPBlBp4TNm6rYI74nMzgz3B9IikW4WVK+dc8KZJZWYjAuORU3jc1c/NPskD2ASinf8v3xnfXeukU0sJ5N6m5E8VLjObPEO+mN2t/FZTMZLiFqPWc/ALSqnMnnhwrNi2rbfg/rd/IpL8Le3pSBne8+seeFVBoGqzHM9yXw==' user 'root' end
嫌麻烦的话也可以用execute命令快速添加:
execute 'add_bitbucket_to_known_hosts' do command 'ssh-keyscan bitbucket.org >> /root/.ssh/known_hosts' user 'root' not_if 'grep -q bitbucket.org /root/.ssh/known_hosts' # 避免重复添加 end
3. 确保Git克隆在正确的环境下执行
Chef运行execute资源时,有时候HOME环境变量可能不是/root,导致SSH找不到/root/.ssh下的密钥。所以执行git克隆时,要显式指定用户和HOME环境:
execute 'clone_private_repo' do command 'git clone git@bitbucket.org:your-username/your-repo.git /path/to/target/dir' user 'root' environment({ 'HOME' => '/root' }) # 关键,让SSH定位到root的密钥文件 not_if { ::File.directory?('/path/to/target/dir') } # 避免重复克隆 end
4. 验证模板生成的私钥内容是否正确
有时候模板渲染会出问题,比如私钥里的换行符被吃掉、或者多了多余的空格。你可以在converge失败后,用kitchen login登录实例,检查/root/.ssh/id_rsa的内容,和你手动使用的私钥对比,确保完全一致。
5. 检查私钥是否设置了密码短语
如果你的Bitbucket私钥有密码(passphrase),手动克隆时你输入了密码,但Chef运行是非交互式的,无法输入密码,自然克隆失败。这种情况要么换成无密码的私钥,要么在配方里用ssh-agent加载密钥(后者稍复杂,推荐先用无密码密钥测试)。
内容的提问来源于stack exchange,提问作者ryekayo

