寻求适用于AWS基础设施的Nagios监控Puppet模块及技术指导
作为经常处理Puppet+Nagios部署的开发者,我来给你一步步梳理解决方案,刚好你这两个问题都是新手入门的核心点:
1. 在Puppet模块中定义自定义Nagios服务检查
新手不用从零搭建Nagios模块,社区维护的puppetlabs/nagios模块已经帮你封装了核心资源,基于它来扩展自定义检查非常高效:
先搞定基础依赖
先在你的Puppetfile里添加模块依赖:mod 'puppetlabs/nagios', '>= 9.0.0'然后在Nagios服务器的节点定义中包含核心类:
node 'nagios-server.example.com' { include nagios include nagios::server }定义自定义检查命令
任何服务检查都需要先对应一个Nagios命令,比如你要监控AWS EC2的内存使用率,先创建命令资源:nagios_command { 'check_ec2_memory': command_line => '$USER1$/check_mem -w $ARG1$ -c $ARG2$', # $USER1$是Nagios默认的插件路径,$ARG1$/$ARG2$是可配置的阈值参数 }绑定命令到具体服务
接下来把这个命令关联到目标主机的服务检查:nagios_service { 'ec2_memory_usage': host_name => 'aws-ec2-web01', check_command => 'check_ec2_memory!70!90', # 警告70%,临界90% service_description => 'EC2 Instance Memory Usage', use => 'generic-service', # 继承通用服务模板的配置(比如通知规则) notification_period => '24x7', }进阶:封装成可复用的自定义模块
如果要在多台主机复用这个检查,把它封装成自定义定义更方便。比如创建mynagios模块,在manifests/checks/memory.pp里写:define mynagios::checks::memory( $warning = '70', $critical = '90', $host_name = $title, ) { # 确保命令全局存在 nagios_command { 'check_ec2_memory': command_line => '$USER1$/check_mem -w $ARG1$ -c $ARG2$', } # 创建服务检查 nagios_service { "${host_name}_memory": host_name => $host_name, check_command => "check_ec2_memory!${warning}!${critical}", service_description => "Memory Usage for ${host_name}", use => 'generic-service', } }之后在节点里只需一行调用:
mynagios::checks::memory { 'aws-ec2-web01': },灵活又省心。
2. 通过Puppet填充Nagios主机详情的最优方式
针对AWS这种动态环境,推荐三种结合自动化和灵活性的方案:
方案1:利用Puppet Facts自动注册主机
Puppet客户端会自动上报自身的facts(IP、主机名、OS等),在Nagios服务器上可以基于这些facts自动创建主机资源:# 在Nagios服务器节点配置中 # 遍历所有Puppet客户端的主机资源,自动加入Nagios Puppet::Resource::Catalog.each |$resource| { if $resource.type == 'Host' { nagios_host { $resource.title: address => $resource['ipaddress'], use => 'generic-host', hostgroups => 'aws_ec2_instances', check_command => 'check_ping!100.0,20%!500.0,60%', } } }这种方式适合所有Puppet管理的节点,完全自动,不用手动维护主机列表。
方案2:结合AWS模块动态拉取EC2实例
如果你的EC2实例都是AWS托管的,用puppetlabs/aws模块调用AWS API直接获取实例信息,自动同步到Nagios:# 先引入AWS模块 include aws # 获取带有Production标签的EC2实例 $prod_instances = aws_ec2_instances({'tag:Environment' => 'Production'}) # 遍历实例创建Nagios主机 $prod_instances.each |$instance| { nagios_host { $instance['tags']['Name']: address => $instance['private_ip_address'], # 用内网IP更安全 use => 'generic-host', hostgroups => 'production_ec2_servers', notes => "EC2 Instance ID: ${instance['id']}", } }实例增减时,Puppet会自动更新Nagios的主机配置,完美适配AWS的动态环境。
方案3:用Hiera存储静态/混合主机信息
如果有部分非AWS主机需要手动管理,把主机信息存在Hiera中,再用Puppet读取创建:# 在hiera数据文件(比如common.yaml)中 nagios::managed_hosts: aws-ec2-db01: address: '10.0.2.10' hostgroups: 'database_servers' on-prem-web01: address: '192.168.1.50' hostgroups: 'on_prem_servers'然后在Puppet模块中读取并创建主机:
$managed_hosts = lookup('nagios::managed_hosts', Hash, 'deep', {}) $managed_hosts.each |$host_name, $params| { nagios_host { $host_name: * => $params, use => 'generic-host', } }这种方式兼顾自动化和手动配置,适合混合云环境。
内容的提问来源于stack exchange,提问作者aannjose

