Ansible在堡垒机创建tar失败,添加delegate_to: localhost生效,疑问原因及含义
问题背景
我需要在堡垒机(bastion)上创建tar包,但遇到问题:
原Ansible archive任务无法生成tar包:
- name: Create my pza_project tar archive: path: "\/home/ansible/delivery/qpm" dest: "\/tmp/pza_project.tar" format: "tar"
对应的执行日志:
TASK [Create my pza_project tar] **************************
task path: /home/ansible/delivery/pza_playbook.yml:141
ok: [X.XXX.XXX.XX] => {"archived": [], "arcroot": "/home/ansible/delivery/qpm/", "changed": false, "dest": "/tmp/pza_project.tar", "expanded_exclude_paths": [], "expanded_paths": ["/home/ansible/delivery/qpm/"], "missing": ["/home/ansible/delivery/qpm/"], "state": "absent"}
添加delegate_to: localhost和become: false后任务成功:
- name: Create my pza_project tar archive: path: "\/home/ansible/delivery/qpm" dest: "\/tmp/pza_project.tar" format: "tar" delegate_to: localhost become: false
已知qpm目录已通过GitLab流水线复制到堡垒机的/home/ansible/delivery路径下,确认该目录存在于堡垒机中。
疑问解答
1. 默认情况下,archive任务的path字段是否指向inventory中配置的服务器,而非堡垒机?
是的。Ansible默认会将任务下发到inventory里指定的目标主机执行,而非运行playbook的堡垒机。原任务日志里的ok: [X.XXX.XXX.XX]说明任务是在这台目标主机上执行的,它会去该主机的/home/ansible/delivery/qpm路径查找目录——但这个目录只存在于堡垒机,所以日志会提示missing: ["\/home/ansible/delivery/qpm/"],无法生成tar包。
2. 若要使用堡垒机上的文件创建tar包,必须添加delegate_to: localhost吗?此操作是否正确?
这个操作是正确的,也是最直接的方式,但不是唯一方式:
- 添加
delegate_to: localhost会强制任务在**运行playbook的机器(即堡垒机)**上执行,此时任务读取的是堡垒机本地的/home/ansible/delivery/qpm目录,自然能成功打包。 - 你也可以将
delegate_to指定为堡垒机的主机名,但如果堡垒机就是运行playbook的机器,用localhost完全没问题。
3. localhost是否代表堡垒机?
是的。当你在堡垒机上直接运行Ansible playbook时,localhost就指代运行该playbook的堡垒机本身。此时任务被委派到localhost执行,就是在堡垒机上处理本地文件。
内容的提问来源于stack exchange,提问作者Amasta

