使用ansible在远程主机上创建ssh密钥失败

时间:2015-12-30 18:36:48

标签: ssh yaml ansible ansible-playbook pexpect

我正在使用Ansible在远程主机上创建ssh密钥。以下是剧本代码

- name: Test playbook
  hosts: all
  remote_user: admin
  tasks:
    - name: Create ssh keys
      expect:
        command: ssh-keygen -t rsa
        echo: yes
        timeout: 5
        responses:
          "file": "" ## Enter file in which to save the key (/home/admin/.ssh/id_rsa)
          "Overwrite": "n" ## Overwrite (y/n)? 
          "passphrase": "" ## Enter passphrase (empty for no passphrase)

但是,它会收到以下错误:

  

致命:[10.1.1.1]:失败! => {“已更改”:true,“cmd”:“ssh-keygen -t rsa”,“delta”:“0:00:00.301769”,“end”:“2015-12-30 09:56:29.465815”,“失败“:true,”invocation“:{”module_args“:{”chdir“:null,”command“:”ssh-keygen -t rsa“,”created“:null,”echo“:true,”removed“: null,“respond”:{“Overwrite”:“n”,“file”:“”,“passphrase”:“”},“timeout”:5},“module_name”:“expect”},“rc”: 1,“开始”:“2015-12-30 09:56:29.164046”,“stdout”:“生成公共/私有rsa密钥对。\ r \ n输入要保存密钥的文件(/ home / admin /。 ssh / id_rsa):\ r \ n / home / admin / .ssh / id_rsa已经存在。\ r \ nOverwrite(y / n)?n“,”stdout_lines“:[”生成公共/私有rsa密钥对。“, “输入要保存密钥的文件(/home/admin/.ssh/id_rsa):”,“/ home / admin / .ssh / id_rsa已存在。”,“覆盖(y / n)?n”]}

当“覆盖”映射到“y”时,这确实可以正常工作。

2 个答案:

答案 0 :(得分:1)

  

当“覆盖”映射到“y”时,这确实可以正常工作。

如果是这种情况,那么听起来你的任务工作正常。 ssh-keygen只会提示覆盖该文件(如果该文件已存在),并且您对该任务中“覆盖”的响应为“n”。如果你告诉ssh-keygen没有覆盖该文件,那么它将立即以非零返回码退出,Ansible将其解释为错误。

如果您只想在密钥不存在时执行此任务(为了创建新密钥但不覆盖现有密钥),那么您可能希望将以下内容添加到您的任务中:

creates: /home/admin/.ssh/id_rsa

如果指定的文件已存在,creates修饰符将阻止任务执行。

答案 1 :(得分:0)

我使用以下命令为具有正确访问权限的特定用户创建密钥:

- name: Create ssh key
  shell: |
    ssh-keygen -t rsa -N "" -f /home/{{ ansible_user }}/.ssh/id_ed25519 -C {{ ansible_user }}@{{ inventory_hostname }}
    chown {{ ansible_user }}:{{ ansible_user }} /home/{{ ansible_user }}/.ssh/id_ed25519*
  args:
    creates: '/home/{{ ansible_user }}/.ssh/id_ed25519'