我正在尝试测试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
目录内容考虑到所有文件和删除目录。注意,src
和dest
的尾斜杠很重要。