Ansible报错整理

在使用Ansible管理远程主机时遇到权限拒绝错误,原因是缺少SSH认证信息。解决步骤包括:1) 在管理节点生成SSH密钥;2) 将公钥添加到目标主机的authorized_keys文件中;3) 如果出现Host Key检查问题,可在ansible.cfg中禁用host_key_checking。


问题描述:

在ansible安装完毕后一般需要以SSH的方式连接到需要进行管理的目标主机,一开始遇到了如下问题:

120.76.25.191 | UNREACHABLE! => {
    "changed": false,
    "msg": "Failed to connect to the host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).\r\n",
    "unreachable": true
}
120.76.78.194 | UNREACHABLE! => {
    "changed": false,
    "msg": "Failed to connect to the host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).\r\n",
    "unreachable": true

问题原因很简单,没有在ansible管理节点(即安装ansible的节点)上添加目标节点(即需要管理的节点)的ssh认证信息。

解决步骤:

1:管理节点生成SSH-KEY

#ssh-keygen

成功后在~/.ssh/路径下将生成ssh密钥文件:id_rsa及id_rsa.pub

 

2:添加目标节点的SSH认证信息

#ssh-copy-id root@目标节点IP

这里root是在目标节点上登录的用户,@符号后面接目标节点IP即可,之后会提示输入目标节点root用户密码,输入即可。

添加认证信息后,目标节点主机的~/.ssh/目录下将会出现一个authorized_keys文件,里面包含了ansible管理节点的公钥信息,可以检查一下是否存在。

3:在确定目标主机的SSH认证信息都已正确添加且目标主机的~/.ssh/目录都存在管理节点的公钥信息后,再执行之前出错的ansible ping指令:

#ansible -m ping all

120.76.25.191 | SUCCES对之前未连接的主机进行连结时报错如下:S => {
    "changed": false,
    "ping": "pong"
}
120.76.78.194 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}


问题描述:

对之前未连接的主机进行连结时报错如下:

[root@puppet ~]# ansible webservers -m command -a 'ls ~' -k
SSH password:
120.76.25.191 | FAILED | rc=0 >>
Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this.  Please add this host's fingerprint to your known_hosts file to manage this host.

解决步骤:

修改ansible.cfg文件

vi /etc/ansible/ansible.cfg

找到以下行,让host_key_checking=False这行生效

# uncomment this to disable SSH key host checking
host_key_checking = False


<think>好的,我现在需要帮助用户解决Ansible无法解析inventory文件的问题,显示“inventory parsing failed verify_file declined”。首先,我得理清楚可能的原因和排查步骤。 用户的问题是关于Ansible在解析inventory文件时失败,提示无法验证文件。根据系统级指令,我需要用中文回答,结构清晰,分步骤解决,同时生成相关问题,并正确引用给定的参考资料。先回顾用户提供的引用内容,看看是否有相关线索。 引用[3]提到了开启Ansible的debug和log功能,这应该是排查的第一步。用户需要设置环境变量来启用详细日志,这样可以查看具体的错误信息。另外,引用[4]提到了Ansible执行过程中建立SSH连接和加载模块的步骤,可能与inventory文件是否正确配置有关。 接下来,可能的错误原因包括: 1. inventory文件路径不正确,Ansible找不到文件。 2. 文件权限问题,Ansible没有读取权限。 3. 文件格式错误,比如YAML语法错误或INI格式不正确。 4. inventory插件未正确识别文件类型,需要检查文件扩展名或内容结构。 根据用户提到的错误信息“verify_file declined”,这通常表示Ansible的inventory插件无法识别该文件为有效的inventory文件。可能的原因包括文件扩展名不被支持,或者文件内容不符合插件的要求。 现在,我需要整理出具体的排查步骤: 第一步,检查文件路径是否正确,用户是否在命令中正确指定了inventory文件。例如,使用`-i`参数时路径是否正确。 第二步,验证文件权限,确保Ansible进程有读取该文件的权限。可以用`ls -l`查看权限,并用`chmod`调整。 第三步,检查文件格式是否正确。如果使用INI格式,需要确保组和主机的正确声明;如果是YAML格式,需要符合缩进和结构要求。例如,是否存在语法错误,比如未闭合的括号或错误的缩进。 第四步,尝试使用`ansible-inventory`命令验证文件。例如,`ansible-inventory -i inventory_file --list`,这会输出解析后的结果,如果有错误会显示具体信息。 第五步,启用Ansible的调试日志,设置`ANSIBLE_DEBUG=True`和`ANSIBLE_LOG_PATH`来捕获详细日志,分析哪里出了问题。根据引用[3]的方法,用户可以开启日志记录,查看更详细的错误信息。 第六步,检查文件扩展名。某些Ansible版本可能依赖文件扩展名来决定使用哪个inventory插件。比如,如果文件是YAML格式,但扩展名是`.ini`,可能会导致解析失败。尝试将扩展名改为`.yml`或`.yaml`。 第七步,验证是否存在其他冲突配置。比如,在ansible.cfg中可能指定了默认的inventory路径,导致用户指定的文件被忽略。检查ansible.cfg文件中的`inventory`参数,确认是否覆盖了默认设置。 第八步,测试使用静态inventory内容。例如,直接在命令行中使用`-i 'localhost,'`来测试是否与动态inventory文件有关的问题。 在生成相关问题的时候,需要围绕用户可能遇到的类似问题,比如权限问题、配置检查、动态inventory处理等。例如,如何检查Ansible配置,或者如何处理动态inventory脚本的调试。 最后,确保回答中引用了正确的引用资料,如引用[3]关于开启调试日志,引用[4]关于执行过程可能涉及的步骤。</think>### 排查Ansible无法解析inventory文件的步骤 当Ansible报错“inventory parsing failed verify_file declined”时,通常表示无法正确识别或解析指定的inventory文件。以下是逐步排查方法: --- #### 1. **验证文件路径与权限** - **检查文件路径**:确认`-i`参数指定的路径正确,例如: ```bash ansible -i /path/to/inventory.ini all -m ping ``` 若路径包含特殊字符(如空格),需用引号包裹。 - **检查文件权限**:运行`ls -l /path/to/inventory.ini`查看权限。确保用户对文件有读取权限: ```bash chmod 644 /path/to/inventory.ini # 赋予读写权限 ``` --- #### 2. **检查文件格式与内容** - **INI格式示例**: ```ini [webservers] 192.168.1.10 ansible_user=admin ``` 需确保组名用`[]`包裹,主机列表正确缩进。 - **YAML格式示例**: ```yaml all: hosts: 192.168.1.10: ansible_user: admin ``` 需注意缩进和冒号的使用,避免语法错误。 --- #### 3. **使用`ansible-inventory`命令验证** 执行以下命令查看解析结果: ```bash ansible-inventory -i /path/to/inventory.ini --list ``` 若输出中包含`"errors": [...]`字段,说明文件内容存在语法问题[^3]。 --- #### 4. **启用调试日志** 根据引用[3],通过环境变量启用详细日志: ```bash export ANSIBLE_DEBUG=True # 开启调试模式 export ANSIBLE_LOG_PATH=~/ansible.log # 指定日志路径 ansible -i inventory.ini all -m ping # 复现问题后检查日志 ``` 日志中会明确提示插件拒绝文件的原因(如格式不匹配)。 --- #### 5. **检查文件扩展名与插件兼容性** - Ansible通过文件扩展名(如`.ini`、`.yml`)选择解析插件。若文件内容为YAML但扩展名为`.ini`,可能导致解析失败。 - **解决方案**:将文件扩展名改为`.yml`,或显式指定插件类型: ```ini # inventory.ini plugin: aws_ec2 # 明确使用动态inventory插件 regions: - us-east-1 ``` --- #### 6. **排查配置冲突** - 检查`ansible.cfg`中的默认inventory路径: ```ini [defaults] inventory = /etc/ansible/hosts # 可能覆盖命令行参数 ``` - **临时覆盖配置**: ```bash ansible -i /custom/inventory.ini all -m ping ``` --- #### 7. **测试静态inventory** 使用简单内容排除动态inventory干扰: ```bash ansible -i 'localhost,' all -m ping # 直接指定主机 ``` 若成功,说明原inventory文件存在配置问题。 --- ### 常见原因总结 | 原因 | 解决方案 | |---------------------|---------------------------------| | 文件路径错误 | 使用绝对路径或检查拼写 | | 文件权限不足 | `chmod 644 inventory.ini` | | 语法错误 | 用`ansible-inventory --list`验证 | | 插件兼容性问题 | 调整扩展名或显式指定插件类型 |
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值