我正在运行Ansible剧本,它在一台机器上运行得很好。
在一台新机器上,当我第一次尝试时,我会得到以下错误。
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剧本的位置)并手动将ssh转到目标机器(作为给定的用户)并输入“是”以输入known_hosts文件,那么这个错误就可以解决。
现在,如果我第二次运行相同的ansible剧本,它可以正常工作,不会出错。
因此,在第一次为给定用户(~/.ssh文件夹、文件known_hosts)创建SSH known_hosts条目时,我如何抑制ssh提供的提示?
我发现,如果在~/..ssh/ config 文件中使用以下配置条目,我就可以做到这一点。
~/..ssh/config
# For vapp virtual machines
Host *
StrictHostKeyChecking no
UserKnownHostsFile=/dev/null
User kobaloki
LogLevel ERROR也就是说,如果我将上述代码放置在远程计算机的用户的~/..ssh/config文件中,并第一次尝试“Ansible playbook”,则不会提示我输入“是”,并且剧本将成功运行(不需要用户手动创建从源计算机到目标/远程计算机的known_hosts文件条目)。
我的问题是: 1.如果我去~/..ssh/ config方式2,我应该注意哪些安全问题。我如何将设置(配置文件中有什么)作为参数/选项传递给ansible at命令行,以便它能够在新机器上第一次运行(而不提示/依赖于目标机器源计算机上的known_hosts文件条目?
发布于 2015-05-14 00:05:11
ansible有关于这个的一节。引用:
默认情况下,Ansible启用了主机密钥检查。 如果重新安装了一个主机,并且在‘已知_主机’中有一个不同的键,这将导致一个错误消息,直到更正。如果主机最初不在“known_hosts”中,这将导致提示确认密钥,这将导致交互体验,如果使用Ansible,比如说,cron。你可能不想要这个。 如果您理解此行为的含义并希望禁用此行为,可以通过编辑/etc/ansible.cfg或~/.ansible.cfg:
[defaults]
host_key_checking = False或者,这可以由
ANSIBLE_HOST_KEY_CHECKING环境变量设置:
$ export ANSIBLE_HOST_KEY_CHECKING=False还请注意,paramiko模式下的主机键检查相当慢,因此在使用此功能时也建议切换到“ssh”。
发布于 2016-08-22 15:45:33
为了更新本地known_hosts文件,我最后使用了ssh-keyscan (通过dig将主机名解析为IP地址)和ansible模块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因此,对于清单中的每个主机,所有受支持的算法都将在主机名、ipaddress对记录下的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)
与熊的回答相反,这将正确地处理known_hosts文件的内容。
如果使用虚拟环境,目标主机得到重新映像(因此ssh发布键被更改),则此播放特别有用。
发布于 2016-02-04 23:43:22
从安全的角度来看,完全禁用主机密钥检查是个坏主意,因为它会使您容易受到中间人的攻击。
如果您可以假设当前的网络没有受到破坏(也就是说,当您第一次将ssh提交到机器并显示一个密钥时,该密钥实际上是机器的,而不是攻击者的),那么您可以使用ssh-keyscan和外壳模块将新服务器的密钥添加到已知的主机文件中(编辑:斯特潘的回答这样做更好):
- name: accept new ssh fingerprints
shell: ssh-keyscan -H {{ item.public_ip }} >> ~/.ssh/known_hosts
with_items: ec2.instances(如您在ec2配置之后所看到的那样,在这里演示。)
https://stackoverflow.com/questions/30226113
复制相似问题