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