如何使用Ansible将.zip文件拷贝到Windows目标主机指定目录并解压
Ansible官方提供了全链路的内置模块可以实现这个需求,全程不需要额外写自定义脚本,以下是具体实现方案:
用到的核心模块
所有模块均为官方内置,Ansible 2.10及以上版本默认预装ansible.windows集合,无需额外安装依赖:
fetch:将源服务器的文件拉取到Ansible控制节点本地win_copy:专门用于向Windows主机传输文件,兼容性优于通用copy模块win_unzip:原生支持Windows环境下的zip格式解压,无需额外安装解压工具
前提条件
- 已配置好Windows目标主机的WinRM连接权限,且主机已加入Ansible inventory清单
- 存放zip的源服务器已加入Ansible inventory清单,且有对应文件的读取权限
- Windows目标主机的目标目录配置了读写权限
完整Playbook示例(需要控制节点中转)
适合源服务器和Windows目标主机网络不可直接互通的场景:
--- - name: 跨服务器拉取zip并传输到Windows主机解压 hosts: windows_servers # 替换为你inventory中Windows主机的组名/主机名 gather_facts: yes vars: # 替换为源服务器上zip文件的绝对路径 src_zip_path: "/data/packages/app_v1.0.zip" # 替换为Ansible控制节点临时存放路径 local_temp_path: "/tmp/ansible_transfer/" # 替换为Windows目标主机存放zip的路径 win_zip_path: "C:\\Temp\\app_v1.0.zip" # 替换为Windows目标主机解压后的存放路径 win_unzip_dest: "C:\\Program Files\\MyApp" # 替换为源服务器在Ansible inventory中的主机名 source_server: "package_server_01" tasks: - name: 从源服务器拉取zip包到Ansible控制节点 ansible.builtin.fetch: src: "{{ src_zip_path }}" dest: "{{ local_temp_path }}" flat: yes delegate_to: "{{ source_server }}" - name: 传输zip包到Windows目标主机指定目录 ansible.windows.win_copy: src: "{{ local_temp_path }}{{ src_zip_path | basename }}" dest: "{{ win_zip_path }}" - name: 解压zip包到目标目录 ansible.windows.win_unzip: src: "{{ win_zip_path }}" dest: "{{ win_unzip_dest }}" # 若需要解压完成后自动删除原zip包,将下面参数改为yes delete_archive: no - name: 清理Ansible控制节点的临时压缩包 ansible.builtin.file: path: "{{ local_temp_path }}{{ src_zip_path | basename }}" state: absent delegate_to: localhost run_once: true
简化方案(网络互通场景)
如果Windows目标主机可以直接访问源服务器的HTTP/SMB共享服务,可省去控制节点中转步骤,两步完成操作:
--- - name: 直接从源地址拉取zip并解压到Windows主机 hosts: windows_servers gather_facts: yes vars: # 替换为zip包的可访问地址,支持http/https/smb协议 zip_source_url: "http://192.168.1.100/packages/app_v1.0.zip" win_zip_path: "C:\\Temp\\app_v1.0.zip" win_unzip_dest: "C:\\Program Files\\MyApp" tasks: - name: 直接拉取zip包到Windows本地 ansible.windows.win_get_url: url: "{{ zip_source_url }}" dest: "{{ win_zip_path }}" - name: 解压zip包 ansible.windows.win_unzip: src: "{{ win_zip_path }}" dest: "{{ win_unzip_dest }}" delete_archive: no
内容的提问来源于stack exchange,提问作者Kelvin A. Vasquez
相关产品推荐
相关产品推荐

