Terraform Cloud中OVH实例local-exec执行Ansible遇公钥权限拒绝问题
问题原因
Ansible的--private-key参数要求传入私钥文件的路径,但你在local-exec中直接把Terraform变量里的私钥内容作为参数传递,导致Ansible将整个密钥文本当作文件路径去查找,自然找不到对应文件,触发Permission denied错误。而remote-exec的private_key参数本身支持直接传入密钥内容,所以可以正常连接。
解决方法
需要先将私钥内容写入一个临时文件,设置符合SSH要求的权限(600),再让Ansible使用这个临时文件作为私钥,执行完成后删除临时文件。修改后的local-exec代码如下:
provisioner "local-exec" { command = <<EOT # 将私钥写入临时文件并设置权限 echo '${var.pvt_key}' > /tmp/ansible_private_key && chmod 600 /tmp/ansible_private_key # 安装Ansible python3 -m pip install --no-input ansible # 执行Ansible playbook,使用临时私钥文件 ANSIBLE_HOST_KEY_CHECKING=False ansible-playbook -u ubuntu -i '${openstack_compute_instance_v2.test_instance.network[0].fixed_ip_v4},' --private-key=/tmp/ansible_private_key -e 'pub_key=${var.pub_key}' ansible/setup.yml # 删除临时私钥文件 rm -f /tmp/ansible_private_key EOT }
注意事项
- 临时文件路径选择
/tmp是因为Terraform Cloud Agent通常对该目录有写入权限,若环境特殊可调整为其他有权限的路径。 - 必须执行
chmod 600,SSH会拒绝权限过宽(如777)的私钥文件,这也是常见的连接失败原因之一。
内容的提问来源于stack exchange,提问作者Perpetual
相关产品推荐
相关产品推荐

