将本地目录复制到具有相同目录名的远程主机

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