如何在 ansible 库存文件中设置 host_key_checking=false?

Posted

技术标签:

【中文标题】如何在 ansible 库存文件中设置 host_key_checking=false?【英文标题】:How to set host_key_checking=false in ansible inventory file? 【发布时间】:2014-05-29 06:11:49 【问题描述】:

我想使用ansible-playbook 命令而不是“vagrant provision”。但是在hosts 文件中设置host_key_checking=false 似乎不起作用。

# hosts file
vagrant ansible_ssh_private_key_file=~/.vagrant.d/insecure_private_key 
ansible_ssh_user=vagrant ansible_ssh_port=2222 ansible_ssh_host=127.0.0.1 
host_key_checking=false

Vagrantfile 之外是否有可以覆盖此值的配置变量?

【问题讨论】:

【参考方案1】:

由于我在 2014 年回答了这个问题,我已经更新了我的答案以考虑到 ansible 的更新版本。

是的,您可以在主机/库存级别(这在 newer ansible versions 上成为可能)或全局级别进行:

库存

添加以下内容。

ansible_ssh_common_args='-o StrictHostKeyChecking=no'

主持人

添加以下内容。

ansible_ssh_extra_args='-o StrictHostKeyChecking=no'

hosts/inventory 选项适用于连接类型ssh 而不是paramiko。有些人可能会强烈认为库存和主机更安全,因为范围更有限。

全球:

Ansible User Guide - Host Key Checking

您可以在/etc/ansible/ansible.cfg~/.ansible.cfg 文件中执行此操作:

[defaults]
host_key_checking = False

或者您可以设置和环境变量(这可能不适用于较新的 ansible 版本):

export ANSIBLE_HOST_KEY_CHECKING=False

【讨论】:

我使用的是 ansible 1.7.2,我的经验是环境变量 ANSIBLE_HOST_KEY_CHECKING 有效,但 -e 'host_key_checking=False' 无效。 您的第一句话“是的,但不在主机/库存级别”是错误的。您可以使用ansible_ssh_common_args='-o StrictHostKeyChecking=no'ansible_ssh_extra_args='-o StrictHostKeyChecking=no' 在运行我的剧本之前,只有最后一个选项对我有用(导出 ANSIBLE_HOST_KEY_CHECKING=False)。 “是的,但不在主机/库存级别。” -- 被证明是错误的,由my answer 证明。我什至会说这并不是关于如何在 inventory 级别上设置它的问题的真正答案。 @gertvdijk 我在 2014 年回答了这个问题。Ansible 经历了很多修改。现在不是这样了吗?【参考方案2】:

是的,您可以在库存/主机级别设置。

有了已经接受的答案,我认为这是对如何在库存级别处理此问题的更好答案。我认为通过将这种不安全的设置隔离到所需的主机(例如测试系统、本地开发机器)来更安全。

您可以在库存级别做的就是添加

ansible_ssh_common_args='-o StrictHostKeyChecking=no'

ansible_ssh_extra_args='-o StrictHostKeyChecking=no'

到您的主机定义(请参阅Ansible Behavioral Inventory Parameters)。

如果您使用 ssh 连接类型,而不是 paramiko 或其他类型,这将起作用。

例如,Vagrant 主机定义看起来像……

vagrant ansible_port=2222 ansible_host=127.0.0.1 ansible_ssh_common_args='-o StrictHostKeyChecking=no'

vagrant ansible_port=2222 ansible_host=127.0.0.1 ansible_ssh_extra_args='-o StrictHostKeyChecking=no'

然后在不更改任何环境变量的情况下运行 Ansible 即可成功。

$ ansible vagrant -i <path/to/hosts/file> -m ping
vagrant | SUCCESS => 
    "changed": false, 
    "ping": "pong"

如果您想为一组主机执行此操作,建议将其作为现有组的补充组变量,如下所示:

[mytestsystems]
test[01:99].example.tld

[insecuressh:children]
mytestsystems

[insecuressh:vars]
ansible_ssh_common_args='-o StrictHostKeyChecking=no'

【讨论】:

这是一个更好的答案。 这个建议对我有用,我同意出于安全考虑,这应该在项目级别(而不是全局级别)设置。 我在 group_vars 文件的 yml 文件中包含了ansible_ssh_common_args: '-o StrictHostKeyChecking=no'【参考方案3】:

我无法使用:

ansible_ssh_common_args='-o StrictHostKeyChecking=no'

在库存文件中。在我的情况下,ansible 似乎没有考虑这个选项(来自 ubuntu 14.04 中 pip 的 ansible 2.0.1.0)

我决定使用:

server ansible_host=192.168.1.1 ansible_ssh_common_args= '-o UserKnownHostsFile=/dev/null'

它帮助了我。

您也可以在组中为每个主机设置此变量:

[servers_group:vars]
ansible_ssh_common_args='-o UserKnownHostsFile=/dev/null'

【讨论】:

UserKnownHostsFile / GlobalKnownHostsFile 选项设置为/dev/null 也确实有效。奇怪的是设置StrictHostKeyChecking 对你不起作用。原因很可能是您的 SSH 配置中的某个选项。 +1 表示-o UserKnownHostsFile=/dev/null。没有它也对我不起作用,不管我在其他答案中概述的ansible_ssh_common_args 的位置和方式。【参考方案4】:

/etc/ansible/ansible.cfg 中取消注释该行:

host_key_check = False

/etc/ansible/hosts 中取消注释该行

client_ansible ansible_ssh_host=10.1.1.1 ansible_ssh_user=root ansible_ssh_pass=12345678

就是这样

【讨论】:

【参考方案5】:

在使用 ansible ad-hoc 命令时向 ansible 配置添加以下内容:

[ssh_connection]
# ssh arguments to use
ssh_args = -o StrictHostKeyChecking=no

Ansible 版本

ansible 2.1.6.0
config file = /etc/ansible/ansible.cfg

【讨论】:

【参考方案6】:

您可以在 /etc/ansible/ansible.cfg~/.ansible.cfgansible.cfg(在您的当前目录中)文件中设置这些配置

[ssh_connection]
ssh_args = -C -o ControlMaster=auto -o ControlPersist=60s -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no

在 ubuntu 20.04 中使用 ansible 2.9.6 测试

【讨论】:

以上是关于如何在 ansible 库存文件中设置 host_key_checking=false?的主要内容,如果未能解决你的问题,请参考以下文章

ANSIBLE: 如何从清单组附加变量

Ansible - 在播放期间切换到新的库存文件

如何使Ansible通知主机是相同的,避免任务冲突

如何在剧本中设置Ansible标签?

Linux:综合架构批量管理服务(ansible)-- 扩展功能补充

如何在库存文件中使用ansible-vault加密密码?