如何在last日志中忽略特定主机?解决Ansible登录记录干扰问题
我来分享几个实用的解决思路,帮你摆脱Ansible登录记录的干扰——毕竟满屏的自动化操作记录确实会打乱你排查真实用户登录的节奏。
方案1:快速过滤last输出(最简单临时方案)
如果你只是想临时屏蔽这些记录,不需要修改系统或Ansible配置,直接在执行last时过滤掉来自Ansible主机的条目即可:
last root | grep -v "ansiblehost.mydomain"
或者你可以给这个过滤命令设置一个别名,方便日常使用:
echo 'alias last_real="last | grep -v ansiblehost.mydomain"' >> ~/.bashrc source ~/.bashrc
之后直接输入last_real就能看到过滤后的登录记录了。
方案2:从源头阻止Ansible登录记录写入wtmp
如果想彻底不让这些记录生成,可以通过修改PAM配置,让来自Ansible主机的root登录不被记录到utmp/wtmp文件(last命令就是读取这些文件的内容)。
- 编辑SSH服务的PAM配置文件(多数发行版路径为
/etc/pam.d/sshd):
vi /etc/pam.d/sshd
- 找到包含
pam_utmp.so的session行,修改为以下内容(添加host=-ansiblehost.mydomain参数排除指定主机):
session optional pam_utmp.so host=-ansiblehost.mydomain
- 重启SSH服务使配置生效:
# systemd系统 systemctl restart sshd # SysVinit系统 service sshd restart
注意:修改PAM配置前最好备份原文件,避免配置错误导致登录问题。另外,部分旧版本的pam_utmp可能不支持
host参数,你可以先执行man pam_utmp确认参数支持情况。
方案3:为Ansible创建专用操作用户(更安全的长期方案)
用root直接执行Ansible操作不仅会产生大量干扰记录,还存在安全风险。建议创建一个专用的Ansible操作用户,配置sudo权限后用该用户执行自动化任务:
- 在目标服务器创建专用用户:
useradd -m ansible passwd -l ansible # 禁用密码登录,只允许密钥登录
- 配置sudo免密权限:
echo 'ansible ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers.d/ansible chmod 0440 /etc/sudoers.d/ansible
- 在Ansible配置中指定该用户(修改
ansible.cfg或在playbook中设置remote_user: ansible):
[defaults] remote_user = ansible
之后Ansible的操作都会用ansible用户登录,执行sudo切换到root。此时last记录的是ansible用户的登录,你可以直接过滤该用户的记录,或者同样用PAM配置屏蔽该用户的登录记录,同时也符合最小权限的安全原则。
方案4:优化Ansible SSH连接参数减少记录
通过调整Ansible的SSH连接参数,使用连接复用功能,减少每次任务创建新SSH会话的次数,从而减少登录记录:
修改ansible.cfg中的ssh_connection段:
[ssh_connection] ssh_args = -o ControlMaster=auto -o ControlPersist=300s -o LogLevel=QUIET control_path = ~/.ansible/cp/%%h-%%p-%%r
ControlPersist会保持SSH连接一段时间,后续任务复用已有连接,避免频繁创建新会话生成记录;LogLevel=QUIET也会减少不必要的日志输出。
内容的提问来源于stack exchange,提问作者paxamus

