我正在使用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”时,这确实可以正常工作。
答案 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'