Add manifest files
Signed-off-by: Emilien Macchi <emilien.macchi@enovance.com>
This commit is contained in:
48
classes/authorized_keys.pp
Normal file
48
classes/authorized_keys.pp
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
#
|
||||||
|
# Copyright (C) 2013 eNovance SAS <licensing@enovance.com>
|
||||||
|
#
|
||||||
|
# Authors: Mehdi Abaakouk <mehdi.abaakouk@enovance.com>
|
||||||
|
# Emilien Macchi <emilien.macchi@enovance.com>
|
||||||
|
# Francois Charlier <francois.charlier@enovance.com>
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
# SSH authorized_keys
|
||||||
|
|
||||||
|
class authorized_keys ($keys, $account='root', $home = '') {
|
||||||
|
# This line allows default homedir based on $account variable.
|
||||||
|
# If $home is empty, the default is used.
|
||||||
|
$rhome = $account ? {'root' => "/root", default => $home}
|
||||||
|
$homedir = $rhome ? {'' => "/home/${account}", default => $rhome}
|
||||||
|
file { "${homedir}/.ssh":
|
||||||
|
ensure => directory,
|
||||||
|
owner => $ensure ? {'present' => $account, default => undef },
|
||||||
|
group => $ensure ? {'present' => $account, default => undef },
|
||||||
|
mode => 755,
|
||||||
|
}
|
||||||
|
file { "${homedir}/.ssh/authorized_keys":
|
||||||
|
owner => $ensure ? {'present' => $account, default => undef },
|
||||||
|
group => $ensure ? {'present' => $account, default => undef },
|
||||||
|
mode => 644,
|
||||||
|
require => File["${homedir}/.ssh"],
|
||||||
|
}
|
||||||
|
|
||||||
|
define addkey{
|
||||||
|
exec{"key-$name":
|
||||||
|
command => "/bin/echo '${name}' >> ${homedir}/.ssh/authorized_keys",
|
||||||
|
unless => "/bin/grep -xFq '${name}' ${homedir}/.ssh/authorized_keys",
|
||||||
|
require => File["${homedir}/.ssh/authorized_keys"],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
addkey{$keys:;}
|
||||||
|
}
|
55
roles/common/rabbitmq.pp
Normal file
55
roles/common/rabbitmq.pp
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
#
|
||||||
|
# Copyright (C) 2013 eNovance SAS <licensing@enovance.com>
|
||||||
|
#
|
||||||
|
# Authors: Mehdi Abaakouk <mehdi.abaakouk@enovance.com>
|
||||||
|
# Emilien Macchi <emilien.macchi@enovance.com>
|
||||||
|
# Francois Charlier <francois.charlier@enovance.com>
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
# RabbitMQ node
|
||||||
|
|
||||||
|
class os_role_rabbitmq{
|
||||||
|
class { 'rabbitmq::server':
|
||||||
|
delete_guest_user => true,
|
||||||
|
config_cluster => true,
|
||||||
|
cluster_disk_nodes => $os_params::rabbit_names,
|
||||||
|
wipe_db_on_cookie_change => true,
|
||||||
|
}
|
||||||
|
|
||||||
|
rabbitmq_vhost { '/':
|
||||||
|
provider => 'rabbitmqctl',
|
||||||
|
require => Class['rabbitmq::server'],
|
||||||
|
}
|
||||||
|
rabbitmq_user { ['nova','glance', 'quantum', 'cinder', 'ceilometer', 'heat', 'sensu']:
|
||||||
|
admin => true,
|
||||||
|
password => $os_params::rabbit_password,
|
||||||
|
provider => 'rabbitmqctl',
|
||||||
|
require => Class['rabbitmq::server']
|
||||||
|
}
|
||||||
|
rabbitmq_user_permissions {[
|
||||||
|
'nova@/',
|
||||||
|
'glance@/',
|
||||||
|
'quantum@/',
|
||||||
|
'cinder@/',
|
||||||
|
'ceilometer@/',
|
||||||
|
'heat@/',
|
||||||
|
'sensu@/',
|
||||||
|
]:
|
||||||
|
configure_permission => '.*',
|
||||||
|
write_permission => '.*',
|
||||||
|
read_permission => '.*',
|
||||||
|
provider => 'rabbitmqctl',
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
253
roles/identity/keystone.pp
Normal file
253
roles/identity/keystone.pp
Normal file
@@ -0,0 +1,253 @@
|
|||||||
|
#
|
||||||
|
# Copyright (C) 2013 eNovance SAS <licensing@enovance.com>
|
||||||
|
#
|
||||||
|
# Authors: Mehdi Abaakouk <mehdi.abaakouk@enovance.com>
|
||||||
|
# Emilien Macchi <emilien.macchi@enovance.com>
|
||||||
|
# Francois Charlier <francois.charlier@enovance.com>
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
class os_role_keystone (
|
||||||
|
$local_ip = $ipaddress_eth1,
|
||||||
|
){
|
||||||
|
|
||||||
|
$encoded_user = uriescape($os_params::keystone_db_user)
|
||||||
|
$encoded_password = uriescape($os_params::keystone_db_password)
|
||||||
|
|
||||||
|
# Running Keystone service with WSGI and Apache2
|
||||||
|
class {'apache':
|
||||||
|
default_vhost => false
|
||||||
|
}
|
||||||
|
|
||||||
|
class { 'keystone::wsgi::apache':
|
||||||
|
port => 8082
|
||||||
|
}
|
||||||
|
|
||||||
|
apache::vhost { 'keystone_main_proxy':
|
||||||
|
servername => $::fqdn,
|
||||||
|
port => 5000,
|
||||||
|
docroot => $::keystone::params::keystone_wsgi_script_path,
|
||||||
|
docroot_owner => 'keystone',
|
||||||
|
docroot_group => 'keystone',
|
||||||
|
error_log_file => "${::fqdn}_main_error.log",
|
||||||
|
access_log_file => "${::fqdn}_main_access.log",
|
||||||
|
configure_firewall => false,
|
||||||
|
custom_fragment => inline_template('
|
||||||
|
WSGIScriptAlias / /usr/lib/cgi-bin/keystone/main
|
||||||
|
WSGIProcessGroup keystone
|
||||||
|
')
|
||||||
|
}
|
||||||
|
|
||||||
|
apache::vhost { 'keystone_admin_proxy':
|
||||||
|
servername => $::fqdn,
|
||||||
|
port => 35357,
|
||||||
|
docroot => $::keystone::params::keystone_wsgi_script_path,
|
||||||
|
docroot_owner => 'keystone',
|
||||||
|
docroot_group => 'keystone',
|
||||||
|
error_log_file => "${::fqdn}_admin_error.log",
|
||||||
|
access_log_file => "${::fqdn}_admin_access.log",
|
||||||
|
configure_firewall => false,
|
||||||
|
custom_fragment => inline_template('
|
||||||
|
WSGIScriptAlias / /usr/lib/cgi-bin/keystone/admin
|
||||||
|
WSGIProcessGroup keystone
|
||||||
|
')
|
||||||
|
}
|
||||||
|
|
||||||
|
# Configure Keystone
|
||||||
|
class { 'keystone':
|
||||||
|
enabled => false,
|
||||||
|
package_ensure => 'latest',
|
||||||
|
admin_token => $os_params::ks_admin_token,
|
||||||
|
compute_port => "8774",
|
||||||
|
verbose => false,
|
||||||
|
debug => false,
|
||||||
|
sql_connection => "mysql://${encoded_user}:${encoded_password}@${os_params::keystone_db_host}/keystone",
|
||||||
|
idle_timeout => 60,
|
||||||
|
# ToDo (EmilienM): Update to PKI tokens
|
||||||
|
token_format => "UUID",
|
||||||
|
}
|
||||||
|
|
||||||
|
keystone_config {
|
||||||
|
"token/driver": value => "keystone.token.backends.memcache.Token";
|
||||||
|
"token/expiration": value => "86400";
|
||||||
|
"memcache/servers": value => inline_template("<%= scope.lookupvar('os_params::keystone_memchached').join(',') %>");
|
||||||
|
"ec2/driver": value => "keystone.contrib.ec2.backends.sql.Ec2";
|
||||||
|
"DEFAULT/syslog_log_facility": value => 'LOG_LOCAL0';
|
||||||
|
"DEFAULT/use_syslog": value => 'yes';
|
||||||
|
}
|
||||||
|
|
||||||
|
# Configure Load Balancers
|
||||||
|
@@haproxy::balancermember{"${fqdn}-keystone":
|
||||||
|
listening_service => "keystone_cluster",
|
||||||
|
server_names => $::hostname,
|
||||||
|
ipaddresses => $local_ip,
|
||||||
|
ports => $os_params::keystone_port,
|
||||||
|
options => "check inter 2000 rise 2 fall 5"
|
||||||
|
}
|
||||||
|
|
||||||
|
@@haproxy::balancermember{"${fqdn}-keystone-admin":
|
||||||
|
listening_service => "keystone_admin_cluster",
|
||||||
|
server_names => $::hostname,
|
||||||
|
ipaddresses => $local_ip,
|
||||||
|
ports => $os_params::keystone_admin_port,
|
||||||
|
options => "check inter 2000 rise 2 fall 5"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# Keystone Endpoints + Users
|
||||||
|
class { 'keystone::roles::admin':
|
||||||
|
email => $os_params::ks_admin_email,
|
||||||
|
password => $os_params::ks_admin_password,
|
||||||
|
}
|
||||||
|
|
||||||
|
keystone_role { $os_params::keystone_roles_addons: ensure => present }
|
||||||
|
|
||||||
|
class {"keystone::endpoint":
|
||||||
|
public_address => $os_params::ks_keystone_public_host,
|
||||||
|
admin_address => $os_params::ks_keystone_admin_host,
|
||||||
|
internal_address => $os_params::ks_keystone_internal_host,
|
||||||
|
public_port => $os_params::ks_keystone_public_port,
|
||||||
|
admin_port => $os_params::keystone_admin_port,
|
||||||
|
internal_port => $os_params::keystone_port,
|
||||||
|
region => 'RegionOne',
|
||||||
|
public_protocol => $os_params::ks_keystone_public_proto
|
||||||
|
}
|
||||||
|
|
||||||
|
class{"swift::keystone::auth":
|
||||||
|
password => $os_params::ks_swift_password,
|
||||||
|
address => $os_params::ks_swift_internal_host,
|
||||||
|
port => $os_params::swift_port,
|
||||||
|
public_address => $os_params::ks_swift_public_host,
|
||||||
|
public_protocol => $os_params::ks_swift_public_proto,
|
||||||
|
public_port => $os_params::ks_swift_public_port
|
||||||
|
}
|
||||||
|
|
||||||
|
class { 'nova::keystone::auth':
|
||||||
|
password => $os_params::ks_nova_password,
|
||||||
|
public_address => $os_params::ks_nova_public_host,
|
||||||
|
admin_address => $os_params::ks_nova_admin_host,
|
||||||
|
internal_address => $os_params::ks_nova_internal_host,
|
||||||
|
public_protocol => $os_params::ks_nova_public_proto,
|
||||||
|
cinder => true,
|
||||||
|
}
|
||||||
|
|
||||||
|
class { 'cinder::keystone::auth':
|
||||||
|
password => $os_params::ks_cinder_password,
|
||||||
|
public_address => $os_params::ks_cinder_public_host,
|
||||||
|
admin_address => $os_params::ks_cinder_admin_host,
|
||||||
|
internal_address => $os_params::ks_cinder_internal_host,
|
||||||
|
public_protocol => $os_params::ks_cinder_public_proto,
|
||||||
|
}
|
||||||
|
|
||||||
|
class { 'glance::keystone::auth':
|
||||||
|
password => $os_params::ks_glance_password,
|
||||||
|
public_address => $os_params::ks_glance_public_host,
|
||||||
|
admin_address => $os_params::ks_glance_admin_host,
|
||||||
|
internal_address => $os_params::ks_glance_internal_host,
|
||||||
|
public_protocol => $os_params::ks_glance_public_proto,
|
||||||
|
}
|
||||||
|
|
||||||
|
class { 'quantum::keystone::auth':
|
||||||
|
password => $os_params::ks_quantum_password,
|
||||||
|
public_address => $os_params::ks_quantum_public_host,
|
||||||
|
admin_address => $os_params::ks_quantum_admin_host,
|
||||||
|
internal_address => $os_params::ks_quantum_internal_host,
|
||||||
|
public_protocol => $os_params::ks_quantum_public_proto,
|
||||||
|
port => $os_params::quantum_port,
|
||||||
|
}
|
||||||
|
|
||||||
|
class { 'ceilometer::keystone::auth':
|
||||||
|
password => $os_params::ks_ceilometer_password,
|
||||||
|
public_address => $os_params::ks_ceilometer_public_host,
|
||||||
|
admin_address => $os_params::ks_ceilometer_admin_host,
|
||||||
|
internal_address => $os_params::ks_ceilometer_internal_host,
|
||||||
|
public_protocol => $os_params::ks_ceilometer_public_proto,
|
||||||
|
port => $os_params::ceilometer_port,
|
||||||
|
}
|
||||||
|
|
||||||
|
# Note for Midonet: endpoint is created manually since
|
||||||
|
# there is no Puppet module.
|
||||||
|
|
||||||
|
keystone_tenant { $os_params::glance_swift_tenant:
|
||||||
|
ensure => present,
|
||||||
|
enabled => 'True',
|
||||||
|
description => 'glance images tenant'
|
||||||
|
} ->
|
||||||
|
keystone_user { $os_params::glance_swift_user:
|
||||||
|
ensure => present,
|
||||||
|
email => "${os_params::glance_swift_user}@localhost",
|
||||||
|
password => $os_params::glance_swift_password,
|
||||||
|
tenant => $os_params::glance_swift_tenant
|
||||||
|
} ->
|
||||||
|
keystone_user_role { "${os_params::glance_swift_user}@${os_params::glance_swift_tenant}":
|
||||||
|
ensure => present,
|
||||||
|
roles => 'admin'
|
||||||
|
}
|
||||||
|
|
||||||
|
keystone_tenant { $os_params::ks_monitoring_tenant:
|
||||||
|
ensure => present,
|
||||||
|
enabled => 'True',
|
||||||
|
description => 'Monitoring Tenant'
|
||||||
|
} ->
|
||||||
|
keystone_user { $os_params::ks_monitoring_user:
|
||||||
|
ensure => present,
|
||||||
|
email => "${os_params::ks_monitoring_user}@localhost",
|
||||||
|
password => $os_params::ks_monitoring_password,
|
||||||
|
tenant => $os_params::ks_monitoring_tenant
|
||||||
|
} ->
|
||||||
|
keystone_user_role { "${os_params::ks_monitoring_user}@${os_params::ks_monitoring_tenant}":
|
||||||
|
ensure => present,
|
||||||
|
roles => 'admin'
|
||||||
|
}
|
||||||
|
|
||||||
|
# Specific to Midonet
|
||||||
|
# keystone_tenant { $os_params::ks_midonet_tenant:
|
||||||
|
# ensure => present,
|
||||||
|
# enabled => 'True',
|
||||||
|
# description => 'Midonet Tenant'
|
||||||
|
# } ->
|
||||||
|
# keystone_user { $os_params::ks_midonet_username:
|
||||||
|
# ensure => present,
|
||||||
|
# email => "${os_params::ks_midonet_tenant}@localhost",
|
||||||
|
# password => $os_params::ks_midonet_password,
|
||||||
|
# tenant => $os_params::ks_midonet_tenant
|
||||||
|
# } ->
|
||||||
|
# keystone_user_role { "${os_params::ks_midonet_user}@${os_params::ks_midonet_tenant}":
|
||||||
|
# ensure => present,
|
||||||
|
# roles => ${os_params::ks_midonet_role}
|
||||||
|
# }
|
||||||
|
|
||||||
|
class{ 'swift::keystone::dispersion':
|
||||||
|
auth_pass => $os_params::ks_swift_dispersion_password
|
||||||
|
}
|
||||||
|
|
||||||
|
# Waiting apache is configured before using keystone (because of WSGI)
|
||||||
|
Service['httpd'] -> Keystone_tenant <| |>
|
||||||
|
Service['httpd'] -> Keystone_user <| |>
|
||||||
|
Service['httpd'] -> Keystone_role <| |>
|
||||||
|
Service['httpd'] -> Keystone_service <| |>
|
||||||
|
Service['httpd'] -> Keystone_user_role <| |>
|
||||||
|
Service['httpd'] -> Keystone_endpoint <| |>
|
||||||
|
|
||||||
|
|
||||||
|
# Due to Keystone WSGI, db need to be sync manually
|
||||||
|
exec { 'keystone-manage db_sync':
|
||||||
|
path => '/usr/bin',
|
||||||
|
user => 'keystone',
|
||||||
|
refreshonly => true,
|
||||||
|
notify => Service['keystone'],
|
||||||
|
subscribe => Package['keystone'],
|
||||||
|
require => User['keystone'],
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
37
roles/metering/ceilometer.pp
Normal file
37
roles/metering/ceilometer.pp
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
#
|
||||||
|
# Copyright (C) 2013 eNovance SAS <licensing@enovance.com>
|
||||||
|
#
|
||||||
|
# Authors: Mehdi Abaakouk <mehdi.abaakouk@enovance.com>
|
||||||
|
# Emilien Macchi <emilien.macchi@enovance.com>
|
||||||
|
# Francois Charlier <francois.charlier@enovance.com>
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
# Ceilometer nodes
|
||||||
|
|
||||||
|
class os_ceilometer{
|
||||||
|
class { 'mongodb':
|
||||||
|
enable_10gen => true,
|
||||||
|
}
|
||||||
|
|
||||||
|
class { 'ceilometer::db':
|
||||||
|
database_connection => $os_params::ceilometer_database_connection,
|
||||||
|
require => Class['mongodb']
|
||||||
|
}
|
||||||
|
|
||||||
|
class { 'ceilometer::collector': }
|
||||||
|
|
||||||
|
# Ceilometer Central Agent is defined in site.pp since it must be installed on only node (not able to scale-out)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
38
roles/metering/common_ceilometer.pp
Normal file
38
roles/metering/common_ceilometer.pp
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
#
|
||||||
|
# Copyright (C) 2013 eNovance SAS <licensing@enovance.com>
|
||||||
|
#
|
||||||
|
# Authors: Mehdi Abaakouk <mehdi.abaakouk@enovance.com>
|
||||||
|
# Emilien Macchi <emilien.macchi@enovance.com>
|
||||||
|
# Francois Charlier <francois.charlier@enovance.com>
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
|
||||||
|
# Used by Controller & Compute nodes
|
||||||
|
|
||||||
|
class ceilometer_common {
|
||||||
|
class { 'ceilometer':
|
||||||
|
metering_secret => $os_params::ceilometer_secret,
|
||||||
|
rabbit_hosts => $os_params::rabbit_hosts,
|
||||||
|
rabbit_password => $os_params::rabbit_password,
|
||||||
|
rabbit_userid => 'ceilometer',
|
||||||
|
verbose => false,
|
||||||
|
debug => false,
|
||||||
|
}
|
||||||
|
|
||||||
|
ceilometer_config {
|
||||||
|
'DEFAULT/syslog_log_facility': value => 'LOG_LOCAL0';
|
||||||
|
'DEFAULT/use_syslog': value => 'yes';
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
99
roles/object-storage/common_swift.pp
Normal file
99
roles/object-storage/common_swift.pp
Normal file
@@ -0,0 +1,99 @@
|
|||||||
|
#
|
||||||
|
# Copyright (C) 2013 eNovance SAS <licensing@enovance.com>
|
||||||
|
#
|
||||||
|
# Authors: Mehdi Abaakouk <mehdi.abaakouk@enovance.com>
|
||||||
|
# Emilien Macchi <emilien.macchi@enovance.com>
|
||||||
|
# Francois Charlier <francois.charlier@enovance.com>
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
# Swift nodes
|
||||||
|
|
||||||
|
class os_role_swift {
|
||||||
|
|
||||||
|
class { 'ssh::server::install': }
|
||||||
|
|
||||||
|
class { 'swift':
|
||||||
|
swift_hash_suffix => $os_params::swift_hash_suffix,
|
||||||
|
package_ensure => latest,
|
||||||
|
}
|
||||||
|
class {"os_swift_system::tweaking": }
|
||||||
|
}
|
||||||
|
|
||||||
|
class os_swift_system::tweaking {
|
||||||
|
file {"/etc/sysctl.d/swift-tuning.conf":
|
||||||
|
content => "
|
||||||
|
# disable TIME_WAIT.. wait..
|
||||||
|
net.ipv4.tcp_tw_recycle=1
|
||||||
|
net.ipv4.tcp_tw_reuse=1
|
||||||
|
|
||||||
|
# disable syn cookies
|
||||||
|
net.ipv4.tcp_syncookies = 0
|
||||||
|
|
||||||
|
# double amount of allowed conntrack
|
||||||
|
net.ipv4.netfilter.ip_conntrack_max = 524288
|
||||||
|
net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 2
|
||||||
|
net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 2
|
||||||
|
|
||||||
|
net.ipv4.ip_local_port_range = 1024 65000
|
||||||
|
|
||||||
|
## 10Gb Tuning
|
||||||
|
net.core.netdev_max_backlog = 300000
|
||||||
|
net.ipv4.tcp_timestamps = 0
|
||||||
|
net.ipv4.tcp_sack = 0
|
||||||
|
|
||||||
|
",
|
||||||
|
owner => "root",
|
||||||
|
group => "root",
|
||||||
|
}
|
||||||
|
|
||||||
|
exec{"update-etc-modules-with-ip_conntrack":
|
||||||
|
command => "/bin/echo ip_conntrack >> /etc/modules",
|
||||||
|
unless => "/bin/grep -qFx 'ip_conntrack' /etc/modules",
|
||||||
|
}
|
||||||
|
|
||||||
|
# Load sysctl and module only the first time
|
||||||
|
exec{"load-ip_conntrack":
|
||||||
|
command => "/sbin/modprobe ip_conntrack",
|
||||||
|
unless => "/bin/grep -qFx 'ip_conntrack' /etc/modules",
|
||||||
|
require => File['/etc/sysctl.d/swift-tuning.conf']
|
||||||
|
}
|
||||||
|
exec{"reload-sysctl-swift-tunning":
|
||||||
|
command => "/sbin/sysctl -p /etc/sysctl.d/swift-tuning.conf",
|
||||||
|
unless => "/bin/grep -qFx 'ip_conntrack' /etc/modules",
|
||||||
|
require => File['/etc/sysctl.d/swift-tuning.conf']
|
||||||
|
}
|
||||||
|
|
||||||
|
file{"/var/log/swift":
|
||||||
|
ensure => directory,
|
||||||
|
owner => swift,
|
||||||
|
group => swift,
|
||||||
|
}
|
||||||
|
|
||||||
|
file{"/etc/logrotate.d/swift":
|
||||||
|
content => "
|
||||||
|
/var/log/swift/proxy.log /var/log/swift/proxy.error.log /var/log/swift/account-server.log /var/log/swift/account-server.error.log /var/log/swift/container-server.log /var/log/swift/container-server.error.log /var/log/swift/object-server.log /var/log/swift/object-server.error.log
|
||||||
|
{
|
||||||
|
rotate 7
|
||||||
|
daily
|
||||||
|
missingok
|
||||||
|
notifempty
|
||||||
|
delaycompress
|
||||||
|
compress
|
||||||
|
postrotate
|
||||||
|
endscript
|
||||||
|
}
|
||||||
|
"
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
104
roles/object-storage/swift_proxy.pp
Normal file
104
roles/object-storage/swift_proxy.pp
Normal file
@@ -0,0 +1,104 @@
|
|||||||
|
#
|
||||||
|
# Copyright (C) 2013 eNovance SAS <licensing@enovance.com>
|
||||||
|
#
|
||||||
|
# Authors: Mehdi Abaakouk <mehdi.abaakouk@enovance.com>
|
||||||
|
# Emilien Macchi <emilien.macchi@enovance.com>
|
||||||
|
# Francois Charlier <francois.charlier@enovance.com>
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
# Swift Proxy node
|
||||||
|
|
||||||
|
class os_role_swift_proxy(
|
||||||
|
$local_ip = $ipaddress_eth1,
|
||||||
|
) inherits os_role_swift {
|
||||||
|
|
||||||
|
class { 'memcached':
|
||||||
|
listen_ip => $local_ip,
|
||||||
|
max_memory => '60%',
|
||||||
|
}
|
||||||
|
|
||||||
|
class { 'swift::proxy':
|
||||||
|
proxy_local_net_ip => $local_ip,
|
||||||
|
port => $os_params::swift_port,
|
||||||
|
pipeline => [
|
||||||
|
'catch_errors', 'healthcheck', 'cache', 'ratelimit',
|
||||||
|
'swift3', 's3token', 'tempurl', 'formpost', 'authtoken',
|
||||||
|
'keystone', 'proxy-logging', 'proxy-server'],
|
||||||
|
account_autocreate => true,
|
||||||
|
log_level => 'DEBUG',
|
||||||
|
workers => inline_template('<%= processorcount.to_i * 2 %>
|
||||||
|
cors_allow_origin = <%= scope.lookupvar("os_params::swift_cors_allow_origin") %>
|
||||||
|
log_statsd_host = <%= scope.lookupvar("os_params::statsd_host") %>
|
||||||
|
log_statsd_port = <%= scope.lookupvar("os_params::statsd_port") %>
|
||||||
|
log_statsd_default_sample_rate = 1
|
||||||
|
'),
|
||||||
|
}
|
||||||
|
class{'swift::proxy::cache':
|
||||||
|
memcache_servers => inline_template(
|
||||||
|
'<%= scope.lookupvar("os_params::swift_memchached").join(",") %>'),
|
||||||
|
}
|
||||||
|
|
||||||
|
class { 'swift::proxy::proxy-logging': }
|
||||||
|
class { 'swift::proxy::healthcheck': }
|
||||||
|
class { 'swift::proxy::catch_errors': }
|
||||||
|
class { 'swift::proxy::ratelimit': }
|
||||||
|
|
||||||
|
class { 'swift::proxy::keystone':
|
||||||
|
operator_roles => ['admin', 'SwiftOperator', 'ResellerAdmin'],
|
||||||
|
}
|
||||||
|
|
||||||
|
class { 'swift::proxy::tempurl': }
|
||||||
|
class { 'swift::proxy::formpost': }
|
||||||
|
class { 'swift::proxy::authtoken':
|
||||||
|
admin_password => $os_params::ks_swift_password,
|
||||||
|
auth_host => $os_params::ks_keystone_admin_host,
|
||||||
|
auth_port => $os_params::keystone_admin_port,
|
||||||
|
delay_auth_decision => inline_template('1
|
||||||
|
cache = swift.cache')
|
||||||
|
}
|
||||||
|
|
||||||
|
class { 'swift::proxy::swift3':
|
||||||
|
ensure => 'latest',
|
||||||
|
}
|
||||||
|
class { 'swift::proxy::s3token':
|
||||||
|
auth_host => $os_params::ks_keystone_admin_host,
|
||||||
|
auth_port => $os_params::keystone_admin_port,
|
||||||
|
}
|
||||||
|
|
||||||
|
class { 'swift::dispersion':
|
||||||
|
auth_url => "http://${os_params::ks_keystone_internal_host}:${os_params::keystone_port}/v2.0
|
||||||
|
endpoint_type=internalURL",
|
||||||
|
auth_pass => $os_params::ks_swift_dispersion_password
|
||||||
|
}
|
||||||
|
|
||||||
|
#Note(sileht): log file should exists to swift proxy to write to
|
||||||
|
# the ceilometer directory
|
||||||
|
file{"/var/log/ceilometer/swift-proxy-server.log":
|
||||||
|
ensure => present,
|
||||||
|
owner => 'swift',
|
||||||
|
group => 'swift',
|
||||||
|
notify => Service['swift-proxy']
|
||||||
|
}
|
||||||
|
|
||||||
|
@@haproxy::balancermember{"${::fqdn}-swift":
|
||||||
|
listening_service => 'swift_cluster',
|
||||||
|
server_names => $::hostname,
|
||||||
|
ipaddresses => $local_ip,
|
||||||
|
ports => $os_params::swift_port,
|
||||||
|
options => 'check inter 2000 rise 2 fall 5'
|
||||||
|
}
|
||||||
|
|
||||||
|
Swift::Ringsync<<| |>> #~> Service["swift-proxy"]
|
||||||
|
|
||||||
|
}
|
77
roles/object-storage/swift_ringbuiler.pp
Normal file
77
roles/object-storage/swift_ringbuiler.pp
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
#
|
||||||
|
# Copyright (C) 2013 eNovance SAS <licensing@enovance.com>
|
||||||
|
#
|
||||||
|
# Authors: Mehdi Abaakouk <mehdi.abaakouk@enovance.com>
|
||||||
|
# Emilien Macchi <emilien.macchi@enovance.com>
|
||||||
|
# Francois Charlier <francois.charlier@enovance.com>
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
# Swift ring builder node
|
||||||
|
|
||||||
|
|
||||||
|
class os_role_swift_ringbuilder(
|
||||||
|
$rsyncd_ipaddress = ipaddress_eth1,
|
||||||
|
$replicas = 3
|
||||||
|
) inherits os_role_swift {
|
||||||
|
|
||||||
|
Ring_object_device <<| |>>
|
||||||
|
Ring_container_device <<| |>>
|
||||||
|
Ring_account_device <<| |>>
|
||||||
|
|
||||||
|
Class['swift'] -> Class['os_role_swift_ringbuilder']
|
||||||
|
|
||||||
|
swift::ringbuilder::create{ ['account', 'container']:
|
||||||
|
part_power => 9,
|
||||||
|
replicas => $replicas,
|
||||||
|
min_part_hours => 24,
|
||||||
|
}
|
||||||
|
|
||||||
|
swift::ringbuilder::create{'object':
|
||||||
|
part_power => 15,
|
||||||
|
replicas => $replicas,
|
||||||
|
min_part_hours => 24,
|
||||||
|
}
|
||||||
|
|
||||||
|
Swift::Ringbuilder::Create['object'] -> Ring_object_device <| |> ~> Swift::Ringbuilder::Rebalance['object']
|
||||||
|
Swift::Ringbuilder::Create['container'] -> Ring_container_device <| |> ~> Swift::Ringbuilder::Rebalance['container']
|
||||||
|
Swift::Ringbuilder::Create['account'] -> Ring_account_device <| |> ~> Swift::Ringbuilder::Rebalance['account']
|
||||||
|
|
||||||
|
swift::ringbuilder::rebalance{ ['object', 'account', 'container']: }
|
||||||
|
|
||||||
|
class { 'rsync::server':
|
||||||
|
use_xinetd => true,
|
||||||
|
address => $rsyncd_ipaddress,
|
||||||
|
use_chroot => 'no',
|
||||||
|
}
|
||||||
|
|
||||||
|
Rsync::Server::Module {
|
||||||
|
incoming_chmod => 'u=rwX,go=rX',
|
||||||
|
outgoing_chmod => 'u=rwX,go=rX',
|
||||||
|
}
|
||||||
|
|
||||||
|
rsync::server::module { "swift_server":
|
||||||
|
path => '/etc/swift',
|
||||||
|
lock_file => "/var/lock/swift_server.lock",
|
||||||
|
uid => 'swift',
|
||||||
|
gid => 'swift',
|
||||||
|
max_connections => $os_params::swift_rsync_max_connections,
|
||||||
|
read_only => true,
|
||||||
|
}
|
||||||
|
|
||||||
|
# exports rsync gets that can be used to sync the ring files
|
||||||
|
@@swift::ringsync { ['account', 'object', 'container']:
|
||||||
|
ring_server => $rsyncd_ipaddress,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
132
roles/object-storage/swift_storage.pp
Normal file
132
roles/object-storage/swift_storage.pp
Normal file
@@ -0,0 +1,132 @@
|
|||||||
|
#
|
||||||
|
# Copyright (C) 2013 eNovance SAS <licensing@enovance.com>
|
||||||
|
#
|
||||||
|
# Authors: Mehdi Abaakouk <mehdi.abaakouk@enovance.com>
|
||||||
|
# Emilien Macchi <emilien.macchi@enovance.com>
|
||||||
|
# Francois Charlier <francois.charlier@enovance.com>
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
# Swift Storage node
|
||||||
|
|
||||||
|
|
||||||
|
define set_io_scheduler(){
|
||||||
|
# TODO: Add it on server boot
|
||||||
|
exec{"/bin/echo deadline > /sys/block/${name}/queue/scheduler":
|
||||||
|
onlyif => [
|
||||||
|
"/usr/bin/test '-e /sys/block/${name}/queue/scheduler'",
|
||||||
|
"/bin/grep -v '\[deadline\]' /sys/block/${name}/queue/scheduler"
|
||||||
|
],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class os_role_swift_storage (
|
||||||
|
$local_ip = $ipaddress_eth1,
|
||||||
|
$swift_zone = undef,
|
||||||
|
$object_port = '6000',
|
||||||
|
$container_port = '6001',
|
||||||
|
$account_port = '6002',
|
||||||
|
$onloopdevices = false,
|
||||||
|
) inherits os_role_swift {
|
||||||
|
|
||||||
|
class { 'swift::storage':
|
||||||
|
storage_local_net_ip => $local_ip,
|
||||||
|
}
|
||||||
|
|
||||||
|
Rsync::Server::Module {
|
||||||
|
incoming_chmod => 'u=rwX,go=rX',
|
||||||
|
outgoing_chmod => 'u=rwX,go=rX',
|
||||||
|
}
|
||||||
|
|
||||||
|
Swift::Storage::Server {
|
||||||
|
#devices => $devices,
|
||||||
|
storage_local_net_ip => $local_ip,
|
||||||
|
workers => inline_template('<%= processorcount.to_i / 2 %>'),
|
||||||
|
replicator_concurrency => 2,
|
||||||
|
updater_concurrency => 1,
|
||||||
|
reaper_concurrency => 1,
|
||||||
|
require => Class['swift'],
|
||||||
|
mount_check => true,
|
||||||
|
}
|
||||||
|
# concurrency at 2 and 1 seems better see
|
||||||
|
# http://docs.openstack.org/trunk/openstack-object-storage/admin/content/general-service-tuning.html
|
||||||
|
|
||||||
|
swift::storage::server { $account_port:
|
||||||
|
type => 'account',
|
||||||
|
config_file_path => 'account-server.conf',
|
||||||
|
pipeline => ['healthcheck', 'account-server'],
|
||||||
|
log_facility => 'LOG_LOCAL2',
|
||||||
|
}
|
||||||
|
|
||||||
|
swift::storage::server { $container_port:
|
||||||
|
type => 'container',
|
||||||
|
config_file_path => 'container-server.conf',
|
||||||
|
workers => inline_template("<%= processorcount.to_i / 2 %>
|
||||||
|
db_preallocation = on
|
||||||
|
allow_versions = on
|
||||||
|
"), # great hack :(
|
||||||
|
pipeline => ['healthcheck', 'container-server'],
|
||||||
|
log_facility => 'LOG_LOCAL4',
|
||||||
|
}
|
||||||
|
|
||||||
|
swift::storage::server { $object_port:
|
||||||
|
type => 'object',
|
||||||
|
config_file_path => 'object-server.conf',
|
||||||
|
pipeline => ['healthcheck', 'recon', 'object-server'],
|
||||||
|
log_facility => 'LOG_LOCAL6',
|
||||||
|
}
|
||||||
|
|
||||||
|
swift::storage::filter::recon { 'object': }
|
||||||
|
swift::storage::filter::healthcheck { 'object': }
|
||||||
|
swift::storage::filter::healthcheck { 'container': }
|
||||||
|
swift::storage::filter::healthcheck { 'account': }
|
||||||
|
|
||||||
|
if $onloopdevices {
|
||||||
|
$object_nodes = flatten([ range('sdd','sdf')])
|
||||||
|
swift::storage::loopback{$object_nodes: seek => 10024000 }
|
||||||
|
swift::storage::loopback{['sdb', 'sdc']: seek => 10024000 }
|
||||||
|
} else {
|
||||||
|
$object_nodes = flatten([ range('sda','sdc')])
|
||||||
|
swift::storage::xfs { $object_nodes: }
|
||||||
|
swift::storage::xfs { ['sde', 'sdf']: }
|
||||||
|
set_io_scheduler{['sde', 'sdf']:}
|
||||||
|
set_io_scheduler{$object_nodes:}
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ring_container_device { "${local_ip}:${container_port}/sde":
|
||||||
|
zone => $swift_zone,
|
||||||
|
weight => '100.0',
|
||||||
|
}
|
||||||
|
@@ring_account_device { "${local_ip}:${account_port}/sdf":
|
||||||
|
zone => $swift_zone,
|
||||||
|
weight => '100.0',
|
||||||
|
}
|
||||||
|
$object_urls = prefix($object_nodes, "${local_ip}:${object_port}/")
|
||||||
|
@@ring_object_device {$object_urls:
|
||||||
|
zone => $swift_zone,
|
||||||
|
weight => '100.0',
|
||||||
|
}
|
||||||
|
|
||||||
|
class{[
|
||||||
|
'swift::storage::object',
|
||||||
|
'swift::storage::container',
|
||||||
|
'swift::storage::account']:
|
||||||
|
}
|
||||||
|
|
||||||
|
Swift::Ringsync<<| |>> ->
|
||||||
|
Swift::Storage::Server[$container_port] ->
|
||||||
|
Swift::Storage::Server[$account_port] ->
|
||||||
|
Swift::Storage::Server[$object_port]
|
||||||
|
|
||||||
|
}
|
15
templates/check_galera_cluster
Normal file
15
templates/check_galera_cluster
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
MYSQL_USERNAME="clustercheckuser"
|
||||||
|
MYSQL_PASSWORD="clustercheckpassword!"
|
||||||
|
ERR_FILE="/dev/null"
|
||||||
|
AVAILABLE_WHEN_DONOR=0
|
||||||
|
WSREP_STATUS=`mysql --user=${MYSQL_USERNAME} --password=${MYSQL_PASSWORD} -e "SHOW STATUS LIKE 'wsrep_local_state';" 2>${ERR_FILE} | awk '{if (NR!=1){print $2}}' 2>${ERR_FILE}`
|
||||||
|
|
||||||
|
if [[ "${WSREP_STATUS}" == "4" ]] || [[ "${WSREP_STATUS}" == "2" && ${AVAILABLE_WHEN_DONOR} == 1 ]]; then
|
||||||
|
echo "OK - Percona XtraDB Cluster Node is synced."
|
||||||
|
exit 0
|
||||||
|
else
|
||||||
|
echo "CRITICAL - Percona XtraDB Cluster Node is not synced."
|
||||||
|
exit 2
|
||||||
|
fi
|
123
templates/check_swift_recon
Executable file
123
templates/check_swift_recon
Executable file
@@ -0,0 +1,123 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
# check_swift_recon - Check OpenStack Swift recon values
|
||||||
|
#
|
||||||
|
# Copyright © 2012 eNovance <licensing@enovance.com>
|
||||||
|
#
|
||||||
|
# Author: Mehdi Abaakouk <mehdi.abaakouk@enovance.com>
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU Affero General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU Affero General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU Affero General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
|
||||||
|
|
||||||
|
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
|
||||||
|
|
||||||
|
PROGNAME=`basename $0`
|
||||||
|
REVISION="1.0"
|
||||||
|
|
||||||
|
STATE_OK=0
|
||||||
|
STATE_WARNING=1
|
||||||
|
STATE_CRITICAL=2
|
||||||
|
STATE_UNKNOWN=3
|
||||||
|
STATE_DEPENDENT=4
|
||||||
|
|
||||||
|
|
||||||
|
print_usage() {
|
||||||
|
echo "Usage: $PROGNAME [--field|-f] FIELD [[--critical|-c] VALUE [--warning|-w] VALUE]"
|
||||||
|
}
|
||||||
|
|
||||||
|
print_help() {
|
||||||
|
print_usage
|
||||||
|
echo "This plugin checks Swift status using the swift-recon program."
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
while [ "$1" ]; do
|
||||||
|
case "$1" in
|
||||||
|
--help|-h)
|
||||||
|
print_help
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
--field|-f)
|
||||||
|
field=$2
|
||||||
|
shift ; shift
|
||||||
|
;;
|
||||||
|
--critical|-c)
|
||||||
|
critical=$2
|
||||||
|
shift ; shift
|
||||||
|
;;
|
||||||
|
--warning|-w)
|
||||||
|
warning=$2
|
||||||
|
shift ; shift
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
[ ! "$field" ] && print_help
|
||||||
|
|
||||||
|
if ! which swift-recon >/dev/null 2>&1
|
||||||
|
then
|
||||||
|
echo "swift-recon command not found"
|
||||||
|
exit $STATE_UNKNOWN
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
case $field in
|
||||||
|
async_pending)
|
||||||
|
opt="--async"
|
||||||
|
;;
|
||||||
|
replication_time)
|
||||||
|
opt="--replication"
|
||||||
|
;;
|
||||||
|
ALL_auditor|ZBF_auditor)
|
||||||
|
opt="--auditor"
|
||||||
|
;;
|
||||||
|
updater_last_sweep)
|
||||||
|
opt="--updater"
|
||||||
|
;;
|
||||||
|
object_expiration_pass|expired_last_pass)
|
||||||
|
opt="--expirer"
|
||||||
|
;;
|
||||||
|
quarantined_objects|quarantined_accounts|quarantined_containers)
|
||||||
|
opt="--quarantined"
|
||||||
|
;;
|
||||||
|
orphan|tcp_in_use|time_wait|tcp6_in_use|tcp_mem_allocated_bytes)
|
||||||
|
opt="--sockstat"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
data=$(swift-recon $opt | sed -n 's/^\['$field'\] //gp')
|
||||||
|
eval $(echo $data | sed -n 's/^low: \([[:digit:]\.]*\), high: \([[:digit:]\.]*\), avg: \([[:digit:]\.]*\), total: \([[:digit:]\.]*\), Failed: \([[:digit:]\.]*\)%, no_result: \([[:digit:]\.]*\), reported: \([[:digit:]\.]*\)/low="\1";high="\2";avg="\3";total="\4";failed="\5";no_result="\6";reported="\7"/gp')
|
||||||
|
|
||||||
|
# no
|
||||||
|
failed=$(( ${failed/./} / 10 )) # change percent in perthousand
|
||||||
|
avg=$(( ${avg/./} / 10 )) # change percent in perthousand
|
||||||
|
|
||||||
|
if [ "$no_result" != "0" ]; then
|
||||||
|
echo "CRITICAL - $data"
|
||||||
|
exit $STATE_CRITICAL
|
||||||
|
elif [ "$failed" != "0" ]; then
|
||||||
|
echo "CRITICAL - $data"
|
||||||
|
exit $STATE_CRITICAL
|
||||||
|
elif [ -n "$critical" -a -n "$warning" ]; then
|
||||||
|
if [ $avg -ge $warning -a $avg -lt $critical ]; then
|
||||||
|
echo "WARNING - $data"
|
||||||
|
exit $STATE_WARNING
|
||||||
|
elif [ $avg -ge $critical ]; then
|
||||||
|
echo "CRITICAL - $data"
|
||||||
|
exit $STATE_CRITICAL
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
echo "OK - $data"
|
||||||
|
exit $STATE_OK
|
36
templates/clustercheck
Executable file
36
templates/clustercheck
Executable file
@@ -0,0 +1,36 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
# Script to make a proxy (ie HAProxy) capable of monitoring Percona XtraDB Cluster nodes properly
|
||||||
|
#
|
||||||
|
# Author: Olaf van Zandwijk <olaf.vanzandwijk@nedap.com>
|
||||||
|
# Documentation and download: https://github.com/olafz/percona-clustercheck
|
||||||
|
#
|
||||||
|
# Based on the original script from Unai Rodriguez
|
||||||
|
#
|
||||||
|
|
||||||
|
MYSQL_USERNAME="clustercheckuser"
|
||||||
|
MYSQL_PASSWORD="clustercheckpassword!"
|
||||||
|
ERR_FILE="/dev/null"
|
||||||
|
AVAILABLE_WHEN_DONOR=0
|
||||||
|
|
||||||
|
#
|
||||||
|
# Perform the query to check the wsrep_local_state
|
||||||
|
#
|
||||||
|
WSREP_STATUS=`mysql --user=${MYSQL_USERNAME} --password=${MYSQL_PASSWORD} -e "SHOW STATUS LIKE 'wsrep_local_state';" 2>${ERR_FILE} | awk '{if (NR!=1){print $2}}' 2>${ERR_FILE}`
|
||||||
|
|
||||||
|
if [[ "${WSREP_STATUS}" == "4" ]] || [[ "${WSREP_STATUS}" == "2" && ${AVAILABLE_WHEN_DONOR} == 1 ]]
|
||||||
|
then
|
||||||
|
# Percona XtraDB Cluster node local state is 'Synced' => return HTTP 200
|
||||||
|
/bin/echo -en "HTTP/1.1 200 OK\r\n"
|
||||||
|
/bin/echo -en "Content-Type: text/plain\r\n"
|
||||||
|
/bin/echo -en "\r\n"
|
||||||
|
/bin/echo -en "Mariadb Cluster Node is synced.\r\n"
|
||||||
|
/bin/echo -en "\r\n"
|
||||||
|
else
|
||||||
|
# Percona XtraDB Cluster node local state is not 'Synced' => return HTTP 503
|
||||||
|
/bin/echo -en "HTTP/1.1 503 Service Unavailable\r\n"
|
||||||
|
/bin/echo -en "Content-Type: text/plain\r\n"
|
||||||
|
/bin/echo -en "\r\n"
|
||||||
|
/bin/echo -en "Mariadb Cluster Node is not synced.\r\n"
|
||||||
|
/bin/echo -en "\r\n"
|
||||||
|
fi
|
54
templates/munin/munin-node.conf.Ubuntu
Normal file
54
templates/munin/munin-node.conf.Ubuntu
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
#
|
||||||
|
# Example config-file for munin-node
|
||||||
|
#
|
||||||
|
|
||||||
|
log_level 4
|
||||||
|
log_file /var/log/munin/munin-node.log
|
||||||
|
pid_file /var/run/munin/munin-node.pid
|
||||||
|
|
||||||
|
background 1
|
||||||
|
setsid 1
|
||||||
|
|
||||||
|
user root
|
||||||
|
group root
|
||||||
|
|
||||||
|
|
||||||
|
# Regexps for files to ignore
|
||||||
|
ignore_file [\#~]$
|
||||||
|
ignore_file DEADJOE$
|
||||||
|
ignore_file \.bak$
|
||||||
|
ignore_file %$
|
||||||
|
ignore_file \.dpkg-(tmp|new|old|dist)$
|
||||||
|
ignore_file \.rpm(save|new)$
|
||||||
|
ignore_file \.pod$
|
||||||
|
|
||||||
|
# Set this if the client doesn't report the correct hostname when
|
||||||
|
# telnetting to localhost, port 4949
|
||||||
|
#
|
||||||
|
#host_name localhost.localdomain
|
||||||
|
|
||||||
|
# A list of addresses that are allowed to connect. This must be a
|
||||||
|
# regular expression, since Net::Server does not understand CIDR-style
|
||||||
|
# network notation unless the perl module Net::CIDR is installed. You
|
||||||
|
# may repeat the allow line as many times as you'd like
|
||||||
|
|
||||||
|
allow ^127\.0\.0\.1$
|
||||||
|
allow ^::1$
|
||||||
|
|
||||||
|
# If you have installed the Net::CIDR perl module, you can use one or more
|
||||||
|
# cidr_allow and cidr_deny address/mask patterns. A connecting client must
|
||||||
|
# match any cidr_allow, and not match any cidr_deny. Note that a netmask
|
||||||
|
# *must* be provided, even if it's /32
|
||||||
|
#
|
||||||
|
# Example:
|
||||||
|
#
|
||||||
|
# cidr_allow 127.0.0.1/32
|
||||||
|
# cidr_allow 192.0.2.0/24
|
||||||
|
# cidr_deny 192.0.2.42/32
|
||||||
|
|
||||||
|
# Which address to bind to;
|
||||||
|
host *
|
||||||
|
# host 127.0.0.1
|
||||||
|
|
||||||
|
# And which port
|
||||||
|
port 4949
|
54
templates/munin/munin-node.conf.Ubuntu.precise
Normal file
54
templates/munin/munin-node.conf.Ubuntu.precise
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
#
|
||||||
|
# Example config-file for munin-node
|
||||||
|
#
|
||||||
|
|
||||||
|
log_level 4
|
||||||
|
log_file /var/log/munin/munin-node.log
|
||||||
|
pid_file /var/run/munin/munin-node.pid
|
||||||
|
|
||||||
|
background 1
|
||||||
|
setsid 1
|
||||||
|
|
||||||
|
user root
|
||||||
|
group root
|
||||||
|
|
||||||
|
|
||||||
|
# Regexps for files to ignore
|
||||||
|
ignore_file [\#~]$
|
||||||
|
ignore_file DEADJOE$
|
||||||
|
ignore_file \.bak$
|
||||||
|
ignore_file %$
|
||||||
|
ignore_file \.dpkg-(tmp|new|old|dist)$
|
||||||
|
ignore_file \.rpm(save|new)$
|
||||||
|
ignore_file \.pod$
|
||||||
|
|
||||||
|
# Set this if the client doesn't report the correct hostname when
|
||||||
|
# telnetting to localhost, port 4949
|
||||||
|
#
|
||||||
|
#host_name localhost.localdomain
|
||||||
|
|
||||||
|
# A list of addresses that are allowed to connect. This must be a
|
||||||
|
# regular expression, since Net::Server does not understand CIDR-style
|
||||||
|
# network notation unless the perl module Net::CIDR is installed. You
|
||||||
|
# may repeat the allow line as many times as you'd like
|
||||||
|
|
||||||
|
allow ^127\.0\.0\.1$
|
||||||
|
allow ^::1$
|
||||||
|
|
||||||
|
# If you have installed the Net::CIDR perl module, you can use one or more
|
||||||
|
# cidr_allow and cidr_deny address/mask patterns. A connecting client must
|
||||||
|
# match any cidr_allow, and not match any cidr_deny. Note that a netmask
|
||||||
|
# *must* be provided, even if it's /32
|
||||||
|
#
|
||||||
|
# Example:
|
||||||
|
#
|
||||||
|
# cidr_allow 127.0.0.1/32
|
||||||
|
# cidr_allow 192.0.2.0/24
|
||||||
|
# cidr_deny 192.0.2.42/32
|
||||||
|
|
||||||
|
# Which address to bind to;
|
||||||
|
host *
|
||||||
|
# host 127.0.0.1
|
||||||
|
|
||||||
|
# And which port
|
||||||
|
port 4949
|
18
templates/mysqlchk
Normal file
18
templates/mysqlchk
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
# default: on
|
||||||
|
# description: mysqlchk
|
||||||
|
service mysqlchk
|
||||||
|
{
|
||||||
|
# this is a config for xinetd, place it in /etc/xinetd.d/
|
||||||
|
disable = no
|
||||||
|
flags = REUSE
|
||||||
|
socket_type = stream
|
||||||
|
port = 9200
|
||||||
|
wait = no
|
||||||
|
user = nobody
|
||||||
|
server = /usr/bin/clustercheck
|
||||||
|
log_on_failure += USERID
|
||||||
|
only_from = 0.0.0.0/0
|
||||||
|
# recommended to put the IPs that need
|
||||||
|
# to connect exclusively (security purposes)
|
||||||
|
per_source = UNLIMITED
|
||||||
|
}
|
Reference in New Issue
Block a user