Ansible SSH提示已知_ -HOST问题



我正在运行Ansible Playbook,并且在一台计算机上正常工作。

在我第一次尝试时,我会收到以下错误。

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 Playbook)并手动SSH到目标计算机(作为给定的用户),然后输入nowno_hosts文件输入的"是"。

现在,如果我第二次运行相同的Ansible Playbook,它可以无错误地工作。

因此,如何在第一次为给定用户(〜/.ssh文件夹,file_hosts)进行SSH NOWN_HOSTS时抑制SSH给出的提示。

我发现,如果我在〜/.ssh/.ssh/config 文件中使用以下配置条目。

〜/.ssh/config

# For vapp virtual machines
Host *
  StrictHostKeyChecking no
  UserKnownHostsFile=/dev/null
  User kobaloki
  LogLevel ERROR

即。如果我将上述代码放在远程计算机的用户〜/.ssh/config文件中,然后第一次尝试Ansible playbook,则不会提示我启用"是",并且剧本将成功运行(而无需用户,要手动创建从源计算机到目标/远程计算机的已知_host文件条目)。

我的问题:1.如果我去〜/.ssh/config方法,我应该注意什么安全问题2.我如何将设置(配置文件中的内容)作为参数/选项传递给命令行的Ansible,以便它将在新机器上首次运行(不提示/取决于源计算机上的已知_ -Hosts文件条目对于目标计算机?

Ansible文档对此有一个部分。引用:

Ansible具有默认情况下启用主机密钥检查。

如果主机被重新安装,并且在" nown_hosts"中具有不同的键,这将导致错误消息,直到纠正。如果主机不是最初在"已知_hosts"中,这将导致提示确认密钥,如果从cron说,使用Ansible。您可能不想要这个。

如果您理解含义并希望禁用此行为,您可以通过编辑/etc/ansible/ansible.cfg或〜/.ansible.cfg:

来做到这一点
[defaults]
host_key_checking = False

另外,这可以由ANSIBLE_HOST_KEY_CHECKING设置环境变量:

$ export ANSIBLE_HOST_KEY_CHECKING=False

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

要更新本地known_hosts文件,我最终使用ssh-keyscan的组合(使用dig来解决hostname to ip地址)和Ansible Module known_hosts如下:(文件名ssh-known_hosts.yml

- 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,做

ANSIBLE_HOST_KEY_CHECKING=false ansible-playbook path/to/the/yml/above/ssh-known_hosts.yml

结果,对于库存中的每个主机中的每个主机,将在 hostname,ipaddress Pair Record中的known_hosts文件中添加/更新所有受支持的算法;例如

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
...

(提供库存文件看起来像:

[master]
atlanta1.my.com
atlanta2.my.com
[slave]
denver1.my.com
denver8.my.com

与xiong的答案相反,这将正确处理known_hosts文件的内容。

如果使用项目主机重新成像的虚拟化环境(因此,更改了SSH酒吧密钥),此剧本特别有用。

从安全角度来看,完全禁用主机密钥是一个坏主意,因为它使您对中间的攻击打开了。p>如果您可以假设当前网络不妥协(也就是说,当您首次向计算机SSH并将其显示为钥匙时,该密钥实际上是机器而不是攻击者的),则可以使用ssh-keyscan和Shell模块将新服务器的键添加到您已知的主机文件中(编辑:Stepan的答案可以做得更好):

- name: accept new ssh fingerprints
  shell: ssh-keyscan -H {{ item.public_ip }} >> ~/.ssh/known_hosts
  with_items: ec2.instances

(如在EC2配置后所发现的那样,请在此处显示。)

按照@Stepan vavra的正确答案。较短的版本是:

- known_hosts:
    name: "{{ item }}"
    key: "{{ lookup('pipe', 'ssh-keyscan {{ item }},`dig +short {{ item }}`') }}"
  with_items:
   - google.com
   - github.com

不会做类似此类工作的事情来启动已知_ host文件:

ANSIBLE_HOST_KEY_CHECKING=false ansible all -m ping

这应该连接到库存中的每个主机,更新每个主机的已知_host文件,而不必为每个提示输入"是",然后在每个主机上运行" ping"模块?

快速测试(在Ubuntu 16.04实例上删除我的已知_ -HOST文件,然后运行上述文件)似乎填充了已知的_ -Host文件,其当前指纹。

@Stepan vavra的解决方案在我使用别名宿主时对我不起作用(连接到没有可用于他们的DN的内部IP,所以我想要更多的描述性名称来参考库存中的每个主机,并且在每个实际IP上都有ANSIBLE_HOST变量点)。运行以上的运行要简单得多,并且在不必禁用主机键或ssh中启用了我的已知_ -host文件。

我已经创建了这个shell脚本(也来自詹金斯(Jenkins),btw)

my_known_hosts="$HOME/.ssh/known_hosts"
## housekeeping ##
if [ -f $my_known_hosts".old" ] 
    then rm -f $my_known_hosts".old"
fi
## housekeeping ##
## backup ##
if [ -f $my_known_hosts ] 
    then mv $my_known_hosts "$my_known_hosts.old"
fi
## backup ##
## query aws for active hosts and add to known_hosts
aws ec2 describe-instances --query 'Reservations[*].Instances[*].NetworkInterfaces[*].Association.PublicDnsName' --output text | xargs -L1 ssh-keyscan -H >> $my_known_hosts
## query aws for active hosts and add to known_hosts

https://admin-o-mat.blogspot.com/2020/09/asible-andible-and-was-aws-adding-hosts-to.html

这有点过时了,但我没有看到有人在谈论这个选项,所以我认为我加了2美分。

您可以与自己的CA签名SSH键。这是说明。

步骤:

  1. 创建自己的SSH证书授权证书和钥匙。
  2. 创建您的服务器或客户端键。
  3. 使用您的CA证书签署服务器或客户端键。
  4. 将您的ca添加到客户端的已知_host文件中。
  5. 或将CA添加到服务器上的授权密钥文件中。
  6. 我建议使用两个不同的CAS进行服务器和客户端任务。
  7. 您将不会提示您将服务器公共密钥添加到已知_HOST,因为您已经拥有证书。而且人们不需要使用密码登录您的服务器,因为您的所有客户端密钥都将与您的CA签名。
  8. 计算钱!!!!!

关于接受答案,有关主机密钥检查的文档的更新位置是:

https://docs.ansible.com/ansible/latest/user_guide/connection_details.html#managing-host-key-checking

相关内容

最新更新