首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >提示known_hosts问题

提示known_hosts问题
EN

Stack Overflow用户
提问于 2015-05-13 22:15:07
回答 8查看 87.3K关注 0票数 57

我正在运行Ansible剧本,它在一台机器上运行得很好。

在一台新机器上,当我第一次尝试时,我会得到以下错误。

代码语言:javascript
复制
17:04:34 PLAY [appservers] ************************************************************* 
17:04:34 
17:04:34 GATHERING FACTS *************************************************************** 
17:04:34 fatal: [server02.cit.product-ref.dev] => {'msg': "FAILED: (22, 'Invalid argument')", 'failed': True}
17:04:34 fatal: [server01.cit.product-ref.dev] => {'msg': "FAILED: (22, 'Invalid argument')", 'failed': True}
17:04:34 
17:04:34 TASK: [common | remove old ansible-tmp-*] ************************************* 
17:04:34 FATAL: no hosts matched or all hosts have already failed -- aborting
17:04:34 
17:04:34 
17:04:34 PLAY RECAP ******************************************************************** 
17:04:34            to retry, use: --limit @/var/lib/jenkins/site.retry
17:04:34 
17:04:34 server01.cit.product-ref.dev      : ok=0    changed=0    unreachable=1    failed=0   
17:04:34 server02.cit.product-ref.dev      : ok=0    changed=0    unreachable=1    failed=0   
17:04:34 
17:04:34 Build step 'Execute shell' marked build as failure
17:04:34 Finished: FAILURE

如果我首先转到源机器(从我运行ansible剧本的位置)并手动将ssh转到目标机器(作为给定的用户)并输入“是”以输入known_hosts文件,那么这个错误就可以解决。

现在,如果我第二次运行相同的ansible剧本,它可以正常工作,不会出错。

因此,在第一次为给定用户(~/.ssh文件夹、文件known_hosts)创建SSH known_hosts条目时,我如何抑制ssh提供的提示?

我发现,如果在~/..ssh/ config 文件中使用以下配置条目,我就可以做到这一点。

~/..ssh/config

代码语言:javascript
复制
# For vapp virtual machines
Host *
  StrictHostKeyChecking no
  UserKnownHostsFile=/dev/null
  User kobaloki
  LogLevel ERROR

也就是说,如果我将上述代码放置在远程计算机的用户的~/..ssh/config文件中,并第一次尝试“Ansible playbook”,则不会提示我输入“是”,并且剧本将成功运行(不需要用户手动创建从源计算机到目标/远程计算机的known_hosts文件条目)。

我的问题是: 1.如果我去~/..ssh/ config方式2,我应该注意哪些安全问题。我如何将设置(配置文件中有什么)作为参数/选项传递给ansible at命令行,以便它能够在新机器上第一次运行(而不提示/依赖于目标机器源计算机上的known_hosts文件条目?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2015-05-14 00:05:11

ansible有关于这个的一节。引用:

默认情况下,Ansible启用了主机密钥检查。 如果重新安装了一个主机,并且在‘已知_主机’中有一个不同的键,这将导致一个错误消息,直到更正。如果主机最初不在“known_hosts”中,这将导致提示确认密钥,这将导致交互体验,如果使用Ansible,比如说,cron。你可能不想要这个。 如果您理解此行为的含义并希望禁用此行为,可以通过编辑/etc/ansible.cfg或~/.ansible.cfg:

代码语言:javascript
复制
[defaults]
host_key_checking = False

或者,这可以由ANSIBLE_HOST_KEY_CHECKING环境变量设置:

代码语言:javascript
复制
$ export ANSIBLE_HOST_KEY_CHECKING=False

还请注意,paramiko模式下的主机键检查相当慢,因此在使用此功能时也建议切换到“ssh”。

票数 57
EN

Stack Overflow用户

发布于 2016-08-22 15:45:33

为了更新本地known_hosts文件,我最后使用了ssh-keyscan (通过dig将主机名解析为IP地址)和ansible模块known_hosts的组合:(文件名ssh-known_hosts.yml)

代码语言:javascript
复制
- name: Store known hosts of 'all' the hosts in the inventory file
  hosts: localhost
  connection: local

  vars:
    ssh_known_hosts_command: "ssh-keyscan -T 10"
    ssh_known_hosts_file: "{{ lookup('env','HOME') + '/.ssh/known_hosts' }}"
    ssh_known_hosts: "{{ groups['all'] }}"

  tasks:

  - name: For each host, scan for its ssh public key
    shell: "ssh-keyscan {{ item }},`dig +short {{ item }}`"
    with_items: "{{ ssh_known_hosts }}"
    register: ssh_known_host_results
    ignore_errors: yes

  - name: Add/update the public key in the '{{ ssh_known_hosts_file }}'
    known_hosts:
      name: "{{ item.item }}"
      key: "{{ item.stdout }}"
      path: "{{ ssh_known_hosts_file }}"
    with_items: "{{ ssh_known_host_results.results }}"

要执行这样的yml,请执行

代码语言:javascript
复制
ANSIBLE_HOST_KEY_CHECKING=false ansible-playbook path/to/the/yml/above/ssh-known_hosts.yml

因此,对于清单中的每个主机,所有受支持的算法都将在主机名、ipaddress对记录下的known_hosts文件中添加/更新;例如

代码语言:javascript
复制
atlanta1.my.com,10.0.5.2 ecdsa-sha2-nistp256 AAAAEjZHN ... NobYTIGgtbdv3K+w=
atlanta1.my.com,10.0.5.2 ssh-rsa AAAAB3NaC1y ... JTyWisGpFeRB+VTKQ7
atlanta1.my.com,10.0.5.2 ssh-ed25519 AAAAC3NaCZD ... UteryYr
denver8.my.com,10.2.13.3 ssh-rsa AAAAB3NFC2 ... 3tGDQDSfJD
...

(如果库存文件如下所示:

代码语言:javascript
复制
[master]
atlanta1.my.com
atlanta2.my.com

[slave]
denver1.my.com
denver8.my.com

)

与熊的回答相反,这将正确地处理known_hosts文件的内容。

如果使用虚拟环境,目标主机得到重新映像(因此ssh发布键被更改),则此播放特别有用。

票数 47
EN

Stack Overflow用户

发布于 2016-02-04 23:43:22

从安全的角度来看,完全禁用主机密钥检查是个坏主意,因为它会使您容易受到中间人的攻击。

如果您可以假设当前的网络没有受到破坏(也就是说,当您第一次将ssh提交到机器并显示一个密钥时,该密钥实际上是机器的,而不是攻击者的),那么您可以使用ssh-keyscan外壳模块将新服务器的密钥添加到已知的主机文件中(编辑:斯特潘的回答这样做更好):

代码语言:javascript
复制
- name: accept new ssh fingerprints
  shell: ssh-keyscan -H {{ item.public_ip }} >> ~/.ssh/known_hosts
  with_items: ec2.instances

(如您在ec2配置之后所看到的那样,在这里演示。)

票数 23
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30226113

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档