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
相关产品推荐
相关产品推荐

