将本地目录复制到具有相同目录名的远程主机
Copying local directories to remote hosts with the same directory name
我有三个具有以下结构的本地目录:
$ tree .
|_ inventory
|_ deploy.yml
|_ key
|_ node1
| |_ ... # several files, like id_rsa.pub etc
|_ node2
| |_ ... # several files, like id_rsa.pub etc
|_ node3
|_ ... # several files, like id_rsa.pub etc
我的库存文件在下面:
[remote_cluster]
node1 ansible_host=192.168.100.100
node2 ansible_host=192.168.100.101
node3 ansible_host=192.168.100.102
我想做的是将目录从我的本地机器复制到主机名与目录名相同的远程机器,例如,将 node1
复制到名为 node1
的远程机器.我真的不想硬编码此功能,因为 remote_cluster 节点的数量并不总是三个。未来可能会增加或减少。
我用谷歌搜索了一些例子,但没有一个符合我的目标。而且我也做了一些尝试,也没有成功:
- hosts: remote_cluster
name: copy local directories to related nodes
gather_facts: False
tasks:
- name: copy task
ansible.builtin.copy:
src: '{{ item.src }}'
dest: '{{ item.dest }}'
with_items:
- { src: 'key/{{hostvar}}/', dest: '~/.ssh/'}
tags:
- copy
在我看来,ansible 可能能够通过一些变量或其他东西来识别哪个远程主机当前正在执行任务。但是我没有弄清楚这个神奇变量的名字是什么。为了清楚起见,我暂时将该变量名称替换为 hostvar
.
有人能帮忙吗?提前致谢!
你理解错了。您的游戏已经在您组中的每台机器上循环播放。你不需要在这里循环(除非你只想要你的源目录中的文件子集)。
copy
模块能够复制整棵树,但如果文件很多,性能会很差。如果是这样,请查看更适合的 syncrhonize
module。
我的感觉是你缺少一些关于你可以在游戏中使用的内部 ansible 变量的知识。作为第一个介绍,我建议您阅读 the documentation section on magic variables。我将在下面使用的(如@JBone 评论中已报告的那样)是 inventory_hostname
这是你的固定剧本(根据我的理解和未经测试)。请注意 src:
值中的结尾 /
并阅读 corresponding description in the documentation
If path is a directory, it is copied recursively. In this case, if path ends with "/", only inside contents of that directory are copied to destination. Otherwise, if it does not end with "/", the directory itself with all contents is copied.
---
- hosts: remote_cluster
name: copy local directories to related nodes
gather_facts: false
tasks:
- name: copy task
ansible.builtin.copy:
src: 'key/{{ inventory_hostname }}/'
dest: '~/.ssh/'
tags:
- copy
我有三个具有以下结构的本地目录:
$ tree .
|_ inventory
|_ deploy.yml
|_ key
|_ node1
| |_ ... # several files, like id_rsa.pub etc
|_ node2
| |_ ... # several files, like id_rsa.pub etc
|_ node3
|_ ... # several files, like id_rsa.pub etc
我的库存文件在下面:
[remote_cluster]
node1 ansible_host=192.168.100.100
node2 ansible_host=192.168.100.101
node3 ansible_host=192.168.100.102
我想做的是将目录从我的本地机器复制到主机名与目录名相同的远程机器,例如,将 node1
复制到名为 node1
的远程机器.我真的不想硬编码此功能,因为 remote_cluster 节点的数量并不总是三个。未来可能会增加或减少。
我用谷歌搜索了一些例子,但没有一个符合我的目标。而且我也做了一些尝试,也没有成功:
- hosts: remote_cluster
name: copy local directories to related nodes
gather_facts: False
tasks:
- name: copy task
ansible.builtin.copy:
src: '{{ item.src }}'
dest: '{{ item.dest }}'
with_items:
- { src: 'key/{{hostvar}}/', dest: '~/.ssh/'}
tags:
- copy
在我看来,ansible 可能能够通过一些变量或其他东西来识别哪个远程主机当前正在执行任务。但是我没有弄清楚这个神奇变量的名字是什么。为了清楚起见,我暂时将该变量名称替换为 hostvar
.
有人能帮忙吗?提前致谢!
你理解错了。您的游戏已经在您组中的每台机器上循环播放。你不需要在这里循环(除非你只想要你的源目录中的文件子集)。
copy
模块能够复制整棵树,但如果文件很多,性能会很差。如果是这样,请查看更适合的 syncrhonize
module。
我的感觉是你缺少一些关于你可以在游戏中使用的内部 ansible 变量的知识。作为第一个介绍,我建议您阅读 the documentation section on magic variables。我将在下面使用的(如@JBone 评论中已报告的那样)是 inventory_hostname
这是你的固定剧本(根据我的理解和未经测试)。请注意 src:
值中的结尾 /
并阅读 corresponding description in the documentation
If path is a directory, it is copied recursively. In this case, if path ends with "/", only inside contents of that directory are copied to destination. Otherwise, if it does not end with "/", the directory itself with all contents is copied.
---
- hosts: remote_cluster
name: copy local directories to related nodes
gather_facts: false
tasks:
- name: copy task
ansible.builtin.copy:
src: 'key/{{ inventory_hostname }}/'
dest: '~/.ssh/'
tags:
- copy