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

时间:2016-12-21 15:38:21

标签: ansible ansible-playbook authorized-keys

我写了一个剧本

  1. 在host1上生成pub键
  2. 复制控制台上的pub键
  3. 在第二台主机上部署pub键,即host2
  4. - 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"
    

    问题出在上一个任务中,即将host1的pub pub键复制到host2。它的写入方式将再次将pub键复制到host1。

    如何告诉Ansible将pub键复制到host2?感谢

3 个答案:

答案 0 :(得分:0)

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

这是一个棘手的问题,但是你不能直接将密钥直接转到host2吗?你会用密码去那里吗?

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

您还需要使用“控制主机”吗?即从那里运行的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 :(得分:0)

两个选项。在host1:

如果super.onRequestPermissionsResult(requestCode, permissions, grantResults); 可用:

ssh-copy-id

shell: ssh-copy-id admin@host2

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

答案 2 :(得分:0)

出于我的尊重,我不认为“helloV”的答案是正确的,由于剧本,它会将公钥从host1复制到host2的authorized_keys,但它也会尝试复制公众密钥从host2到host2上的auhorized_keys。如果host2中不存在公钥,则会失败。 如果你希望这只在从host1到host2的情况下工作,你应该使用when语句,但是,我认为这不是正确的方法,也许你应该在playbook中包含公钥作为文件那么你可以随时使用。 所以我的建议将是下一个:

- 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" 
应使用{{target}}

中给出的host1名称更改

host1