在 Ansible 中,我想从远程服务器 B 获取或复制 zip 文件到当前登录的远程服务器 A(两者都是 Linux 主机)。如下所示,我使用通配符(glob)指定源文件:
- hosts: server-A
become: yes
tasks:
- name: copy the zip files
fetch:
src: /tmp/data/*.zip
dest: /tmp/app/
flat: yes
register: zip_status
delegate_to: server-B
以下是我得到的错误;我也尝试过复制/同步模块,但它不起作用。实际上该文件存在于目标服务器-B
fatal: [server-B -> 10.98.68.222]: FAILED! => {
"changed": false,
"invocation": {
"module_args": {
"src": "/tmp/data/*.zip"
}
"msg": "file not found: /tmp/data/*.zip"
我试过蒂姆·肯尼迪的回答。如上所述,我首先登录到Server-A。如上面的代码所示,我委托给Server-B。我delegate_to: server-B
在下面添加了另一行。如上所述,我想将 .zip 文件从/tmp/data/
(服务器 B)复制到/tmp/app/
(服务器 A)。
- hosts: server-A
become: yes
tasks:
- name: find the zip files
find:
paths: "/tmp/data"
recurse: no
patterns: "*.zip"
register: zip_files
delegate_to: server-B
- name: copy the zip files
fetch:
src: "{{ item.path }}"
dest: "/tmp/app/"
flat: yes
with_items: "{{ zip_files.files }}"
register: zip_status
delegate_to: server-B
使用 find 模块,它可以正确显示文件,但使用 fetch 模块时出错,它试图/tmp/app/
在已经存在的情况下创建目录。完全许可到位。
fatal: [server-A]: FAILED! => {
"msg": "Unable to create local directories(/tmp/app/): [Errno 13] Permission denied: '/tmp'"
答案1
Fetch 不支持目录或通配符。文档非常清楚该字符串将被解释为文件名,并且仅是文件名。您可以使其与单独的查找过程提供的文件列表结合使用。
也许是这样的:
- hosts: server-A
become: yes
tasks:
- name: find the zip files
find:
paths: "/tmp/data"
recurse: no
patterns: "*.zip"
register: zip_files
- name: copy the zip files
fetch:
src: "{{ item.path }}"
dest: "/tmp/app/"
flat: yes
with_items: "{{ zip_files.files }}"
register: zip_status
delegate_to: server-B
我不完全确定这是否会按照我们想要的 delegate_to 方式工作,但它至少应该让您指向正确的方向。