问题描述
需要将主服务器上的数据库备份文件复制到备用服务器上。由于无法使用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
将备份文件从本地复制到备用服务器。
希望这些解决方案对你有帮助!
正文完