Ansible-Playbook:无法通过ssh连接到主机:没有这样的身份验证

3

我正在尝试在一些服务器上运行Ansible playbook来完成设置。为了做到这一点,我创建了一个dev清单的主机文件:

all:
  servers:
    hosts:
      my_server1:
      my_server2:
  vars:
    ansible_ssh_user: myremoteuser
    ansible_ssh_private_key_file: "{{ private_key }}"

我从我的保险库中获取私钥,方法如下: private_key: "{{vault_private_key | b64decode}}"

vault_private_key 是我生成的2048位RSA密钥的base64编码版本。 我可以在错误消息中正确解码这个字符串。

   "msg": "Failed to connect to the host via ssh: no such identity: -----BEGIN OPENSSH PRIVATE KEY-----\n

我使用以下命令生成ssh密钥:

ssh-keygen -b 2048 -t rsa -f myremoteuser_key -C myremoteuser

当我通过ssh登录到my_server12时,我可以验证/home/myremoteuser/.ssh/authorized_keys中是否有生成的公钥,我通过grep公钥文本进行了验证。

我可以通过命令行ssh登陆。当我尝试设置私钥时,是否有遗漏的步骤?

1个回答

1
我无法确定您的问题——您能否确认您没有混淆私钥文件的路径和私钥文件的内容?
您是否将私钥写入磁盘?如果是这样,您是否将权限设置为0600?SSH不会读取权限过于宽松的私钥文件。
我怀疑您遇到了权限问题。
为什么不使用“template”任务来填充您的私钥内容?请参见https://docs.ansible.com/ansible/latest/collections/ansible/builtin/template_module.html 您可以在模板文件中放置一个变量,{{vault_private_key | b64decode}}

我正在尝试将私钥文件内容加密到保险库中,以便我可以将其检入源代码控制。解密和解码后,我根本不会将内容写入文件。我应该这样做吗?我能直接传递私钥而不创建中间文件吗? - Niru
1
作为一个例子,我可以拿着我加密和编码的确切文件连接到服务器: ssh -i ~/.ssh/server_key myremoteuser@my_server1 其中server_key文件具有以下权限:-rw------- - Niru
我认为你是正确的,我需要将ansible_ssh_private_key_file设置为一个文件,然后设置 ansible_ssh_private_key_file: ~/.ssh/server_key,然后我就能够ping通了。 - Niru
1
搞定了!我需要做的是修改我的 vars.yml 文件,包括以下内容:private_key: "{{vault_private_key | b64decode}}" private_key_file: ~/.ssh/server_key 然后在我的 playbook 中:- hosts: localhost ... tasks: - tempfile: state: file suffix: pem register: temp_key - template: src: templates/server_key.j2 dest: "{{ private_key_file }}" vars: ssh_private_key: "{{ private_key }}"``` 如果您能将此添加到您的答案中,我会接受它。我希望不需要将其写入临时文件。 - Niru
你不应该需要使用临时文件。你不想使用临时文件是正确的。我已经更新了我的答案。别忘了在生成的私钥文件上设置权限! - Aleksey Tsalolikhin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接