Ansible synchronize不复制文件



我正在尝试测试synchronize模块,以便从远程主机上的本地目录复制内容。

然而,同步似乎不会从本地目录复制文件。

我的环境是由两个虚拟机(控制器和目标)组成的,在centos 7上运行。

这是我的测试。yaml剧本:

- hosts: publisher
name: 'Test sync'
gather_facts: false
become: true
become_user: osboxes
become_method: su
tasks:
- name: sync
synchronize:
src: /home/osboxes/ansible/roles/deploy/files/application
dest: /opt/application
recursive: no
delegate_to: localhost

发布者目录的内容如下:

total 17220
drwxrwxr-x. 3 osboxes osboxes       83 Jun 14 07:10 .
drwxrwxr-x. 4 osboxes osboxes       40 Jun 14 04:33 ..
-rw-rw-r--. 1 osboxes osboxes       30 Jun 14 03:22 application.yml
drwxr-xr-x. 3 osboxes osboxes    12288 Jun 14 07:10 html
-rw-rw-r--. 1 osboxes osboxes      222 Jun 14 01:34 application.env
-rwxr-xr-x. 1 osboxes osboxes 17608703 Jun 14 01:34 application.jar

最后这是我的库存文件:

target ansible_host=10.0.2.7 ansible_connection=ssh ansible_user=osboxes ansible_ssh_pass='asdasd' ansible_become_password=asdasd 
localhost ansible_host=127.0.0.1 ansible_connection=ssh ansible_user=osboxes ansible_ssh_pass='osboxes.org' ansible_become_password='osboxes.org' 
[publisher]
target

通过运行这个剧本,我得到:

$ ansible-playbook test.yaml -i inventory.txt --diff 
PLAY [Test sync] *********************************************************************************************************************************************************************************************************************************************
TASK [sync] **************************************************************************************************************************************************************************************************************************************************
ok: [target -> localhost]
PLAY RECAP ***************************************************************************************************************************************************************************************************************************************************
target                    : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

但是在远程主机目录中没有文件正在被复制:

$ ansible target -m shell -a "ls -al /opt/*" -i inventory.txt 
target2 | CHANGED | rc=0 >>
/opt/application:
total 0
drwxrwxr-x. 2 osboxes osboxes  6 Jun 15 19:42 .
drwxr-xr-x. 4 osboxes root    33 Jun 15 19:42 ..
/opt/rh:
total 0
drwxr-xr-x. 2 root    root  6 Oct 30  2018 .
drwxr-xr-x. 4 osboxes root 33 Jun 15 19:42 .. 

从ansible doc,远程主机的预期结果应该是所有应用程序*文件被复制到远程路径/opt/application,除了html目录:

total 17220
drwxrwxr-x. 3 osboxes osboxes       83 Jun 14 07:10 .
drwxrwxr-x. 4 osboxes osboxes       40 Jun 14 04:33 ..
-rw-rw-r--. 1 osboxes osboxes       30 Jun 14 03:22 application.yml
-rw-rw-r--. 1 osboxes osboxes      222 Jun 14 01:34 application.env
-rwxr-xr-x. 1 osboxes osboxes 17608703 Jun 14 01:34 application.jar

目前,我发现使同步工作的唯一方法是在剧本中添加dirs: yes选项,但也复制html文件夹(我也尝试了recursive: no,但仍然复制html文件夹没有内部内容)。

提前感谢您的回复。

Update # 1

我尝试了rsync_opts与"-f'- */'"&"-f'+ *'"作为@Zeitounator建议,但收到语法错误:

$ ansible-playbook test.yaml -i inventory.txt -vvvvv
[omitted output]
TASK [sync] **************************************************************************************************************************************************************************************************************************************************
fatal: [target2]: FAILED! => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
}, 
"changed": false, 
"cmd": "sshpass -d8 /usr/bin/rsync --delay-updates -F --compress --archive --rsh=/usr/bin/ssh -S none -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -f'- */' -f'+ *' --out-format=<<CHANGED>>%i %n%L /home/osboxes/ansible/roles/deploy/files/application/ osboxes@10.0.2.7:/opt/application/", 
"invocation": {
"module_args": {
"_local_rsync_password": "VALUE_SPECIFIED_IN_NO_LOG_PARAMETER", 
"_local_rsync_path": "rsync", 
"_substitute_controller": false, 
"archive": true, 
"checksum": false, 
"compress": true, 
"copy_links": false, 
"delete": false, 
"dest": "osboxes@10.0.2.7:/opt/application/", 
"dest_port": null, 
"dirs": false, 
"existing_only": false, 
"group": null, 
"link_dest": null, 
"links": null, 
"mode": "push", 
"owner": null, 
"partial": false, 
"perms": null, 
"private_key": null, 
"recursive": null, 
"rsync_opts": [
"-f'- */'", 
"-f'+ *'"
], 
"rsync_path": null, 
"rsync_timeout": 0, 
"set_remote_user": true, 
"src": "/home/osboxes/ansible/roles/deploy/files/application/", 
"ssh_args": null, 
"times": null, 
"verify_host": false
}
}, 
"msg": "Unknown filter rule: `'- */''nrsync error: syntax or usage error (code 1) at exclude.c(927) [client=3.1.2]n", 
"rc": 1
}

但是,直接使用rsync命令与opts一起工作:

$ rsync -a -f'- */' -f'+ *' /home/osboxes/ansible/roles/deploy/files/application/ osboxes@10.0.2.7:/opt/application/ 

改编自另一个答案

- name: sync
synchronize:
src: /home/osboxes/ansible/roles/deploy/files/application/
dest: /opt/application/
archive: true
rsync_opts:
- "-f'- */'"
- "-f'+ *'"

这基本上使rsync推src目录内容考虑到所有文件和删除目录。注意,srcdest的尾斜杠很重要。

最新更新