【问题标题】:How to add SSH fingerprints to known hosts in Ansible?如何将 SSH 指纹添加到 Ansible 中的已知主机?
【发布时间】:2021-06-14 11:42:46
【问题描述】:

我有以下库存文件:

[all]
192.168.1.107
192.168.1.108
192.168.1.109

我想将这些主机的指纹添加到本地机器上的 known_hosts 文件中。 我知道我可以使用 ansible.builtin.known_hosts 但基于文档:

名称参数必须与键中存在的“主机名”或“IP”匹配 属性。

似乎我必须已经生成了密钥,并且我必须拥有三组密钥 - 每个主机一组。我希望我的所有主机都只有一把钥匙。

现在我可以用这个了:

- name: accept new remote host ssh fingerprints at the local host
  shell: "ssh-keyscan -t 'ecdsa' {{item}} >> {{ssh_dir}}known_hosts"
  with_inventory_hostnames:
    - all

但这种方法的问题在于它不是幂等的 - 如果我运行它 3 次,它将在 known_hosts 文件中添加三个类似的行。

另一种解决方案是检查 known_hosts 文件中是否存在主机 ip 并仅在它不存在时添加它,但我无法弄清楚如何在 when 条件下使用变量来检查多个主机。

所以问题是如何在以幂等方式生成一组私钥/公钥之前将主机指纹添加到本地 known_hosts 文件中?

【问题讨论】:

标签: ansible


【解决方案1】:

对于公共 SSH 密钥,我使用这个:

- hosts: localhost
  tasks:
  - set_fact:
      linuxkey: "{{ lookup('file', '~/.ssh/id_rsa.pub') }}"
    check_mode: no 

- hosts: all
  tasks: 

  - shell: 
      cmd: "sudo su - {{ application_user }}"
      stdin: "[[ ! `grep \"{{ hostvars['localhost']['linuxkey'] }}\" ~/.ssh/authorized_keys` ]] && echo '{{ hostvars['localhost']['linuxkey'] }}' >> ~/.ssh/authorized_keys"
      warn: no 
      executable: /bin/bash
    register: results
    failed_when: results.rc not in [0,1] 

我认为您可以轻松地将其调整为 known_hosts 文件

【讨论】:

  • 好的,所以 1) 在本地主机上,您将 linuxkey 变量设置为公钥的内容。 2) 对于您运行以下任务的所有主机 - 更改用户,将行输入标准输入并将结果保存在 results 变量中,然后将结果代码与 [0,1] 进行比较。你能解释一下你提供给标准输入的那一行发生了什么吗?
  • 这是一个标准的 linux 命令。调试一下看看。也许看看lineinfile,它应该更灵活。但是,当您想添加 SSH-Keys 时,您可能会遇到无法连接到远程主机的问题,因为之前没有添加 SSH-Key,所以您遇到了典型的鸡蛋问题。这就是我将这个解决方法与su 一起使用的原因
猜你喜欢
  • 2023-03-25
  • 1970-01-01
  • 2013-07-14
  • 2022-06-22
  • 2018-04-05
  • 1970-01-01
  • 1970-01-01
  • 2019-06-26
  • 1970-01-01
相关资源
最近更新 更多