needrestart在由ansible而不是手动ssh连接运行时表现不同

Max*_*Max 5 ansible

我试图通过ansible运行needrestart工具来检查过时库的进程.当我使用来自ansible的命令或shell模块运行needstart时,它说我需要重新启动我的ssh守护进程.当我手动运行needrestart时,它表示没有过时库的进程.

当我重新启动ssh守护进程时,它没有任何区别.但重新启动远程服务器后,ssh守护程序未列为服务,我应该重新启动.

所以我真的不明白来自ansible和我的手动ssh连接的ssh连接之间的区别导致了needrestart的不同行为.

任何帮助,将不胜感激!

先谢谢你,最好的问候
Max

我的本地机器

$ python -V
Python 2.7.13

$ ansible --version
ansible 2.2.0.0

$ cat ansible.cfg 
[defaults]
inventory = hosts
ask_vault_pass = True
retry_files_enabled = False
Run Code Online (Sandbox Code Playgroud)

我使用ssh代理连接到服务器:

ansible_ssh_common_args='-o ProxyCommand="ssh -W %h:%p -q user@jumphost.example.com"'
Run Code Online (Sandbox Code Playgroud)

远程服务器

$ cat /etc/debian_version
8.6

$ python -V
Python 2.7.9
Run Code Online (Sandbox Code Playgroud)

使用ansible

$ ansible example.com -m command -a 'needrestart -b -l -r l'
Vault password: 
example.com | SUCCESS | rc=0 >>
NEEDRESTART-VER: 1.2
NEEDRESTART-SVC: ssh.service

$ ansible example.com -m shell -a 'needrestart -b -l -r l'
Vault password: 
example.com | SUCCESS | rc=0 >>
NEEDRESTART-VER: 1.2
NEEDRESTART-SVC: ssh.service
Run Code Online (Sandbox Code Playgroud)

使用SSH

$ ssh example.com 'needrestart -b -l -r l'
NEEDRESTART-VER: 1.2
Killed by signal 1.
Run Code Online (Sandbox Code Playgroud)

Geo*_*lin 0

看起来您与旧版本的 ssh 进程有一个活动连接。当 ssh 重新启动时,它不会终止当前的副本,从而保持活动连接。如果它这样做,ssh servers sudo service ssh restart就会终止活动连接,并且您的服务器将会损坏。

因此,当您这样做时systemctl restart sshd,您只重新启动 ssh-part,它接受新连接。所有现有连接均由旧 ssh 提供服务。

为什么 ansible 在运行之间保持 ssh 旧的 ssh 连接?由于 ControlMaster 功能。它在运行之间保持活动的 ssh 连接以加快新运行的速度。

该怎么办?关闭计算机上活动的 ssh 连接。尝试ps aux|grep ssh一下,您将看到一个充当 ControlMaster 的进程。杀死它,并且应该关闭过时的连接。