Packer ansible-local无法获取Packer变量作为extra vars的求助
从你贴的执行日志能明显看到,nexus_username和nexus_password在ansible-playbook命令里是空值,这说明Packer的变量没有正确传递给ansible-local provisioner。我帮你梳理了问题所在和解决办法:
问题根源
你的Packer配置里,ansible-local的extra_arguments参数格式有问题:
你把整个--extra-vars的内容用单引号包裹后作为一个数组元素,Packer在解析时会把这整串当作一个完整参数传递,导致里面的{{user ...}}变量替换没有生效,最终传递给ansible的就是空值。
另外还有个小拼写问题:你命令行和变量里写的azure_tennant_id应该是azure_tenant_id(tenant的正确拼写是a结尾),虽然不影响当前变量传递,但可能导致Azure认证失败,建议顺便修正。
解决方案
修改ansible-local的extra_arguments配置,把--extra-vars和变量字符串拆分成两个独立的数组元素,这样Packer就能正确替换变量后传递给ansible:
修改后的Provisioner配置
"provisioners": [ { "type": "shell", "scripts": [ "../scripts/install_ansible.sh" ] }, { "type": "ansible-local", "playbook_dir": "../workstation-playbook", "playbook_file": "../workstation-playbook/provision.yml", "extra_arguments": [ "--extra-vars", "nexus_username={{user `ansible_nexus_user`}} nexus_password={{user `ansible_nexus_password`}}" ] }, { "execute_command": "chmod +x {{ .Path }}; {{ .Vars }} sudo -E sh '{{ .Path }}'", "inline": [ "/usr/sbin/waagent -force -deprovision+user && export HISTSIZE=0 && sync" ], "inline_shebang": "/bin/sh -x", "type": "shell" } ]
为什么这样改?
原来的写法把--extra-vars 'nexus_username={{user ...}}'作为一个参数,Packer不会解析单引号内部的变量;拆分后,--extra-vars是一个参数,后面的变量字符串是另一个参数,Packer会先替换掉{{user ...}}的内容,再把正确的参数传递给ansible-playbook。
验证变量映射
你的Packer变量定义是正确的:
"ansible_nexus_user": "{{env `nexus_user`}}", "ansible_nexus_password": "{{env `nexus_password`}}"
用-var nexus_user=****传入的变量会被正确映射到ansible_nexus_user,这部分不需要改动。
测试
重新运行你的Packer build命令,查看ansible-playbook的执行日志,应该能看到nexus_username和nexus_password已经被正确填充了。
内容的提问来源于stack exchange,提问作者sibh8

