Terraform调用Ansible时SSH代理转发失效无法访问Git仓库问题求助
根因
SSH Agent转发依赖SSH_AUTH_SOCK环境变量定位本地ssh-agent的套接字路径,手动执行Ansible命令时当前shell会自动加载该变量,但Terraform的local-exec provisioner默认不会继承父shell的环境变量,导致Ansible无法识别已加载密钥的ssh-agent。
解决方法
方法1:在local-exec中显式传递SSH_AUTH_SOCK环境变量
修改你的Terraform provisioner配置,添加environment块传入SSH_AUTH_SOCK:
provisioner "local-exec" { command = <<-EOT cd ../systems/ac/ansible/ # 可先加下面这行验证是否能正常识别密钥,验证通过后可删除 ssh-add -l ansible-playbook playbooks/install/ac/playbooks/preinstall.yml --inventory=../../ansible/ansible-local-environment/inventory/${var.domain}/${var.system}.${var.domain} EOT # 新增以下环境变量配置 environment = { SSH_AUTH_SOCK = pathexpand(env.SSH_AUTH_SOCK) } }
方法2:执行Terraform时保留环境变量
如果你使用sudo运行Terraform,sudo默认会清空敏感环境变量,需要加-E参数保留环境:
sudo -E terraform apply
额外检查项
- 确认你的Ansible playbook中如果使用了
become: yes提权,当前你配置的suodo_flags=-HE已经可以保留SSH_AUTH_SOCK变量到提权后的环境,无需额外修改 - 如果仍有问题,可以在远程主机的
/etc/ssh/sshd_config中确认存在AcceptEnv SSH_AUTH_SOCK配置,允许接收客户端传递的SSH代理套接字变量
内容的提问来源于stack exchange,提问作者onev
相关产品推荐
相关产品推荐

