0%

ansible异常推送missing sudo password

背景

已经通过管理账号配置好了ansible管理机到被管理机器的ssh免密登录,且sudo免密码 ,但是ansible推送时依然报错 "msg": "Missing sudo password"

错误信息如下

1
2
3
4
Escalation requires password
devops-baseimage-02-vpc | FAILED! => {
"msg": "Missing sudo password"
}

排查过程

1、因为是使用另外一个SA账号A 管理另外一个SA账号B的sa权限(ssh免密登录,且sudo免密)推送,所以确定不是ansible本身的问题

2、单独测试SA账号B的ssh权限和sudo权限都没有问题

ansible-missing-sudo-password

3、有个特殊的情况是,该SA账号B,之前使用Jumpserver的系统账号中的动态用户名 功能,该功能会根据登录用户在Linux主机上面动态创建Jumpserver系统的登录用户同名账号,该SA账号B,就是这种情况,但是在有问题的目标主机删除用户B之后, 用 SA账号A 推送 SA账号B也是成功没有问题的。但是依然报错

4、采用debug排查ansible推送过程

1
ansible devops-baseimage-02-vpc -m ping -vvvv

发现如下信息:

1
2
3
4
5
6
7
... ...
<devops-baseimage-02-vpc> ESTABLISH SSH CONNECTION FOR USER: None
<devops-baseimage-02-vpc> SSH: EXEC ssh -vvv -C -o ControlMaster=auto -o ControlPersist=5d -o StrictHostKeyChecking=no -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o ConnectTimeout=30 -o ControlPath=/home/liuchao/.ansible/cp/b1ea8649fc -tt devops-baseimage-02-vpc '/bin/sh -c '"'"'sudo -H -S -n -u root /bin/sh -c '"'"'"'"'"'"'"'"'echo BECOME-SUCCESS-hpnwhdajnmoqqqnewfbzhjdabvqgchqw ; /usr/bin/python /home/liuchao/.ansible/tmp/ansible-tmp-1635757129.64-233629084265576/AnsiballZ_ping.py'"'"'"'"'"'"'"'"' && sleep 0'"'"''
Escalation requires password
devops-baseimage-02-vpc | FAILED! => {
"msg": "Missing sudo password"
}

其中有个 ControlPath=/home/liuchao/.ansible/cp/b1ea8649fc 引起关注,发现这是个socket文件

1
2
[xxxx@baolei-sa-vm ~]$ ls -l /home/xxxx/.ansible/cp/b1ea8649fc
srw------- 1 xxxx xxxx 0 Nov 1 13:54 /home/xxxx/.ansible/cp/b1ea8649fc

既然是socket文件,肯定是有进程引用

1
2
3
4
[xxxx@baolei-sa-vm ~]$ ps -ef|grep b1ea8649fc
xxxx 12814 1 0 13:55 ? 00:00:00 ssh: /home/xxxx/.ansible/cp/b1ea8649fc [mux]
yyyy 28301 1 0 14:28 ? 00:00:00 ssh: /home/yyyy/.ansible/cp/b1ea8649fc [mux]
xxxx 28635 4716 0 16:59 pts/3 00:00:00 grep --color=auto b1ea8649fc

发现有两个用户共同使用这个socket文件,那么kill掉这两个进程然后测试,推送成功

1
2
3
4
5
6
7
[xxxx@baolei-sa-vm ~]$ ansible devops-baseimage-02-vpc -m ping
[WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see details

devops-baseimage-02-vpc | SUCCESS => {
"changed": false,
"ping": "pong"
}

扩展

  • ControlMaster

是否开启单一网络共享多个 session,值可以为 no(default)/yes/ask/auto。需要和 ControlPath 配合使用,当值为 yes 时,ssh 会监听该路径下的 control socket,多个 session 会去连接该 socket,它们会尽可能的复用该网络连接而不是重新建立新的。

  • ControlPath

指定 control socket 的路径,主要是保证该参数的唯一性

  • ControlPersist

结合 ControlMaster 使用,指定连接打开后后台保持的时间。值可以为 no/yes/整数,单位 s。如果为 no,最初的客户端关闭就关闭。如果 yes/0,无限期的,直到杀死或通过其它机制

参考

SSH Config 那些你所知道和不知道的事