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

Packer结合Azure Builder使用Ansible-local将本地文件复制至临时构建VM的问题求助

解决Packer + Ansible-Local中本地文件复制到临时VM的问题

我来帮你搞定这个问题——你遇到的核心问题是对Packer的ansible-local provisioner工作模式的理解有点偏差,咱们一步步理清楚:

问题根源

ansible-local的工作逻辑是:Packer会把你的playbook文件复制到临时VM内部,然后在VM本地启动Ansible执行playbook。这时候Ansible的「控制节点」就是这个临时VM本身,而不是你运行Packer的本地机器。所以你在playbook里写src: /tmp/script.sh时,Ansible会去临时VM的/tmp目录找文件,而不是你本地机器的/tmp,自然就出现找不到文件的错误了。

解决方案

要把本地机器的文件传到临时VM,你需要先用Packer的file provisioner完成文件传输,之后再用Ansible处理。

步骤1:更新Packer的Provisioners配置

在shell provisioner之后、ansible-local之前,添加一个file provisioner,把本地的/tmp/script.sh传到临时VM的/tmp目录:

"provisioners": [
  {
    "execute_command": "chmod +x {{ .Path }}; {{ .Vars }} sudo -E sh '{{ .Path }}'",
    "inline": [
      "sudo yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-$(rpm -E '%{rhel}').noarch.rpm",
      "sudo yum -y install ansible"
    ],
    "inline_shebang": "/bin/sh -x",
    "type": "shell"
  },
  // 新增file provisioner:先把本地文件传到临时VM
  {
    "type": "file",
    "source": "/tmp/script.sh",
    "destination": "/tmp/script.sh"
  },
  {
    "type": "ansible-local",
    "playbook_file": "/tmp/app.yml"
  }
]

步骤2:修改Ansible Playbook

文件已经通过Packer传到临时VM的/tmp目录了,你可以直接在playbook里使用这个文件。简化后的app.yml如下:

- hosts: localhost
  tasks:
    - name: 给脚本添加执行权限
      ansible.builtin.file:
        path: /tmp/script.sh
        mode: '0755'
    - name: 执行脚本
      ansible.builtin.script: /tmp/script.sh
    - name: 验证脚本存在
      ansible.builtin.command: ls /tmp/script.sh

额外场景:如果需要复制到其他目录

如果你需要把VM里的脚本复制到其他路径(比如从/tmp到/opt),可以用copy模块并加上remote_src: yes参数,告诉Ansible源文件在当前VM上:

- name: 复制脚本到/opt目录
  ansible.builtin.copy:
    src: /tmp/script.sh
    dest: /opt/script.sh
    remote_src: yes
    mode: '0755'

这样就能彻底解决文件找不到的问题了,核心思路就是先通过Packer完成本地到VM的文件传输,再让Ansible操作VM上的文件。

内容的提问来源于stack exchange,提问作者Uday Kiran

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 22:57:30