无法以root用户运行Ansible Playbook连接远程主机
关于Ansible连接webserver1失败的问题排查
1. 运行的Playbook内容
- name: "This is service play" hosts: webserver1 tasks: - name: "start apache2 service" service: name: apache2 state: started #stopped
2. 执行Playbook时的错误输出
root@kubemaster:/etc/ansible/playbook/modules/service# ansible-playbook apache2.yml [WARNING]: * Failed to parse /etc/ansible/inventory/inventory.txt with ini plugin: /etc/ansible/inventory/inventory.txt:12: Section [all_servers:children] includes undefined group: sql_servers [WARNING]: Unable to parse /etc/ansible/inventory/inventory.txt as an inventory source [WARNING]: No inventory was parsed, only implicit localhost is available PLAY [This is service play] ***************************************************************************************************************************************** TASK [Gathering Facts] ********************************************************************************************************************************************** fatal: [webserver1]: UNREACHABLE! => {"changed": false, "msg": "Invalid/incorrect password: Permission denied, please try again.", "unreachable": true} PLAY RECAP ********************************************************************************************************************************************************** webserver1 : ok=0 changed=0 unreachable=1 failed=0 skipped=0 rescued=0 ignored=0
3. Inventory文件内容
root@kubemaster:/etc/ansible/playbook/modules/service# cat ../../../inventory/inventory.txt webserver1 ansible_host=192.168.1.12 ansible_ssh_pass=sneha ansible_connection=ssh ansible_port=22 ansible_user=root sqlserver1 ansible_host=192.168.1.11 ansible_ssh_pass=sneha ansible_connection=ssh ansible_port=22 ansible_user=ahens [web_servers] websever1 [sql_server] sqlserver1 [all_servers:children] web_servers sql_servers
4. 已尝试的排查操作
- 开启远程主机root的SSH访问,编辑
/etc/ssh/sshd_config文件,将PermitRootLogin和PasswordAuthentication选项设为yes,并重启SSH服务 - 检查远程主机防火墙规则,当前防火墙处于未激活状态(也曾尝试激活防火墙并允许SSH服务)
- 手动通过SSH连接远程主机验证凭据:普通用户ahens可正常登录,但root用户登录时提示权限拒绝,确认凭据无误
- 尝试ping远程主机,结果正常
问题根源
- Inventory文件语法错误:
[web_servers]组下的主机名拼写错误:写成websever1,实际应为webserver1[all_servers:children]中引用的sql_servers组不存在,Inventory里实际组名为sql_server(少一个s),导致Inventory解析失败,Ansible仅能识别localhost,这也是警告信息的来源
- root用户SSH登录失败:
虽修改了sshd_config,但可能存在以下情况:- 修改配置后未正确重启SSH服务
- 远程主机root密码存在误差(可尝试重置确认)
/etc/ssh/sshd_config.d/目录下的额外配置文件覆盖了主配置,禁止root登录
解决步骤
第一步:修复Inventory文件错误
修改inventory.txt内容如下:
webserver1 ansible_host=192.168.1.12 ansible_ssh_pass=sneha ansible_connection=ssh ansible_port=22 ansible_user=root sqlserver1 ansible_host=192.168.1.11 ansible_ssh_pass=sneha ansible_connection=ssh ansible_port=22 ansible_user=ahens [web_servers] webserver1 # 修正拼写错误 [sql_servers] # 修正组名 sqlserver1 [all_servers:children] web_servers sql_servers
第二步:确保root用户可SSH登录远程主机
- 用ahens用户登录远程主机,检查SSH配置:
# 查看PermitRootLogin设置 grep -i "PermitRootLogin" /etc/ssh/sshd_config /etc/ssh/sshd_config.d/*.conf # 查看PasswordAuthentication设置 grep -i "PasswordAuthentication" /etc/ssh/sshd_config /etc/ssh/sshd_config.d/*.conf
确保输出均为yes。
2. 重启SSH服务:
sudo systemctl restart sshd
- 若仍无法登录,重置root密码:
sudo passwd root
设置新密码后再次尝试SSH登录root用户。
第三步:重新执行Playbook
修复上述问题后,重新运行命令:
ansible-playbook apache2.yml
内容的提问来源于stack exchange,提问作者ahens000
相关产品推荐
相关产品推荐

