fuel-library/deployment/puppet/corosync
Bogdan Dobrelya 7a75e103af Adapt corosync for Fuel
* Fix *_real evaluation for erb templates
 (TODO contribute to puppetlabs-corosync upstream)
* Add corosync v2 support
 (TODO contribute to puppetlabs-corosync upstream)
* Adjust logging options for corosync.conf
 (TODO contribute to puppetlabs-corosync upstream)
* Remove 'retries' references for cs_property
* Fix missing block until ready call for cs_property flush
 (TODO contribute to puppetlabs-corosync upstream)
* Rename custom cs_* providers tuned for a parallel execution
  and move them to the pacemaker module:
  - cs_resource
  - cs_rsc_colocation
  - cs_rsc_location
  - cs_rsc_order
* TODO Fix Pacemaker module rspecs (disabled in utils for now)
* Enable rspecs for corosync module

Fuel-ci: disable
related blueprint corosync-2

Change-Id: Ib04360291f99f790f442c4f7382a863206078e27
Signed-off-by: Bogdan Dobrelya <bdobrelia@mirantis.com>
2015-01-23 11:05:09 +01:00
..
lib/puppet Adapt corosync for Fuel 2015-01-23 11:05:09 +01:00
manifests Adapt corosync for Fuel 2015-01-23 11:05:09 +01:00
spec Sync corosync upstream 2015-01-23 11:05:09 +01:00
templates Adapt corosync for Fuel 2015-01-23 11:05:09 +01:00
tests Sync corosync upstream 2015-01-23 11:05:09 +01:00
.fixtures.yml Support for corosync 2 2015-01-23 11:05:06 +01:00
.gitignore Sync corosync upstream 2015-01-23 11:05:09 +01:00
.travis.yml Support for corosync 2 2015-01-23 11:05:06 +01:00
CHANGELOG.md Sync corosync upstream 2015-01-23 11:05:09 +01:00
Gemfile Support for corosync 2 2015-01-23 11:05:06 +01:00
LICENSE Support for corosync 2 2015-01-23 11:05:06 +01:00
metadata.json Sync corosync upstream 2015-01-23 11:05:09 +01:00
Rakefile FUEL-406 pacemaker manifests 2013-02-22 18:26:01 +04:00
README.md Sync corosync upstream 2015-01-23 11:05:09 +01:00

Puppet Labs module for Corosync

Build Status

Corosync is a cluster stack written as a reimplementation of all the core functionalities required by openais. Meant to provide 100% correct operation during failures or partitionable networks.

Most famous for being the cluster stack used by Pacemaker to support n-code clusters that can respond to node and resource level events.

Basic usage

To install and configure Corosync

class { 'corosync':
  enable_secauth    => true,
  authkey           => '/var/lib/puppet/ssl/certs/ca.pem',
  bind_address      => $ipaddress,
  multicast_address => '239.1.1.2',
}

To enable Pacemaker

corosync::service { 'pacemaker':
  version => '0',
}

Configuring primitives

The resources that Corosync will manage can be referred to as a primitive. These are things like virtual IPs or services like drbd, nginx, and apache.

To assign a VIP to a network interface to be used by Nginx

cs_primitive { 'nginx_vip':
  primitive_class => 'ocf',
  primitive_type  => 'IPaddr2',
  provided_by     => 'heartbeat',
  parameters      => { 'ip' => '172.16.210.100', 'cidr_netmask' => '24' },
  operations      => { 'monitor' => { 'interval' => '10s' } },
}

Make Corosync manage and monitor the state of Nginx using a custom OCF agent

cs_primitive { 'nginx_service':
  primitive_class => 'ocf',
  primitive_type  => 'nginx_fixed',
  provided_by     => 'pacemaker',
  operations      => {
    'monitor' => { 'interval' => '10s', 'timeout' => '30s' },
    'start'   => { 'interval' => '0', 'timeout' => '30s', 'on-fail' => 'restart' }
  },
  require         => Cs_primitive['nginx_vip'],
}

Make Corosync manage and monitor the state of Apache using a LSB agent

cs_primitive { 'nginx_service':
  primitive_class => 'lsb',
  primitive_type  => 'apache2',
  provided_by     => 'heartbeat',
  operations      => {
    'monitor' => { 'interval' => '10s', 'timeout' => '30s' },
    'start'   => { 'interval' => '0', 'timeout' => '30s', 'on-fail' => 'restart' }
  },
  require         => Cs_primitive['apache2_vip'],
}

Note: Operations with the same names should be declared as an Array. Example:

cs_primitive { 'pgsql_service':
  primitive_class => 'ocf',
  primitive_type  => 'pgsql',
  provided_by     => 'heartbeat',
  operations      => {
    'monitor' => [
      { 'interval' => '10s', 'timeout' => '30s' },
      { 'interval' => '5s', 'timeout' => '30s', 'role' => 'Master' },
    ],
    'start'   => { 'interval' => '0', 'timeout' => '30s', 'on-fail' => 'restart' }
  },
}

Configuring locations

Locations determine on which nodes primitive resources run.

cs_location { 'nginx_service_location':
  primitive => 'nginx_service',
  node_name => 'hostname',
  score     => 'INFINITY'
}

Configuring colocations

Colocations keep primitives together. Meaning if a vip moves to web02 from web01 because web01 just hit the dirt it will drag the nginx service with it.

cs_colocation { 'vip_with_service':
  primitives => [ 'nginx_vip', 'nginx_service' ],
}

Configuring migration or state order

Colocation defines that a set of primitives must live together on the same node but order definitions will define the order of which each primitive is started. If Nginx is configured to listen only on our vip we definitely want the vip to be migrated to a new node before nginx comes up or the migration will fail.

cs_order { 'vip_before_service':
  first   => 'nginx_vip',
  second  => 'nginx_service',
  require => Cs_colocation['vip_with_service'],
}

Corosync Properties

A few gloabal settings can be changed with the "cs_property" section.

Disable STONITH if required.

cs_property { 'stonith-enabled' :
  value   => 'false',
}

Change quorum policy

cs_property { 'no-quorum-policy' :
  value   => 'ignore',
}

Dependencies

Tested and built on Debian 6 using backports so version 1.4.2 of Corosync is validated to function.

Notes

This module doesn't abstract away everything about managing Corosync but makes setup and automation easier. Things that are currently outstanding...

  • Needs a lot more tests.
  • There is already a handful of bugs that need to be worked out.
  • Plus a other things since Corosync and Pacemaker do a lot.

We suggest you at least go read the Clusters from Scratch document from Cluster Labs. It will help you out a lot when understanding how all the pieces fall together a point you in the right direction when Corosync fails unexpectedly.

A simple but complete manifest example can be found on Cody Herriges' Github, plus there are more incomplete examples spread across the Puppet Labs Github.

Contributors

Copyright (C) 2012 Puppet Labs Inc

Puppet Labs can be contacted at: info@puppetlabs.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.