如何通过Ansible的ansible.builtin.unarchive模块获取解压目录路径
解决Ansible unarchive模块无法获取完整解压目录路径的问题
你的核心问题是未正确拼接解压后的完整目录路径,且copy模块缺少必要参数导致无法正确复制远程节点上的目录。以下是修正后的Playbook及关键说明:
修正后的Playbook代码
--- # tasks file for upgrade-sabnzbd - name: Get URL of latest sabnzbd ansible.builtin.uri: url: https://api.github.com/repos/sabnzbd/sabnzbd/releases/latest body_format: json return_content: true remote_src: yes register: json_response - name: Create fact URL called "download_url" ansible.builtin.set_fact: download_url: "{{ (json_response.json.assets | selectattr('browser_download_url', 'search', 'src.tar.gz') | list | first).browser_download_url }}" - name: Download sabnzbd tarball ansible.builtin.get_url: url: "{{ download_url }}" dest: /tmp register: sabnzbd_tarball - name: Unarchive sabnzbd tarball ansible.builtin.unarchive: src: "{{ sabnzbd_tarball.dest }}" dest: /tmp list_files: yes register: sabnzbd_dir - name: Set fact for full extracted directory path ansible.builtin.set_fact: sabnzbd_extracted_fullpath: "{{ sabnzbd_dir.dest }}/{{ sabnzbd_dir.files[0].split('/')[0] }}" - name: Print full extracted directory path debug: msg: "{{ sabnzbd_extracted_fullpath }}" - name: Remove existing sabnzbd directory (optional, for clean replacement) ansible.builtin.file: path: /opt/sabnzbd state: absent - name: Copy new folder to target location ansible.builtin.copy: src: "{{ sabnzbd_extracted_fullpath }}/" dest: /opt/sabnzbd owner: "{{ media_user }}" group: "{{ media_user }}" remote_src: yes - name: Restart sabnzbd service ansible.builtin.service: name: sabnzbd state: restarted
关键修改说明
构建完整解压路径
通过set_fact将unarchive模块的目标目录(sabnzbd_dir.dest)与解压后的顶层目录名拼接,得到完整路径{{ sabnzbd_dir.dest }}/{{ sabnzbd_dir.files[0].split('/')[0] }},避免硬编码路径。修复
copy模块参数- 添加
remote_src: yes:解压后的目录位于远程节点的/tmp下,而非控制节点,必须声明该参数让Ansible从远程节点读取源路径。 src结尾添加/:表示复制目录内的所有内容到目标目录,而非复制目录本身,符合替换现有服务目录的需求。
- 添加
可选的目录清理
增加file模块删除旧的/opt/sabnzbd目录,确保新内容完全替换旧文件,避免残留文件导致服务异常。
内容的提问来源于stack exchange,提问作者eekfonky
相关产品推荐
相关产品推荐

