如何忽略ansible SSH真实性检查?

时间:2015-08-30 14:13:33

标签: ssh ansible

有没有办法忽略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来配置它。我想在脚本执行过程中避免任何人为干预。

9 个答案:

答案 0 :(得分:188)

两个选项 - 正如您在自己的回答中所说,第一个选项是将环境变量ANSIBLE_HOST_KEY_CHECKING设置为False。

设置它的第二种方法是将它放在一个ansible.cfg文件中,这是一个非常有用的选项,因为您可以全局设置(在系统或用户级别,/etc/ansible/ansible.cfg或{{1 }},或者在与您正在运行的playbook相同的目录中的配置文件中。

为此,请在其中一个位置创建~/.ansible.cfg文件,并将其包括在内:

ansible.cfg

您还可以在那里设置许多其他方便的默认设置,例如是否在播放开始时收集事实,是否合并多个地方声明的哈希值或将其替换为另一个,等等。 Ansible文档中有一大堆选项here

编辑:关于安全性的说明。

SSH主机密钥验证是持久主机的一个有意义的安全层 - 如果您多次连接到同一台机器,那么在本地接受主机密钥是很有价值的。

对于寿命较长的EC2实例,在初始创建实例时只接受一次的任务接受主机密钥是有意义的:

[defaults]
host_key_checking = False

在动态站起来的实例上检查主机密钥并在Playbook执行后立即删除没有安全值,但检查持久性机器的主机密钥有安全价值。因此,您应该按逻辑环境不同地管理主机密钥检查。

  • 默认情况下启用保留检查( - name: Write the new ec2 instance host key to known hosts connection: local shell: "ssh-keyscan -H {{ inventory_hostname }} >> ~/.ssh/known_hosts"
  • 禁用工作目录中的主机密钥检查,以查看针对短暂实例运行的剧本(~/.ansible.cfg以及针对流浪汉VM的单元测试的剧本,以及短期ec2实例的自动化)

答案 1 :(得分:22)

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

ANSIBLE_HOST_KEY_CHECKING=False ansible-playbook ...

答案 2 :(得分:3)

转发至nikobelia

对于那些使用jenkins来运行游戏书的人,我在运行ansible-playbook之前添加了我的jenkins作业,他的环境变量ANSIBLE_HOST_KEY_CHECKING = False 例如:

export ANSIBLE_HOST_KEY_CHECKING=False
ansible-playbook 'playbook.yml' \
--extra-vars="some vars..." \
--tags="tags_name..." -vv

答案 3 :(得分:3)

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

我可以自由地改进nikobelia's answer,只需一次添加每台机器的键,并实际上在Ansible中设置确定/更改的状态

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

我无法解决的一个问题是,即使仅添加了一个键,它也将所有内容标记为已更改。如果有人可以提供修补程序,那就太好了!

答案 4 :(得分:1)

您可以在运行剧本时将其作为命令行参数传递:

ansible-playbook play.yml --ssh-common-args='-o StrictHostKeyChecking=no'

答案 5 :(得分:0)

将所有主机的host_key_checking更改为false是一个非常糟糕的主意。

您唯一想忽略它的时间是在“首次联系”上,这两个任务将完成:

- name: Check known_hosts for {{ inventory_hostname }}
  local_action: shell ssh-keygen -F {{ inventory_hostname }}
  register: has_entry_in_known_hosts_file
  changed_when: false
  ignore_errors: yes
- name: Ignore host key on first run
  when: has_entry_in_known_hosts_file == 1
  set_fact:
    ansible_ssh_common_args: '-o StrictHostKeyChecking=no'

因此,只有在known_hosts文件中没有主机密钥的情况下,我们才关闭主机密钥检查。

答案 6 :(得分:0)

使用名为validate_certs的参数忽略ssh验证

- ec2_ami:
    instance_id: i-0661fa8b45a7531a7
    wait: yes
    name: ansible
    validate_certs: false
    tags:
      Name: ansible
      Service: TestService

这样做会忽略ssh验证过程

答案 7 :(得分:0)

我知道问题已经回答,而且也是正确的,但只是想链接ansible文档,其中清楚地说明了何时以及为何应添加相应检查:host-key-checking

答案 8 :(得分:0)

当您要将新主机添加到剧本中的动态清单(通过add_host模块)时,出现最多的问题。我不想永久禁用指纹主机检查,因此对我而言,诸如在全局配置文件中禁用指纹主机之类的解决方案并不可行。在运行剧本之前导出ANSIBLE_HOST_KEY_CHECKING之类的var是在运行之前要记住的另一件事。

最好在剧本所在的目录中添加本地配置文件。创建名为ansible.cfg的文件并粘贴以下文本:

[defaults]
host_key_checking = False

无需记住在env var中添加某些内容或添加到ansible-playbook选项中。将此文件轻松放入git repo很容易。