当由ansible而不是手动ssh连接运行时,needrestart的行为不同

当由ansible而不是手动ssh连接运行时,needrestart的行为不同,ansible,Ansible,我试图通过ansible运行该工具,以检查具有过时库的进程。 当我使用ansible中的命令或shell模块运行needstart时,它会说我需要重新启动ssh守护进程。当我手动运行needrestart时,它表示没有包含过时库的进程 当我重新启动ssh守护程序时,这并没有什么区别。但是在重新启动远程服务器后,ssh守护进程不再作为我应该重新启动的服务列出 所以我真的不明白ansible的ssh连接和我的手动ssh连接之间的区别,这导致了不同的needrestart行为 任何帮助都将不胜感激 提

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

当我重新启动ssh守护程序时,这并没有什么区别。但是在重新启动远程服务器后,ssh守护进程不再作为我应该重新启动的服务列出

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

任何帮助都将不胜感激

提前向您表示感谢,并致以最良好的问候
马克斯

我的本地机器

$ 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
$ 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
我正在使用ssh代理连接到服务器:

ansible_ssh_common_args='-o ProxyCommand="ssh -W %h:%p -q user@jumphost.example.com"'
远程服务器

$ cat /etc/debian_version
8.6

$ python -V
Python 2.7.9
使用ansible

$ 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
$ 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
使用SSH

$ ssh example.com 'needrestart -b -l -r l'
NEEDRESTART-VER: 1.2
Killed by signal 1.

看起来您与较旧版本的ssh进程有活动连接。当ssh重新启动时,它不会终止保持活动连接的当前副本。如果它会这样做,那么ssh服务器sudo服务ssh restart将终止活动连接,您的服务器将断开

因此,当您重新启动sshd时,您只重新启动ssh部分,它接受新连接。所有现有连接都由旧ssh提供服务

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

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