使用 Ansible 归档单个文件夹下的多个文件夹

Posted

技术标签:

【中文标题】使用 Ansible 归档单个文件夹下的多个文件夹【英文标题】:Archive multiple folders under a single folder using Ansible 【发布时间】:2020-07-14 14:56:37 【问题描述】:

我正在使用下面的 ansible-playbook 代码来归档 IBM 文件夹下的多个文件夹。

下面是我的绝对路径目录结构:

/app
   |-- /IBM
          |--/test
          |--/log
          |--/common
          |--/api
          |--/<unknown folders>

IBM folder 下的文件夹和文件的数量未知,因此似乎不可能在 exclude_path 属性下指定 IBM 下的所有文件/文件夹。

我希望构建一个只有 IBM 文件夹的存档 (gz),其中仅包含两个文件夹,即 commonapi 文件夹,而忽略其余的文件夹和文件。

因此,我编写了以下剧本:

- name: Creating the archive
  archive:
    path: 
    - /was/IBM/common
    - /was/IBM/api
    dest: /var/backup/mysetup.tar.gz
    exclude_path:
    - /was/IBM/common/log
    - /was/IBM/api/tmp
    format: gz

这给了我存档文件mysetup.tar.gz

我希望mysetup.tar.gz 文件有一个名为 IBM 的文件夹,其中应该有两个文件夹 commonapi。因此,无论IBM 文件夹下还有哪些其他文件,我都希望 mysetup.tar.gz 中包含以下内容。

IBM
  |--/common
  |--/api

但是,mysetup.tar.gz 没有IBM 文件夹,但有commonapi 文件夹。

我不具体,因此我的问题没有在这里得到回答:How to archive multiple folders under one folder using Ansible

您能否指导我如何获取存档以将 IBM 文件夹中的两个文件夹都放在 mysetup.tar.gz 中?

【问题讨论】:

【参考方案1】:

使用archive 模块无法直接实现您的要求。下面列出了两个具体原因:

    如果您指定path,比如/app/IBM,那么压缩文件的内容将具有IBM 之后的路径,例如common/api/。要将 IBM 作为 tar.gz 文件中的根目录,您需要将 path 指定为 /app。这就引出了关于exclude_path 用法的下一点。 exclude_path 无法正常工作。比如说,如果path 被定义为/app 并且您想排除/app/IBM/test,这将不起作用。 exclude_path 仅适用于定义的 path(带通配符)的直接子文件夹/文件,这意味着如果 path 定义为 /app/IBM/*,则排除 /app/IBM/test 将起作用,但这不是预期的并带回上一点。已有关于此主题的 issue reported。

因此,您最好使用命令/shell 模块使用常规 tar 命令。

【讨论】:

感谢您的解释,但我希望更新存档模块以帮助满足要求。

以上是关于使用 Ansible 归档单个文件夹下的多个文件夹的主要内容,如果未能解决你的问题,请参考以下文章

note-ansible 视频笔记

用于取消归档的 ansible 本地文件路径

linux文件归档压缩与上传下载

如何轻松归档文件?2种方法轻松创建归档文件!

不同系统之间的文件传输

tar 命令