我正在尝试通过我的 ansible-playbook 文件 ssh 到 ec2 实例。我可以在本地 ssh 进入实例,并且当前在我的 ansible-playbook 文件中具有以下配置:
- name: Wait for SSH to come up
delegate_to: "{{ public_dns }}"
wait_for_connection:
delay: 60
timeout: 120
with_items: "{{ public_ip }}"
remote_user: ubuntu
connection: ssh
register: item
但是,当我运行此程序时,出现以下错误:
失败:[localhost -> {{ public_dns }}] (item={'_ansible_item_result': 真,'_ansible_no_log':假,'_ansible_delegate_vars': {'ansible_delegate_host':u'{{ public_dns }}','ansible_host':u'{{ public_dns }}'},'更改':假,'经过':184,'失败':真, 'item': u'{{ public_ip }}', 'msg': u"等待 ping 模块超时 测试成功:'ping'",'_ansible_ignore_errors':无}) => {"已更改": false,“elapsed”:184,“item”:“{{ public_ip }}”,“msg”:“超时 等待 ping 模块测试成功:'ping'"}
当我从我的机器上 ping public_dns 或 public_ip 值时,均成功。
为什么运行 Ansible 文件时 ping 事件会失败? (我并不是故意尝试 ping 实例,实际上我想通过 ssh 连接到它。但是,错误表明 Ansible 可能在连接之前尝试 ping 实例,基于“等待 ping 模块测试成功超时” ”)
我已经将方法更改为:
- name: Add new instance to host group
add_host:
hostname: ""{{ public_ip }}"
groupname: launched
- name: Wait for SSH to come up
wait_for:
host: launched
port: 22
sleep: 30
delay: 10
timeout: 360
state: started
但是,这引发了不同的错误,“等待启动时超时:22”回溯包括以下内容:
connect_socket = socket.create_connection((host, port), connect_timeout) 文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/socket.py”,第 557 行,在 create_connection 中 对于 getaddrinfo(host, port, 0, SOCK_STREAM) 中的资源:。
有什么想法吗?
请注意,Ansible ping 模块 与 ICMP Ping 不同:https://docs.ansible.com/ansible/2.5/modules/ping_module.html。当使用 ping 模块时,Ansible 将尝试通过
ssh
连接到目标主机
如果上述任务位于针对新配置的 ec2 实例运行的 playbook 中,我将设置
gather_facts: false
并运行 wait_for_connection
作为我的第一个任务。如果还是失败,尝试加大timeout
参数
正如@peteris 所建议的,我的问题是没有安装 sshpass 程序。尽管我连接的服务器使用 SSH 密钥身份验证,但我提供了 -kK 选项,这使得 ansible 认为它需要 sshpass,尽管实际上并不需要。即使使用 -vvvv 也没有错误或警告。