很多运维小伙伴在接收到“把上百台服务器统一接入夜莺监控”的需求时,第一反应是头疼——一台台装agent太费时间,手动改配置还容易出错,这时候Ansible就成了救星,但实际操作中踩坑的人不少,今天就把我踩过的、整理的完整流程和避坑点说清楚。
一、应用场景与技术优缺点
1.1 适用的业务场景
当公司有10台以上的Linux主机需要接入夜莺监控系统时,不管是新集群的初始化监控,还是老集群的扩容纳管,用Ansible批量部署agent都能大幅提升效率,尤其是跨机房的服务器,手动一台台操作的成本极高,批量操作就能节省至少80%的时间。
1.2 技术的优缺点
优点:实现了配置标准化,每台主机的agent版本、配置完全一致,避免人为失误;支持批量操作,适配大规模服务器集群;可复用性强,下次新增主机时只要修改Inventory文件就能再次执行。 缺点:需要提前打通控制节点与被管主机的SSH信任,网络或权限问题会导致批量操作失败;依赖控制节点的Ansible环境,控制节点故障会影响批量操作;Agent与夜莺服务端的版本需要严格匹配,否则会出现上报数据异常。
二、部署前的准备工作
2.1 环境搭建验证
首先需要在一台CentOS或Ubuntu系统上安装Ansible,控制节点和被管主机之间需要网络连通,控制节点要持有每台被管主机的SSH私钥。先通过Ansible的ping模块验证连通性,示例:
# 在Ansible控制节点执行,测试所有被管主机的连通性
ansible all -m ping -i inventory.ini
Inventory文件是记录被管主机的列表,比如inventory.ini的内容:
[nightingale_targets]
192.168.1.10 ansible_ssh_user=root ansible_ssh_private_key_file=./deploy_key.pem
192.168.1.11 ansible_ssh_user=root ansible_ssh_private_key_file=./deploy_key.pem
192.168.1.12 ansible_ssh_user=root ansible_ssh_private_key_file=./deploy_key.pem
这里要注意,私钥路径要正确,权限要设为600,否则Ansible会报错。
2.2 前置检查项
- 控制节点的Ansible版本在2.9以上,过低的版本可能不支持某些模块;
- 被管主机的SSH服务已启动,22端口对外开放;
- 提前下载好对应版本的夜莺agent包,官方github的release页面可以找到稳定版,比如v0.21.0。
三、批量部署agent的完整步骤与避坑指南
3.1 批量下载agent包到被管主机
用Ansible的shell模块批量执行wget命令,把agent包下载到每台主机的/tmp目录,示例:
# 批量下载v0.21.0版本的agent到/tmp目录
ansible nightingale_targets -m shell -a "wget https://github.com/nightingale-monitor/agent/releases/download/v0.21.0/agent-linux-amd64.tar.gz -P /tmp"
避坑点:不要用curl代替wget,部分精简的Linux系统(比如最小化安装的CentOS)默认不装curl,而wget是通用的;下载路径选/tmp,安装后可以自动清理,不会占用主机的磁盘空间。
3.2 解压并移动agent到指定目录
批量解压agent包到/usr/local目录,并重命名为统一的n9e-agent,示例:
# 解压并整理agent目录,先判断目标路径是否存在
ansible nightingale_targets -m shell -a "[ -d /usr/local ] || mkdir -p /usr/local && tar -zxf /tmp/agent-linux-amd64.tar.gz -C /usr/local && mv /usr/local/agent-linux-amd64 /usr/local/n9e-agent"
避坑点:一定要先判断/usr/local路径是否存在,要是不存在就创建,否则tar解压会失败,很多人这里忘加判断,导致解压报错,还找不到原因;重命名是为了统一路径,方便后续配置和管理,避免不同主机的路径不一致。
3.3 配置agent对接夜莺服务端
批量修改agent的配置文件config.yml,把server地址改成自己的夜莺服务端IP,示例:
# 批量修改agent配置,替换夜莺服务端地址
ansible nightingale_targets -m shell -a "sed -i 's/server: \"127.0.0.1:19000\"/server: \"192.168.1.100:19000\"/' /usr/local/n9e-agent/config.yml"
避坑点:server地址不能写成localhost或127.0.0.1,因为被管主机是远程的,无法通过这个地址找到夜莺服务端;端口必须和夜莺服务端的agent上报端口一致,默认是19000,如果夜莺服务端改了端口,这里也要对应修改;另外可以自定义主机名,避免夜莺里出现重复主机,示例:
# 批量设置agent的主机名为对应主机的hostname,避免重复
ansible nightingale_targets -m shell -a "sed -i 's/hostname: \"\"/hostname: \"{{ ansible_hostname }}\"/' /usr/local/n9e-agent/config.yml"
这里的{{ ansible_hostname }}是Ansible的内置变量,会自动获取每台被管主机的主机名,这样每台主机的标识就唯一了。
3.4 配置systemd服务并启动
把agent做成systemd服务,设置开机自启,示例:
# 批量创建systemd服务文件
ansible nightingale_targets -m shell -a "cat > /etc/systemd/system/n9e-agent.service << EOF
[Unit]
Description=Nightingale Monitoring Agent
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/n9e-agent/n9e-agent -c /usr/local/n9e-agent/config.yml
Restart=always
RestartSec=5
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
EOF
"
# 批量重载systemd,启动并设置开机自启
ansible nightingale_targets -m shell -a "systemctl daemon-reload && systemctl start n9e-agent && systemctl enable n9e-agent"
避坑点:必须先执行systemctl daemon-reload,否则systemd找不到新创建的服务文件,导致启动失败;ExecStart的路径要写绝对路径,不能用相对路径,因为systemd的工作目录可能不是agent的目录;加上LimitNOFILE的配置是为了避免agent因为文件描述符不够而崩溃,这个配置很重要,很多生产环境里agent经常崩溃就是因为这个。
3.5 验证agent的正常运行
部署完成后,要验证每台主机的agent是否正常运行,有没有上报数据,示例命令:
# 批量检查agent进程状态
ansible nightingale_targets -m shell -a "ps aux | grep n9e-agent | grep -v grep"
# 批量检查agent日志有没有错误
ansible nightingale_targets -m shell -a "tail -n 20 /usr/local/n9e-agent/log/n9e-agent.log"
如果进程存在,日志里没有error级别的信息,就说明部署成功;要是日志里有“connection refused”的错误,说明被管主机和夜莺服务端之间的19000端口不通,需要检查防火墙规则。
四、常见踩坑的深度解析
4.1 权限类踩坑
最常见的就是SSH权限问题,比如Ansible控制节点的私钥没有放到被管主机的authorized_keys里,或者私钥权限不对(要求600),执行ansible ping的时候会显示“Permission denied”,解决方法是在控制节点执行ssh-copy-id root@被管IP,把公钥传过去,或者在Inventory里正确配置SSH的用户名和私钥路径,不要用明文密码,避免安全隐患。
4.2 配置类踩坑
比如agent的server地址写错,或者主机名重复,还有配置文件里的timeout设置太短,导致上报不稳定;还有一个坑是agent的日志路径,默认是./log,也就是agent运行目录下的log,要是agent启动失败,找不到日志,就没法排查问题,所以配置的时候要确认日志路径正确,或者手动创建log目录,比如在部署步骤里加上:
# 批量创建agent日志目录,避免启动失败
ansible nightingale_targets -m shell -a "mkdir -p /usr/local/n9e-agent/log"
这个小步骤很多人忘加,导致agent启动时因为找不到log目录而报错,却不知道为什么。
4.3 网络类踩坑
除了控制节点和被管主机的22端口,还要检查被管主机和夜莺服务端之间的19000端口是否开放,用nc命令批量测试:
# 批量测试被管主机到夜莺服务端的19000端口连通性
ansible nightingale_targets -m shell -a "nc -zv 192.168.1.100 19000 || echo '端口不通'"
如果显示“succeeded!”就通了,要是显示“timeout”,就是中间有防火墙拦截,需要让运维人员放开19000端口的TCP连接。
五、总结
用Ansible批量纳管主机到夜莺监控,核心是“提前准备、统一配置、小范围测试后批量操作”,不要盲目直接操作所有主机,先找一两台主机测试一遍,确认所有步骤都没问题,再批量执行,避免影响整个集群的监控。这种方式适合大规模服务器的监控接入,能把原本需要几小时的工作压缩到十几分钟,而且配置的一致性很高,几乎不会出现人为失误。生产环境里,超过30台主机的时候,用Ansible的收益会非常明显,不仅节省时间,还能减少监控数据的错误,提高运维效率。
评论
围绕“Ansible批量纳管主机到夜莺:自动化配置与agent部署的避坑指南”参与讨论