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

时间:2017-01-12 20:01:34

标签: ansible

我正在尝试通过ansible运行needrestart工具来检查具有过期库的进程。 当我使用来自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

我正在使用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

$ 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.

1 个答案:

答案 0 :(得分: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的流程。杀了它,过时的连接应该关闭。