如何通过HEAT模板实现VM间SSH密钥交换(不限于控制节点与VM)
嘿,我来帮你搞定VM之间无密码SSH的问题!既然你已经搞定了控制节点到VM的无密码访问,那VM之间的配置思路其实很相似——核心就是让所有VM共享同一套密钥对,这样每个VM都能凭私钥直接登录其他VM。下面给你两种方案,按需选择:
方案一:通过Heat模板自动配置(推荐,适合新创建堆栈)
如果还没创建堆栈,或者愿意重新部署,直接在Heat模板里配置,让VM创建后自动具备互访权限,一步到位:
确保模板已指定密钥对
你已经在参数里加了key_name: my-key-pair,这一步没问题,它会自动把该密钥对的公钥写入每个VM的/home/user/.ssh/authorized_keys。添加user_data注入私钥
在你的OS::Nova::Server资源定义中,加入user_data段,把控制节点上的私钥(/root/my-key-pair.pem)复制到VM的用户目录下,同时设置正确权限:resources: vm_instance: type: OS::Nova::Server properties: # 其他配置(镜像、 flavor、网络等) key_name: { get_param: key_name } user_data: | #!/bin/bash # 创建.ssh目录(如果不存在) mkdir -p /home/user/.ssh # 写入控制节点的私钥内容(替换成你实际的私钥文本) cat > /home/user/.ssh/id_rsa << EOF -----BEGIN RSA PRIVATE KEY----- 这里粘贴/root/my-key-pair.pem里的完整私钥内容 -----END RSA PRIVATE KEY----- EOF # 设置安全权限(必须是600,否则SSH会拒绝) chmod 600 /home/user/.ssh/id_rsa chown user:user /home/user/.ssh/id_rsa注意:私钥明文写在模板里不够安全,你也可以把私钥作为Heat参数传入,或者用
OS::Nova::KeyPair资源自动生成新的密钥对,避免硬编码。部署堆栈
重新创建堆栈后,所有VM都会自动拥有私钥,直接就能无密码SSH到其他VM了。
方案二:手动配置(适合已创建好的VM)
如果不想重新部署堆栈,手动操作也很简单:
从控制节点登录到任意一台VM(比如VM1)
ssh -i /root/my-key-pair.pem user@vm1-ip复制控制节点的私钥到VM1
在VM1里执行命令,把控制节点的私钥复制过来:scp -i /home/user/.ssh/id_rsa root@控制节点IP:/root/my-key-pair.pem /home/user/.ssh/id_rsa(如果scp提示权限问题,也可以直接在VM1里手动创建
id_rsa文件,把控制节点的私钥内容粘贴进去)设置私钥权限
必须把私钥权限改成600,否则SSH会报错:chmod 600 /home/user/.ssh/id_rsa chown user:user /home/user/.ssh/id_rsa测试VM间访问
现在从VM1直接SSH到其他VM就行:ssh user@vm2-ip不需要指定私钥,因为SSH会自动用
~/.ssh/id_rsa。
关键注意事项
- 确保所有VM的SSH用户一致(比如你用的
user),如果用户不同,要调整文件路径和权限。 - 检查安全组规则:允许VM所在子网内的22端口入站流量,否则VM之间连不上SSH。
- 私钥权限必须是
600,目录权限是700,这是SSH的硬性要求。
内容的提问来源于stack exchange,提问作者Subeesh KK

