Ansible:将host1的关键内容追加到host2的authorized_keys

Ansible: Append key content of host1 to authorized_keys of host2

我写了一个剧本给

  1. 在主机 1 上生成公钥
  2. 复制我控制机器上的公钥
  3. 在第二台主机上部署公钥,即 host2

- hosts: '{{ target }}'
  tasks:
  - name: Check admin pub keys are present on host1
     stat:
      path: /var/services/homes/admin/.ssh/id_rsa.pub
  - name: Generate pub keys on host1 if non-existing
    user:
      name: admin
      generate_ssh_key: yes
      ssh_key_bits: 4096
    when: stat_result.stat.exists == False
  - name: Downloading pub key from host1 to the control machine
    command: scp admin@{{ansible_host}}:/var/services/homes/admin/.ssh/id_rsa.pub /tmp/
    delegate_to: 127.0.0.1
  - name: Copy pub key of host1 to host2
    authorized_keys:
      user: admin       
      key: "{{ lookup('file', '/tmp/id_rsa.pub') }}"
      state: present

我运行它与:

ansible-playbook -i hosts keys.yml -e "target=host1"

问题出在最后一个任务中,即将主机 1 的公钥复制到主机 2。它的编写方式会将公钥再次复制到 host1。

我如何告诉 Ansible 将 pub 密钥复制到 host2?谢谢

我认为这可能是您的 scp 命令。

好吧,这是一个棘手的问题,但是你不能直接将密钥 scp 到 host2 吗?无论如何,您都会使用密码到达那里,不是吗?

scp admin@host1:/var/services/homes/admin/.ssh/id_rsa.pub admin@host2:/usr/admin/.ssh/.

是否还有其他原因需要使用 "control host"?即 ansible 脚本 运行 来自那里吗?

编辑:

 scp admin@host1:/var/services/homes/admin/.ssh/id_rsa.pub admin@host2:/tmp/.

cat /tmp/id_rsa.pub >> /usr/admin/.ssh/authorized_keys

两种选择。在主机 1 上:

如果 ssh-copy-id 可用:

shell: ssh-copy-id admin@host2

shell: cat /var/services/homes/admin/.ssh/id_rsa.pub | (ssh admin@host2 "cat >> ~/.ssh/authorized_keys")

注意:我还没有测试过。您可能需要对其进行调整以使其正常工作。

恕我直言,我不认为 "helloV" 的答案是正确的,由于剧本,它会将 public 密钥从 host1 复制到 authorized_keys host2 的,但它也会尝试将 public 密钥从 host2 复制到 host2 上的 auhorized_keys。如果主机 2 中不存在 public 键,则失败。 如果你想让它只在从 host1 到 host2 的情况下工作,你应该使用 when 语句,而且,我认为这不是正确的方法,也许你应该在剧本作为文件,然后您可以在需要时使用。 所以我的建议是下一个:

- name: Copy public key to authorized keys
  shell: cat /var/services/homes/admin/.ssh/id_rsa.pub | (ssh admin@host2 "cat >> ~/.ssh/authorized_keys")
  when: target == "host1" 

host1 应更改为 {{target}}

中给出的 host1 名称