如何通过Ansible Playbook解压多分段tar.gz文件?
如何用Ansible Playbook解压多分段tar.gz文件
我在Red Hat Linux 7.9的主目录下有以下两个分卷归档文件:
mydir.tar.gz.aa mydir.tar.gz.ab
直接用Shell命令可以成功解压:
cat mydir.tar.gz.* | tar xzf -
这个多分段归档是通过以下命令生成的:
tar czf - * | split --bytes=5MB - mydir.tar.gz.
我尝试了几种Ansible Playbook写法,但都无效:
尝试1:用unarchive模块加通配符
--- - name: untar the multipart tar file hosts: localhost tasks: - name: untar ansible.builtin.unarchive: src: /home/McFly/mydir.tar.gz.a* dest: /home/McFly/ become: yes become_user: root ...
尝试2:用unarchive模块指定单个分卷文件
--- - name: untar the multipart tar file hosts: localhost tasks: - name: untar ansible.builtin.unarchive: src: /home/McFly/mydir.tar.gz.aa dest: /home/McFly/ become: yes become_user: root ...
尝试3:用shell模块执行解压命令
--- - name: untar the multipart tar file hosts: localhost tasks: - name: untar ansible.builtin.shell: cat mydir.tar.gz.* | tar xzf - args: chdir: /home/McFly/ executable: /bin/bash become: yes become_user: root ...
问题原因分析
- unarchive模块的局限性:unarchive仅支持处理单个归档文件,既不能通过通配符匹配多个分卷文件,也无法自动合并分卷,因此前两种写法必然失败。
- 第三种shell写法的可能问题:
- 切换为root用户后,
/home/McFly/目录的权限可能限制root访问; - 未指定tar命令的绝对路径,可能在root的环境变量PATH中找不到正确的执行文件;
- 若目录下存在其他匹配
mydir.tar.gz.a*的文件,可能导致合并顺序出错。
- 切换为root用户后,
正确的Ansible Playbook写法
方案1:以root身份执行(需确保目录权限允许)
直接用绝对路径指定分卷文件和tar命令,避免环境变量和权限问题:
--- - name: 解压多分段tar.gz文件 hosts: localhost tasks: - name: 合并并解压分卷归档 ansible.builtin.shell: cat /home/McFly/mydir.tar.gz.a* | /bin/tar xzf - -C /home/McFly/ become: yes become_user: root
方案2:以McFly用户身份执行(无需root权限)
如果文件和目录权限允许当前用户操作,可去掉become相关配置,直接在目标目录执行命令:
--- - name: 解压多分段tar.gz文件 hosts: localhost tasks: - name: 合并并解压分卷归档 ansible.builtin.shell: cat mydir.tar.gz.* | /bin/tar xzf - args: chdir: /home/McFly/
额外注意事项
- 确保分卷文件命名顺序正确(aa、ab、ac...),
split生成的文件默认按此顺序,cat mydir.tar.gz.a*会按字母顺序读取,不会出错; - 若担心通配符匹配异常,可明确指定分卷文件:
cat mydir.tar.gz.aa mydir.tar.gz.ab; - 如需保留原文件权限,可在tar命令中添加
-p参数:tar xzfp -。
内容的提问来源于stack exchange,提问作者McFly
相关产品推荐
相关产品推荐

