是否有一种方法可以忽略由Ansible做出的SSH真实性检查?例如,当我刚刚安装了一个新服务器时,我必须回答这个问题:

GATHERING FACTS ***************************************************************
The authenticity of host 'xxx.xxx.xxx.xxx (xxx.xxx.xxx.xxx)' can't be established.
RSA key fingerprint is xx:yy:zz:....
Are you sure you want to continue connecting (yes/no)?

我知道这通常是一个坏主意,但我将它合并到一个脚本中,该脚本首先在我的云提供商创建一个新的虚拟服务器,然后自动调用我的ansible playbook来配置它。我希望在脚本执行过程中避免任何人为干预。


当前回答

我知道这个问题已经得到了回答,这也是正确的,但只是想链接ansible文档,其中清楚地解释了何时以及为什么应该添加相应的检查:host-key-checking

其他回答

我找到答案了,你需要将环境变量ANSIBLE_HOST_KEY_CHECKING设置为False。例如:

ANSIBLE_HOST_KEY_CHECKING=False ansible-playbook ...

大多数问题出现在你想添加新的主机动态库存(通过add_host模块)在剧本。我不想永久禁用指纹主机检查,所以在全局配置文件中禁用它的解决方案对我来说是不合适的。在运行playbook之前像ANSIBLE_HOST_KEY_CHECKING那样导出var是运行前需要记住的另一件事。

最好将本地配置文件添加到与playbook相同的目录中。创建名为ansible.cfg的文件,并粘贴以下文本:

[defaults]
host_key_checking = False

不需要记得在env vars或ansible-playbook选项中添加一些东西。把这个文件放到ansible git repo很容易。

这是我在我的环境中使用的工作方式。我使用这张票的想法https://github.com/mitogen-hq/mitogen/issues/753

- name: Example play
  gather_facts: no
  hosts: all
  tasks:
    - name: Check SSH known_hosts for {{ inventory_hostname }}
      local_action: shell ssh-keygen -l -F {{ inventory_hostname }}
      register: checkForKnownHostsEntry
      failed_when: false
      changed_when: false
      ignore_errors: yes
    - name: Add {{ inventory_hostname }} to SSH known hosts automatically
      when: checkForKnownHostsEntry.rc == 1
      changed_when: checkForKnownHostsEntry.rc == 1
      local_action: 
         module: shell
         args: ssh-keyscan -H "{{ inventory_hostname }}" >> $HOME/.ssh/known_hosts

主机密钥检查是重要的安全措施,所以我不会到处跳过它。是的,如果你一直重新安装相同的测试主机(没有备份它的SSH证书),或者如果你有稳定的主机,但你运行Jenkins的剧本,如果你第一次连接到主机,没有简单的添加主机密钥的选项,这可能会很烦人。所以:

这是我们在库存文件中用于稳定主机(当运行Jenkins的剧本时,你只是想在第一次连接到主机时接受主机密钥):

[all:vars]
ansible_ssh_common_args='-o StrictHostKeyChecking=accept-new'

这是我们的临时主机(在最后这将忽略他们的主机键):

[all:vars]
ansible_ssh_common_args='-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null'

还有一个环境变量,或者你可以把它添加到组/主机变量文件中。没有必要把它列在清单里——这对我们来说只是方便而已。

在这里使用了一些其他的回答和一个同事的解决方案,谢谢!

忽视检查是一个坏主意,因为它使你容易受到中间人的攻击。

我通过只添加每台机器的密钥一次并在Ansible中实际设置ok/更改状态来改善nikobelia的答案:

- name: Accept EC2 SSH host keys
  connection: local
  become: false
  shell: |
    ssh-keygen -F {{ inventory_hostname }} || 
      ssh-keyscan -H {{ inventory_hostname }} >> ~/.ssh/known_hosts
  register: known_hosts_script
  changed_when: "'found' not in known_hosts_script.stdout"

然而,Ansible在脚本运行之前就开始收集事实,这需要SSH连接,所以我们必须禁用这个任务或手动将它移到后面:

- name: Example play
  hosts: all
  gather_facts: no  # gather facts AFTER the host key has been accepted instead

  tasks:

  # https://stackoverflow.com/questions/32297456/
  - name: Accept EC2 SSH host keys
    connection: local
    become: false
    shell: |
      ssh-keygen -F {{ inventory_hostname }} ||
        ssh-keyscan -H {{ inventory_hostname }} >> ~/.ssh/known_hosts
    register: known_hosts_script
    changed_when: "'found' not in known_hosts_script.stdout"
  
  - name: Gathering Facts
    setup:

我一直无法解决的一个问题是,即使它只添加了一个键,它也会将所有内容标记为已更改。如果有人可以贡献一个修复,那将是伟大的!