ansible-playbook推送时常见的几种错误以及解决方法(Linux)
前言
由于要推送的目标服务器,系统的不统一和初始化环境的不统一,导致使用ansible-playbook推送的时候遇到了一些问题,于是对一些常见报错进行总结.
目标服务器目录不存在
报错如下:
FAILED! => {"changed": false, "msg": "dest '/xxx/xxx/' must be an existing dir"
上面的报错告知目标服务器不存在该目录,你需要去目标服务器去创建.
通常出现此问题的原因为你要推送的目录不是服务器自带的,而是自行创建的,在对该系统参数初始化的时候,并未创建自定义目录
解决方法:
<1>ansible-playbook的yml中对目标目录(dest)进行调整,调整为每个系统必存在的目录;
- name: "推送 node_exporter 安装包"
unarchive:
src: "../files/node_exporter-1.1.0.linux-amd64.tar.gz"
dest: "/data/"
owner: root
group: root
tags:
- install
- cpconf
<2>或对那一批不符合统一原则的服务器, 统一目录创建
目标服务器创建软链接失败
报错如下:
FAILED! => {"changed": false, "msg": "Error while linking: [Errno 2] No such file or directory", "path": "/xxx/xxxx/"}
上面的报错告知目标服务器创建软链接失败,需要去目标服务器去创建试一下看有什么报错.
通常出现此问题的原因为目标服务器要生成链接的目录不存在
解决方法:
<1>ansible-playbook的yml中对目标目录(dest)进行调整,调整为每个系统必存在的目录;
- name: "软链接"
file: src=/data/node_exporter-1.1.0.linux-amd64 dest=/usr/local/node_exporter state=link
<2>或对那一批不符合统一原则的服务器, 统一目录创建
<3>有很小的机率是目录所在的分区出现异常.需要修复或重新初始化和挂载
目标服务器连接超时
报错如下:
UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: ssh: connect to host xxx.xxx.xxx.xxx port 22: Connection timed out", "unreachable": true}
上面的报错告知ssh目标服务器连接超时
通常出现此问题的原因为目标服务器IP并不存在;目标服务器的ssh端口有调整非22;目标服务器与ansible服务器存在网络隔离
解决方法:
查看具体问题是以上哪种原因.
<1>IP不存在的不再推送
<2>目标服务器有端口调整的,可调整推送时使用的hosts,对 对应IP自定义端口和登录用户
[servers]
111.111.111.111
123.123.123.123 ansible_ssh_host=123.123.123.123 ansible_ssh_port=2222 ansible_ssh_user="user"
222.21.220.100
or
[port22]
111.111.111.111
222.21.220.100
[port2222]
123.123.123.123
[port2222:vars]
ansible_ssh_user="user"
ansible_ssh_port=2222
<3>目标服务器与ansible服务器存在网络隔离的
查看隔离方式是iptables,tcp_warpper?是否可解除隔离?不可解除,只能单个安装服务
目标服务器需要密码
报错如下:
UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: Warning: Permanently added 'xxx' (ECDSA) to the list of known hosts.\r\nPermission denied (publickey,gssapi-keyex,gssapi-with-mic,password).", "unreachable": true}
上面的报错告知ssh连接失败,需要密码
通常出现此问题的原因为ansible服务器未对目标服务器做免密登录,需要输入密码
解决方法:
<1>ansible服务器对目标服务器推送公钥
ssh-copy-id 100.100.100.100
<2>可调整推送时使用的hosts,对 对应IP自定义端口和登录用户,密码
[servers]
111.111.111.111
123.123.123.123 ansible_ssh_host=123.123.123.123 ansible_ssh_port=2222 ansible_ssh_user="user" ansible_ssh_pass="密码"
222.21.220.100
这种方法是不安全的,容易泄露密码.如果要用建议在使用后,sed去除密码字段或将密码修改为错误
目标服务器的目录没有权限
报错如下:
FAILED! => {"changed": false, "dest": "/xxx/xxx", "extract_results": {"cmd": ["/bin/gtar", "--extract", "-C", "/xxx/xxx/", "-z", "--owner=root", "--group=root", "-f", "/root/.ansible/tmp/ansible-tmp-1632705973.812-45658074380384/source"], "err": "/bin/gtar: root: Invalid group\n/bin/gtar: Error is not recoverable: exiting now\n", "out": "", "rc": 2}, "gid": 0, "group": "0", "handler": "TgzArchive", "mode": "0755", "msg": "failed to unpack /root/.ansible/tmp/ansible-tmp-1632705973.812-45658074380384/source to /xxx/xxx/", "owner": "root", "size": 4096, "src": "/root/.ansible/tmp/ansible-tmp-1632705973.812-45658074380384/source", "state": "directory", "uid": 0}
上面的报错,提示 目标服务器 某目录 的权限有问题,导致执行失败
通常出现此问题的原因为目标服务器的目标目录权限设置问题或目标服务器的用户出现了异常
解决方法:
(下方目录仅为示例)
<1>进入目标服务器查看目录的权限
ll /data/*
<2>根据需求进行合适的授权
chown -R root.root /data/
chmod 755 /data/
<3>修复权限
如果授权时提示无效的用户,且查看目录权限时属组和属主有一个存在该用户,一个为空
chown: 无效的用户: “root.root”
证明以下文件被篡改或误修改了,查看其他正常的服务器的配置,vim进行添加
/etc/passwd /etc/passwd- /etc/group /etc/group- /etc/shadow /etc/shadow-
如果真的是没有这个用户,使用useradd进行创建.
目标服务器分区异常
报错如下:
FAILED! => {"changed": false, "dest": "/xxx/xxx/", "extract_results": {"cmd": ["/usr/bin/gtar", "--extract", "-C", "/xxx/xxx/", "-z", "--owner=root", "--group=root", "-f", "/root/.ansible/tmp/ansible-tmp-1632731586.3268335-190621625693206/source"], "err": "/usr/bin/gtar: node_exporter-1.1.0.linux-amd64/LICENSE: Cannot change ownership to uid 3434, gid 3434: Operation not permitted\n/usr/bin/gtar: node_exporter-1.1.0.linux-amd64/NOTICE: Cannot change ownership to uid 3434, gid 3434: Operation not permitted\n/usr/bin/gtar: node_exporter-1.1.0.linux-amd64/node_exporter: Cannot change ownership to uid 3434, gid 3434: Operation not permitted\n/usr/bin/gtar: node_exporter-1.1.0.linux-amd64: Cannot change ownership to uid 3434, gid 3434: Operation not permitted\n/usr/bin/gtar: Exiting with failure status due to previous errors\n", "out": "", "rc": 2}, "gid": 0, "group": "root", "handler": "TgzArchive", "mode": "0755", "msg": "failed to unpack /root/.ansible/tmp/ansible-tmp-1632731586.3268335-190621625693206/source to /xxx/xxx/", "owner": "root", "size": 32768, "src": "/root/.ansible/tmp/ansible-tmp-1632731586.3268335-190621625693206/source", "state": "directory", "uid": 0}
这个报错和前一个报错是一个也是提示 目标服务器 某目录 的权限有问题
出现此问题的另一个原因是目标服务器的目录所在的分区异常.当查看目标服务器的目录的权限正常,磁盘剩余空间正常,可能是分区导致.
解决方法:
<1>进入该目录的分区创建链接
ln -s /data/online/test /data/one/test
ln: failed to create symbolic link ‘/data/online/test’: Operation not permitted
存在此目录,却报出不允许此操作
<2>查看挂载和文件系统格式
df -Th
lsblk
blkid
<3>重新初始化分区,重新挂载
目标服务器没有空间
报错如下:
FAILED! => {“msg”: “failed to transfer file to /root/.ansible/tmp/ansible-local-43079sok0hn39/tmppplcxi7_ /root/.ansible/tmp/ansible-tmp-1632734070.5292003-159857027044586/AnsiballZ_setup.py:\n\ndd: 写入”/root/.ansible/tmp/ansible-tmp-1632734070.5292003-159857027044586/AnsiballZ_setup.py" 出错: 设备上没有空间\n记录了3+0 的读入\n记录了2+0 的写出\n131072字节(131 kB)已复制,0.00194383 秒,67.4 MB/秒\n"}
上面的报错可知目标服务器设备上没有空间
解决方法:
<1>清理目标服务器的磁盘空间
目标服务器无法解析主机或域名
报错如下:
curl: (6) Could not resolve host: xxx.xxx; Name or service not known"], "stdout": "", "stdout_lines": []}
常见于ansible部署服务后请求api或网址
解决方法:
<1>为目标服务器添加hosts解析或修改dns
更多推荐
所有评论(0)