使用copy模块和通配符

45次阅读
没有评论

问题描述

需要将主服务器上的数据库备份文件复制到备用服务器上。由于无法使用synchronize模块,用户按照以下方法进行操作:
1. 从主服务器将文件复制到本地ansible服务器,
2. 然后从本地复制到备用服务器。

每台机器上的备份文件名称都不同。例如:

TEST1.0.db2inst1.DBPART000.20190729162630.001
TEST3.0.db2inst1.DBPART000.20180729172631.002

用户使用的playbook如下所示:

- hosts: primary
  remote_user: root
  tasks:
    - name: copy backup to local file
      fetch: src={{item}} dest=/data1/backup
      with_fileglob: /data1/{{dbname}}.0.db2inst1.*
  tags: transfer

- hosts: standby
  remote_user: root
  tasks:
    - name: copy backup to standby
      copy: src={{item}} dest=/data1 mode=0755 owner=db2inst1
      with_fileglob: /data1/backup/{{dbname}}.0.db2inst1.*
  tags: transfer

然而,这个方法不起作用,输出如下:

primary  : ok=1    changed=0    unreachable=0    failed=0    skipped=1    rescued=0
standby  : ok=1    changed=0    unreachable=0    failed=0    skipped=1    rescued=0

用户认为文件名有问题,请问应该怎么办?

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

with_fileglob使用fileglob查找插件创建了一个循环。与其他查找插件一样,它在控制器机器上运行,而不是在远程服务器上运行。

由于你可能没有在控制器上的路径中引用的备份文件,所以你的循环是空的。

正如你所猜测的,这种方法对你的场景不起作用。我建议你查看find模块,以创建从主服务器获取文件的列表。

方案2

任何with_*实际上都是本地查找。

所以,正如Zeitounator提到的,你需要使用类似find模块来获取你想要的文件。

所以,我想这样的方法应该可以工作:

- hosts: primary
  remote_user: root
  tasks:
    - name: gather list of files to fetch
      find:
        paths: "/data1/"
        recurse: no
        patterns: "{{ dbname }}.0.db2inst1.*"
        use_regex: no
      register: db_backup_src
    - name: fetch backups to local disk
      fetch:
        src: "{{ item['path'] }}"
        dest: /data1/backup/
        flat: yes
      loop: "{{ db_backup_src['files'] }}"

- hosts: standby
  remote_user: root
  tasks:
    - name: copy backup to standby
      copy:
        src: "{{ item }}"
        dest: /data1
        mode: 0755
        owner: db2inst1
      with_fileglob:
        - "/data1/backup/{{dbname}}.0.db2inst1.*"

以上示例中,我们首先使用find模块获取要从主服务器获取的文件列表,并将其注册为db_backup_src。然后,使用循环将备份文件从主服务器复制到本地磁盘。最后,使用with_fileglob将备份文件从本地复制到备用服务器。

希望这些解决方案对你有帮助!

正文完