168 lines
		
	
	
	
		
			5.6 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			168 lines
		
	
	
	
		
			5.6 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| ---
 | |
| date: 2014-12-18
 | |
| title: Installing and Managing Sensu with Puppet
 | |
| category: devops
 | |
| ---
 | |
| 
 | |
| As promised in the [previous
 | |
| post](/blog/2014/11/18/installing-rabbitmq-on-centos-7/), I thought I
 | |
| would share my Sensu/Puppet config. This is based on the Puppet
 | |
| infrastucture I decribed
 | |
| [here](/blog/2014/06/25/super-slick-agile-puppet-for-devops/) so
 | |
| everything goes into Hiera.
 | |
| 
 | |
| <!-- more -->
 | |
| For reasons best known to me (or my DHCP server) my Sensu host is on
 | |
| 192.168.1.108.
 | |
| 
 | |
| First your `Puppetfile` tells R10k to install the Sensu module, plus a
 | |
| few more:
 | |
| 
 | |
|     mod 'nanliu/staging'
 | |
|     mod 'puppetlabs/rabbitmq'
 | |
|     mod 'sensu/sensu'
 | |
| 
 | |
|     mod 'redis',
 | |
|     :git => 'https://github.com/chriscowley/chriscowley-redis.git',
 | |
|     :commit => '208c01aaf2435839ada26d3f7187ca80517fa2a8
 | |
| 
 | |
| I tend to put my classes and their parameters in Hiera. My
 | |
| `hieradata/common.yaml` contains:
 | |
| 
 | |
|     ---
 | |
|     classes:
 | |
|     - rabbitmq
 | |
|     - redis
 | |
|     - sensu
 | |
|     rabbitmq::port: '5672'
 | |
|     sensu::install_repo: true
 | |
|     sensu::purge_config: true
 | |
|     sensu::rabbitmq_host: 192.168.1.108
 | |
|     sensu::rabbitmq_password: password
 | |
|     sensu::rabbitmq_port: 5672
 | |
|     sensu::rabbitmq_vhost: '/sensu'
 | |
|     sensu::use_embedded_ruby: true
 | |
|     sensu::subscriptions:
 | |
|       - base
 | |
| 
 | |
| This will do all the configuration for all your nodes. More
 | |
| specifically:
 | |
| 
 | |
| -   tells RabbitMQ to communicate on 5672/TCP
 | |
| -   Installs Sensu from their own repo
 | |
| -   All Sensu config will be controlled by Puppet
 | |
| -   Configures the Sensu client:
 | |
| -   RabbitMQ host is 192.168.1.108
 | |
| -   password is `password`
 | |
| -   RabbitMQ server is listening on 5672/TCP
 | |
| -   RabbitMQ vhost is /sensu
 | |
| -   Run plugins using Ruby embedded with Sensu, not system. This comes
 | |
|     with the *sensu-plugins* gem which is required by any community
 | |
|     plugins.
 | |
| -   Subscribe to the `base` set of plugins
 | |
| 
 | |
| Next up, to configure your master, ensure that
 | |
| `hieradata/nodes/monitor.whatever.com.yaml` contains:
 | |
| 
 | |
|     ---
 | |
|     classes:
 | |
|     sensu::server: true
 | |
|     sensu::api: true
 | |
| 
 | |
| This does not do everything though. All we have done here is install and
 | |
| enable the Sensu server and API. Unfortunately, I have not really
 | |
| settled on a good way of getting defined types into Hiera, so now we
 | |
| jump into `manifests/site.pp`.
 | |
| 
 | |
|     node default inherits basenode {
 | |
|       package { 'wget':
 | |
|         ensure => installed,
 | |
|       }
 | |
|       package { 'bind-utils':
 | |
|         ensure => installed,
 | |
|       }
 | |
|       file { '/opt/sensu-plugins':
 | |
|         ensure => directory,
 | |
|         require => Package['wget']
 | |
|       }
 | |
|       staging::deploy { 'sensu-community-plugins.tar.gz':
 | |
|         source => 'https://github.com/sensu/sensu-community-plugins/archive/master.tar.gz',
 | |
|         target => '/opt/sensu-plugins',
 | |
|         require => File['/opt/sensu-plugins'],
 | |
|       }
 | |
|       sensu::handler { 'default':
 | |
|         command => 'mail -s \'sensu alert\' ops@foo.com',
 | |
|       }
 | |
|       sensu::check { 'check_cron':
 | |
|         command => '/opt/sensu-plugins/sensu-community-plugins-master/plugins/processes/check-procs.rb -p crond -C   1',
 | |
|         handlers => 'default',
 | |
|         subscribers => 'base',
 | |
|         require => Staging::Deploy['sensu-community-plugins.tar.gz'],
 | |
|       }
 | |
|       sensu::check { 'check_dns':
 | |
|         command => '/opt/sensu-plugins/sensu-community-plugins-master/plugins/dns/check-dns.rb -d google-public-dns-a.google.com -s 192.168.1.2 -r 8.8.8.8',
 | |
|         handlers => 'default',
 | |
|         subscribers => 'base',
 | |
|         require => Staging::Deploy['sensu-community-plugins.tar.gz'],
 | |
|       }
 | |
|       sensu::check { 'check_disk':
 | |
|         command => '/opt/sensu-plugins/sensu-community-plugins-master/plugins/system/check-disk.rb',
 | |
|         handlers => 'default',
 | |
|         subscribers => 'base',
 | |
|         require => Staging::Deploy['sensu-community-plugins.tar.gz'],
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     This actually does quite a lot (halleluiah for CM). Each host will get:
 | |
| 
 | |
|     - Ensures `wget` is installed and that a directory exists to hold the plugins
 | |
|     - Deploys those plugins, and follows HEAD. Do not do this in production - change the URL to use a particular commit/tag/whatever.
 | |
|     - Configures a simple handler to email alerts.
 | |
|     - Finally we configure a few basic plugins
 | |
|        - check `crond` is running
 | |
|        - Check name resolution works by looking up Google's public DNS server
 | |
|        - Check disk space
 | |
| 
 | |
|     Finally, the Sensu server needs RabbitMQ configured:
 | |
| 
 | |
|     node 'monitor.whatever.com' inherits default {
 | |
|       rabbitmq_user { 'sensu':
 | |
|         admin => false,
 | |
|         password => 'password',
 | |
|       }
 | |
|       rabbitmq_vhost { '/sensu':
 | |
|         ensure => present,
 | |
|       }
 | |
|     }
 | |
| 
 | |
| If you use Puppet agent with its defaults everything should now kind of
 | |
| pull together over the next hour.
 | |
| 
 | |
| One final stage is to have some way of visualising your Sensu data.
 | |
| There is a great dashboard called
 | |
| [Uchiwa](https://github.com/sensu/uchiwa) for that. In the
 | |
| `monitor.whatever.com` node in `manifests/site.pp` add:
 | |
| 
 | |
|     $uchiwa_api_config = [{
 | |
|       host    => 'monitor.whatever.lan',
 | |
|       name    => 'Site 1',
 | |
|       port    => '4567',
 | |
|       timeout => '5',
 | |
|     }]
 | |
| 
 | |
|     class { 'uchiwa':
 | |
|       install_repo        => false,
 | |
|       sensu_api_endpoints => $uchiwa_api_config,
 | |
|       user                => 'admin',
 | |
|       pass                => 'secret',
 | |
|     }
 | |
| 
 | |
| You could put this anywhere, but the Sensu host is as pretty logical
 | |
| place to my mind.
 | |
| 
 | |
| I am not 100% happy with this, particularly some of the dependency
 | |
| (packages and folders) is quite messy. It is fine for now as my lab is
 | |
| very much centred around CentOS. I do have some projects on the todo
 | |
| list for which I may use Debian/Ubuntu. As such I will be breaking a lot
 | |
| of that out into a *localdata* module. I\'ll post details about how I do
 | |
| that when I get round to it.
 | 
