You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Packer ansible-local无法获取Packer变量作为extra vars的求助

Fixing Nexus Variable Inheritance in Packer Ansible-Local Provisioner for Azure Images

从你贴的执行日志能明显看到,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:35:14