fuel-plugin-lma-collector/deployment_scripts/puppet/manifests/collectd.pp

349 lines
13 KiB
Puppet

# Copyright 2016 Mirantis, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
notice('fuel-plugin-lma-collector: collectd.pp')
if hiera('lma::collector::influxdb::server', false) {
prepare_network_config(hiera_hash('network_scheme', {}))
$fuel_version = 0 + hiera('fuel_version')
$management_vip = hiera('management_vip')
$mgmt_address = get_network_role_property('management', 'ipaddr')
$lma_collector = hiera_hash('lma_collector')
$node_profiles = hiera_hash('lma::collector::node_profiles')
$is_controller = $node_profiles['controller']
$is_base_os = $node_profiles['base_os']
$is_mysql_server = $node_profiles['mysql']
$is_rabbitmq = $node_profiles['rabbitmq']
$is_compute = $node_profiles['compute']
$is_ceph_osd = $node_profiles['ceph_osd']
$is_elasticsearch_node = $node_profiles['elasticsearch']
$is_influxdb_node = $node_profiles['influxdb']
$nova = hiera_hash('nova', {})
$neutron = hiera_hash('quantum_settings', {})
$cinder = hiera_hash('cinder', {})
$haproxy_socket = '/var/lib/haproxy/stats'
$storage_options = hiera_hash('storage', {})
if $storage_options['volumes_ceph'] or $storage_options['images_ceph'] or
$storage_options['objects_ceph'] or $storage_options['ephemeral_ceph']{
$ceph_enabled = true
} else {
$ceph_enabled = false
}
if $is_controller or $is_rabbitmq {
Service<| title == 'metric_collector' |> {
provider => 'pacemaker'
}
}
if $is_elasticsearch_node {
$process_matches = [{name => 'elasticsearch', regex => 'java'}]
} else {
$process_matches = undef
}
if $is_influxdb_node {
$processes = ['influxd', 'grafana-server', 'hekad', 'collectd']
} else {
$processes = ['hekad', 'collectd']
}
if $is_controller {
# collectd plugins on controller do many network I/O operations, so
# it is recommended to increase this value
$read_threads = 10
} else {
$read_threads = 5
}
class { 'lma_collector::collectd::base':
processes => $processes,
process_matches => $process_matches,
# Purge the default configuration shipped with the collectd package
purge => true,
read_threads => $read_threads,
}
if $is_mysql_server {
class { 'lma_collector::collectd::mysql':
username => hiera('lma::collector::monitor::mysql_username'),
password => hiera('lma::collector::monitor::mysql_password'),
socket => hiera('lma::collector::monitor::mysql_socket'),
require => Class['lma_collector::collectd::base'],
}
lma_collector::collectd::dbi_mysql_status { 'mysql_status':
username => hiera('lma::collector::monitor::mysql_username'),
dbname => hiera('lma::collector::monitor::mysql_db'),
password => hiera('lma::collector::monitor::mysql_password'),
require => Class['lma_collector::collectd::base'],
}
}
if $is_rabbitmq {
$rabbit = hiera_hash('rabbit')
if $rabbit['user'] {
$rabbitmq_user = $rabbit['user']
}
else {
$rabbitmq_user = 'nova'
}
class { 'lma_collector::collectd::rabbitmq':
username => $rabbitmq_user,
password => $rabbit['password'],
require => Class['lma_collector::collectd::base'],
}
}
# Configure Pacemaker plugin
if $is_controller {
$pacemaker_master_resource = 'vip__management'
$controller_resources = {
'vip__public' => 'vip__public',
'vip__management' => 'vip__management',
'vip__vrouter_pub' => 'vip__vrouter_pub',
'vip__vrouter' => 'vip__vrouter',
'p_haproxy' => 'haproxy',
}
} else {
$pacemaker_master_resource = undef
$controller_resources = {}
}
# Deal with detach-* plugins
if $is_mysql_server {
if $fuel_version < 9.0 {
$mysql_resource_name = 'p_mysql'
} else {
$mysql_resource_name = 'p_mysqld'
}
$mysql_resource = {
"${mysql_resource_name}" => 'mysqld',
}
}
else {
$mysql_resource = {}
}
if $is_rabbitmq {
$rabbitmq_resource = {
'p_rabbitmq-server' => 'rabbitmq',
}
}
else {
$rabbitmq_resource = {}
}
$resources = merge($controller_resources, $mysql_resource, $rabbitmq_resource)
if ! empty($resources) {
class { 'lma_collector::collectd::pacemaker':
resources => $resources,
notify_resource => $pacemaker_master_resource,
hostname => $::fqdn,
require => Class['lma_collector::collectd::base'],
}
}
if $is_controller {
# Configure OpenStack plugins
$openstack_service_config = {
user => 'nova',
password => $nova['user_password'],
tenant => 'services',
keystone_url => "http://${management_vip}:5000/v2.0",
pacemaker_master_resource => $pacemaker_master_resource,
require => Class['lma_collector::collectd::base'],
}
$openstack_services = {
'nova' => $openstack_service_config,
'nova_services' => $openstack_service_config,
'cinder' => $openstack_service_config,
'cinder_services' => $openstack_service_config,
'glance' => $openstack_service_config,
'keystone' => $openstack_service_config,
'neutron' => $openstack_service_config,
'neutron_agents' => $openstack_service_config,
}
create_resources(lma_collector::collectd::openstack, $openstack_services)
# FIXME(elemoine) use the special attribute * when Fuel uses a Puppet version
# that supports it.
class { 'lma_collector::collectd::openstack_checks':
user => $openstack_service_config[user],
password => $openstack_service_config[password],
tenant => $openstack_service_config[tenant],
keystone_url => $openstack_service_config[keystone_url],
pacemaker_master_resource => $openstack_service_config[pacemaker_master_resource],
require => Class['lma_collector::collectd::base'],
}
# FIXME(elemoine) use the special attribute * when Fuel uses a Puppet version
# that supports it.
class { 'lma_collector::collectd::hypervisor':
user => $openstack_service_config[user],
password => $openstack_service_config[password],
tenant => $openstack_service_config[tenant],
keystone_url => $openstack_service_config[keystone_url],
pacemaker_master_resource => $openstack_service_config[pacemaker_master_resource],
# Fuel sets cpu_allocation_ratio to 8.0 in nova.conf
cpu_allocation_ratio => 8.0,
require => Class['lma_collector::collectd::base'],
}
class { 'lma_collector::collectd::haproxy':
socket => $haproxy_socket,
# Ignore internal stats ('Stats' for 6.1, 'stats' for 7.0), lma proxies and
# Nova EC2
proxy_ignore => ['Stats', 'stats', 'lma', 'nova-api-1'],
proxy_names => {
'ceilometer' => 'ceilometer-api',
'cinder-api' => 'cinder-api',
'glance-api' => 'glance-api',
'glance-registry' => 'glance-registry-api',
'heat-api' => 'heat-api',
'heat-api-cfn' => 'heat-cfn-api',
'heat-api-cloudwatch' => 'heat-cloudwatch-api',
'horizon' => 'horizon-web',
'horizon-ssl' => 'horizon-https',
'keystone-1' => 'keystone-public-api',
'keystone-2' => 'keystone-admin-api',
'murano' => 'murano-api',
'mysqld' => 'mysqld-tcp',
'neutron' => 'neutron-api',
# starting with Mitaka (and later)
'nova-api' => 'nova-api',
# before Mitaka
'nova-api-2' => 'nova-api',
'nova-novncproxy' => 'nova-novncproxy-websocket',
'nova-metadata-api' => 'nova-metadata-api',
'sahara' => 'sahara-api',
'swift' => 'swift-api',
},
require => Class['lma_collector::collectd::base'],
}
if $ceph_enabled {
class { 'lma_collector::collectd::ceph_mon':
require => Class['lma_collector::collectd::base'],
}
}
class { 'lma_collector::collectd::memcached':
host => get_network_role_property('mgmt/memcache', 'ipaddr'),
require => Class['lma_collector::collectd::base'],
}
# Enable the Apache status module
class { 'fuel_lma_collector::mod_status': }
class { 'lma_collector::collectd::apache':
require => Class['lma_collector::collectd::base'],
}
# Check local endpoint
$cinder_api = get_network_role_property('cinder/api', 'ipaddr')
$glance_api = get_network_role_property('glance/api', 'ipaddr')
$heat_api = get_network_role_property('heat/api', 'ipaddr')
$keystone_api = get_network_role_property('keystone/api', 'ipaddr')
$neutron_api = get_network_role_property('neutron/api', 'ipaddr')
$nova_api = get_network_role_property('nova/api', 'ipaddr')
$swift_api = get_network_role_property('swift/api', 'ipaddr')
if $fuel_version < 9.0 {
$cinder_expected_code = 200
} else {
# Since Mitaka, Cinder returns 300 instead of 200 in previous releases
$cinder_expected_code = 300
}
class { 'lma_collector::collectd::check_local_endpoint':
urls => {
'cinder-api' => "http://${cinder_api}:8776",
'glance-api' => "http://${glance_api}:9292",
'heat-api' => "http://${heat_api}:8004",
'heat-cfn-api' => "http://${heat_api}:8000",
'keystone-public-api' => "http://${keystone_api}:5000",
'neutron-api' => "http://${neutron_api}:9696",
'nova-api' => "http://${nova_api}:8774",
'swift-api' => "http://${swift_api}:8080/info",
},
expected_codes => {
'cinder-api' => $cinder_expected_code,
'glance-api' => 300,
'heat-api' => 300,
'heat-cfn-api' => 300,
'keystone-public-api' => 300,
'neutron-api' => 200,
'nova-api' => 200,
'swift-api' => 200,
},
timeout => 1,
max_retries => 3,
require => Class['lma_collector::collectd::base'],
}
$influxdb_server = hiera('lma::collector::influxdb::server')
$influxdb_port = hiera('lma::collector::influxdb::port')
class { 'lma_collector::collectd::http_check':
urls => {
'influxdb-cluster' => "http://${influxdb_server}:${influxdb_port}/ping",
},
expected_codes => {
'influxdb-cluster' => 204
},
timeout => 1,
max_retries => 3,
pacemaker_master_resource => $pacemaker_master_resource,
require => Class['lma_collector::collectd::base'],
}
}
# Compute
if $is_compute {
class { 'lma_collector::collectd::libvirt':
require => Class['lma_collector::collectd::base'],
}
class { 'lma_collector::collectd::libvirt_check':
require => Class['lma_collector::collectd::base'],
}
}
# Ceph OSD
if $is_ceph_osd {
class { 'lma_collector::collectd::ceph_osd':
require => Class['lma_collector::collectd::base'],
}
}
# InfluxDB
if $is_influxdb_node {
class { 'lma_collector::collectd::influxdb':
username => 'root',
password => hiera('lma::collector::influxdb::root_password'),
address => hiera('lma::collector::influxdb::listen_address'),
port => hiera('lma::collector::influxdb::influxdb_port', 8086),
require => Class['lma_collector::collectd::base'],
}
}
# Elasticsearch
if $is_elasticsearch_node {
class { 'lma_collector::collectd::elasticsearch':
address => hiera('lma::collector::elasticsearch::listen_address'),
port => hiera('lma::collector::elasticsearch::rest_port', 9200),
require => Class['lma_collector::collectd::base'],
}
}
if $is_influxdb_node or $is_elasticsearch_node {
class { 'lma_collector::collectd::haproxy':
socket => $haproxy_socket,
require => Class['lma_collector::collectd::base'],
}
}
}