Ansible SSH连接失败

39

我正在尝试在多个服务器上运行Ansible角色,但是遇到错误:

致命错误:[192.168.0.10]:不可访问!=> {"changed":false,"msg": "无法通过ssh连接到主机。","unreachable":true}

我的/etc/ansible/hosts文件如下:

192.168.0.10 ansible_sudo_pass='passphrase' ansible_ssh_user=user
192.168.0.11 ansible_sudo_pass='passphrase' ansible_ssh_user=user
192.168.0.12 ansible_sudo_pass='passphrase' ansible_ssh_user=user

我不知道发生了什么事情 - 一切看起来都很好 - 我可以通过SSH登录,但是ansible ping返回相同的错误。

来自详细执行日志:

<192.168.0.10>建立用户user的SSH连接<192.168.0.10> SSH: 执行 ssh -C -vvv -o ControlMaster=auto -o ControlPersist=60s -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o User=user -o ConnectTimeout=10 -o ControlPath=/root/.ansible/cp/ansible-ssh-%h-%p-%r 192.168.0.10 '/bin/sh -c '"'"'( umask 22 && mkdir -p "echo $HOME/.ansible/tmp/ansible-tmp-1463151813.31-156630225033829" && echo "echo $HOME/.ansible/tmp/ansible-tmp-1463151813.31-156630225033829" )'"'"''

你能帮我解决问题吗?如果我必须使用本地模式 (-c local),那么这没有用。

我已尝试删除 ansible_sudo_pass 和 ansible_ssh_user,但它没有帮助。

8个回答

70

你需要修改ansible_ssh_pass或者ssh密钥,例如我在我的清单文件中使用的是:

192.168.33.100 ansible_ssh_pass=vagrant ansible_ssh_user=vagrant

接着我可以连接到远程主机:

ansible all -i tests -m ping

根据以下结果:

192.168.33.100 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

希望能对你有所帮助。

编辑:在最新版本的Ansible中,ansible_ssh_passansible_ssh_user 不再可用。已更改为 ansible_useransible_pass


4
是的!我漏了ansible_ssh_pass变量。现在一切都运作得很好。非常感谢你! - Thomas
1
根据 http://docs.ansible.com/ansible/intro_inventory.html 的说明,应该使用 ansible_user 而不是 ansible_ssh_user - Matthias
如果你搜索 ansible_ssh_user,你可以在提到的链接中找到它。它在 ansible 1.9 中使用,但在 ansible 2.0 中已经更改为 ansible_user,但 ansible_ssh_user 在两个版本中仍然有效。 - Arbab Nazar
1
我原先的hosts文件只有IP地址。在我加上了“ansible_ssh_pass=vagrant ansible_ssh_user=vagrant”这一后缀后,ping命令就开始起作用了。谢谢! - Neo
@Matthias 这些变量是为ssh模块和ansible 2.9(目前最新版本)设计的,两者都很好。请参见此处 - ivan_onys

11
mkdir /etc/ansible
cat > hosts
default ansible_ssh_host=127.0.0.1 ansible_ssh_port=2222 ansible_ssh_user=vagrant ansible_ssh_private_key_file=.vagrant/machines/default/virtualbox/private_key

前往你的playbook目录并运行ansible all -m ping或ansible ping -m "server-group-name"


请解释答案如何解决SSH连接问题。 - ivan_onys
这个答案帮助了我解决与你类似的问题。事实上,我能够通过普通的ssh连接甚至通过ansible ping进行连接,但无法启动playbook。对我有帮助的是ansible_ssh_private_key_file属性,因为它没有位于默认目录中。 - Davide Calarco

3

我曾经遇到过这个问题,但是原因与其他答案记录的不同。我尝试部署的主机只能通过跳板机访问。起初,我以为这是因为Ansible没有识别我的SSH配置文件,但实际上已经识别了。对我来说解决方案是确保SSH配置文件中存在的用户与Ansible playbook中的用户匹配。这样就解决了我的问题。


1
完全正确。将 remote_user: root 更改为与 .ssh/config 中的用户匹配后,它就可以工作了。 - Aleks

2
尝试修改您的主机文件为:
192.168.0.10
192.168.0.11
192.168.0.12

1

$ansible -m ping all -vvv

在安装了Ubuntu或CentOS上的ansible后,您可能会收到以下消息。 不要惊慌,您必须具有对用户[/home/user_name/.ansible/tmp/]的/tmp文件的访问权限。"身份验证或权限失败"。

这个预设将解决问题。

[Your_server ~]$ ansible -m ping all
rusub-bm-gt | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
Your_server | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

0

对我来说,使用SSH密钥访问服务器主机是最佳实践。

 

1. 在清单文件夹中创建 hosts 文件

[示例]

example1.com

example2.com

example3.com

 

2. 创建 Ansible Playbook 文件 playbook.yml

---

- 主机:

    - 所有

- 角色:

    - 示例

3. 让我们尝试使用多个服务器主机部署ansible-playbook

ansible-playbook playbook.yml -i inventories/hosts example --user vagrant


0

-1

虚拟机重新加载后,ansible_ssh_port已更改。

==> 默认:正在启动虚拟机...

==> 默认:等待虚拟机启动。可能需要几分钟时间...

default: SSH address: 127.0.0.1:2222

default: SSH username: vagrant

default: SSH auth method: private key

所以我不得不按照以下方式更新库存/主机文件:

default ansible_ssh_host=127.0.0.1 ansible_ssh_port=2222 ansible_ssh_user='centos' ansible_ssh_private_key_file=<key path>

请解释答案与ssh连接问题有什么关系,以及为什么localhost上的vagrant相关。 - ivan_onys

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接