{"id":15022791,"url":"https://github.com/voxpupuli/puppet-corosync","last_synced_at":"2025-10-06T00:55:49.012Z","repository":{"id":2728317,"uuid":"3723449","full_name":"voxpupuli/puppet-corosync","owner":"voxpupuli","description":"Sets up and manages Corosync.","archived":false,"fork":false,"pushed_at":"2025-05-08T08:33:42.000Z","size":1491,"stargazers_count":45,"open_issues_count":32,"forks_count":161,"subscribers_count":114,"default_branch":"master","last_synced_at":"2025-05-13T03:28:15.154Z","etag":null,"topics":["centos-puppet-module","debian-puppet-module","hacktoberfest","linux-puppet-module","puppet","redhat-puppet-module","sles-puppet-module","ubuntu-puppet-module"],"latest_commit_sha":null,"homepage":"https://forge.puppet.com/puppet/corosync","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/voxpupuli.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":".github/CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":"ROADMAP.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null},"funding":{"open_collective":"vox-pupuli","github":"voxpupuli"}},"created_at":"2012-03-14T23:30:40.000Z","updated_at":"2025-05-08T08:33:45.000Z","dependencies_parsed_at":"2023-12-19T12:33:51.978Z","dependency_job_id":"9d033ae0-ad47-43ec-a42c-64e6553fa7a3","html_url":"https://github.com/voxpupuli/puppet-corosync","commit_stats":{"total_commits":589,"total_committers":104,"mean_commits":5.663461538461538,"dds":0.7436332767402377,"last_synced_commit":"6f302198e7a3c0a61d682a95bafc04901e026436"},"previous_names":["puppetlabs/puppetlabs-corosync"],"tags_count":29,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/voxpupuli%2Fpuppet-corosync","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/voxpupuli%2Fpuppet-corosync/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/voxpupuli%2Fpuppet-corosync/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/voxpupuli%2Fpuppet-corosync/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/voxpupuli","download_url":"https://codeload.github.com/voxpupuli/puppet-corosync/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254270641,"owners_count":22042858,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["centos-puppet-module","debian-puppet-module","hacktoberfest","linux-puppet-module","puppet","redhat-puppet-module","sles-puppet-module","ubuntu-puppet-module"],"created_at":"2024-09-24T19:58:23.106Z","updated_at":"2025-10-06T00:55:43.979Z","avatar_url":"https://github.com/voxpupuli.png","language":"Ruby","funding_links":["https://opencollective.com/vox-pupuli","https://github.com/sponsors/voxpupuli"],"categories":[],"sub_categories":[],"readme":"# Puppet module for Corosync \u0026 Pacemaker\n\n[![License](https://img.shields.io/github/license/voxpupuli/puppet-corosync.svg)](https://github.com/voxpupuli/puppet-corosync/blob/master/LICENSE)\n[![Build Status](https://travis-ci.org/voxpupuli/puppet-corosync.svg?branch=master)](https://travis-ci.org/voxpupuli/puppet-corosync)\n[![Code Coverage](https://coveralls.io/repos/github/voxpupuli/puppet-corosync/badge.svg?branch=master)](https://coveralls.io/github/voxpupuli/puppet-corosync)\n[![Puppet Forge](https://img.shields.io/puppetforge/v/puppet/corosync.svg)](https://forge.puppetlabs.com/puppet/corosync)\n[![Puppet Forge - downloads](https://img.shields.io/puppetforge/dt/puppet/corosync.svg)](https://forge.puppetlabs.com/puppet/corosync)\n[![Puppet Forge - endorsement](https://img.shields.io/puppetforge/e/puppet/corosync.svg)](https://forge.puppetlabs.com/puppet/corosync)\n[![Puppet Forge - scores](https://img.shields.io/puppetforge/f/puppet/corosync.svg)](https://forge.puppetlabs.com/puppet/corosync)\n-[![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/533/badge)](https://bestpractices.coreinfrastructure.org/projects/533)\n\nThe [clusterlabs][cl] stack incorporates Corosync and Pacemaker in an\nOpen-Source, High Availability stack for both small and large deployments.\n\nIt supports a lot of different HA setups and is very flexible.\n\nThis puppet module is suitable for the management of both the software stack\n(pacemaker and corosync) and the cluster resources (via puppet types and\nproviders).\n\n*Note:* This module is the successor of *puppetlabs-corosync*.\n\n[cl]:http://clusterlabs.org/\n\n## Documentation\n\n### Basic usage\n\n*To install and configure Corosync*\n\n```puppet\nclass { 'corosync':\n  authkey        =\u003e '/var/lib/puppet/ssl/certs/ca.pem',\n  bind_address   =\u003e $facts['networking']['ip'],\n  cluster_name   =\u003e 'mycluster',\n  enable_secauth =\u003e true,\n}\n```\n\n*To enable Pacemaker*\n\n```puppet\ncorosync::service { 'pacemaker':\n  version =\u003e '0',\n}\n```\n*To configure advanced and (very) verbose logging settings*\n\n```puppet\nclass { 'corosync':\n  log_stderr        =\u003e false,\n  log_function_name =\u003e true,\n  syslog_priority   =\u003e 'debug',\n  debug             =\u003e true,\n}\n```\n\n*To disable Corosync and Pacemaker services*\n\n```puppet\nclass { 'corosync':\n  enable_corosync_service  =\u003e false,\n  enable_pacemaker_service =\u003e false,\n}\n```\n\n### Configure Corosync Secure Authentication\n\nBy default the built-in Puppet CA will be used to perform this authentication,\nhowever, generating a dedicated key is a better approach.\n\n1. Generate a new key on a machine with Corosync installed and convert it to Base64.\n\n    ```bash\n    # Generate the key\n    corosync-keygen -k /tmp/authkey\n    ```\n2. Convert the key file to a Base64 string so it can be used in your manifest.\n\n    ```bash\n    # Convert it to a Base64 string\n    base64 -w 0 /tmp/authkey \u003e /tmp/authkey_base64\n    ```\n3. Declare the corosync module using this string.\n\n    ```puppet\n    class { 'corosync':\n      enable_secauth =\u003e true,\n      authkey_source =\u003e 'string',\n      authkey        =\u003e 'MxjvpEztT3Mi+QagUO2cefhLDrP2BSFYKS3g1WXTUj2eCgGDPcSNf3uCKgzJKhoWTgJm2nYDHJv8KiFqMoW3ATuVr/9fLb/lgUVfoz0GnP10S7r77aqaIsERhJcGVQhcteHVlZl6zOo6VQz4ekH7VPmMlKJX0iQPuJTh9o6qhjg=',\n    }\n    ```\n\nIf the authkey is included directly in config, consider storing the value in hiera and encrypting it via [hiera-eyaml](https://github.com/voxpupuli/hiera-eyaml).\n\n### PCSD Authorization\n\nThe pacemaker/corosync configuration system (pcs) includes a daemon (pcsd) which can be configured to perform distributed communication across the cluster. This is accomplished by establishing token-based authorization of each cluster node via the `pcs auth` command.\n\nOn systems which support it, management of PCS authorization can be configured and deployed via this module as shown in the following example:\n\n```puppet\nclass { 'corosync':\n  manage_pcsd_service          =\u003e true,\n  manage_pcsd_auth             =\u003e true,\n  sensitive_hacluster_password =\u003e Sensitive('this-is-the-actual-password'),\n  sensitive_hacluster_hash     =\u003e Sensitive('a-hash-of-the-passwd-for-the-user-resource'),\n}\n```\n\nNote that as this must only be executed on one node and by default the 'first' node in the cluster list is used. There may be timing issues if the configuration has not yet been applied on the other nodes as a successful execution requires the password for hacluster to be appropriately set on each system.\n\n### Configure votequorum\n\n*To enable Corosync 2 votequorum and define a nodelist\nof nodes named n1, n2, n3 with auto generated node IDs*\n\n```puppet\nclass { 'corosync':\n  set_votequorum =\u003e true,\n  quorum_members =\u003e [ 'n1', 'n2', 'n3' ],\n}\n```\n\n*To do the same but with custom node IDs instead*\n```puppet\nclass { 'corosync':\n  set_votequorum     =\u003e true,\n  quorum_members     =\u003e [ 'n1', 'n2', 'n3' ],\n  quorum_members_ids =\u003e [ 10, 11, 12 ],\n}\n```\n\nNote: custom IDs may be required when adding or removing\nnodes to a cluster on a fly. Then each node shall have an\nunique and persistent ID.\n\n*To have multiple rings in the nodelist*\n```puppet\nclass { 'corosync':\n  set_votequorum     =\u003e true,\n  quorum_members     =\u003e [\n    ['172.31.110.1', '172.31.111.1'],\n    ['172.31.110.2', '172.31.111.2'],\n  ],\n}\n```\n\nWhen `quorum_members` is an array of arrays, each sub array represents one\nhost IP addresses.\n\n#### Configure a Quorum Device (corosync-qdevice)\n\nRecent versions of corosync include support for a network based quorum device that is external to the cluster. This provides tiebreaker functionality to clusters with even node counts allowing 2-node or higher clusters which can operate with exactly half of their nodes to function. There are two components to quorum device configuration:\n\n* A node which is not a member of any Corosync cluster will host the corosync-qnet daemon. This node should be outside of the network containing the cluster nodes.\n* Each member of the cluster will be authorized to communicate with the quorum node and have the corosync-qdevice service scheduled and operating.\n\nThis implementation depends entirely on [PCSD authorization](#pcsd-authorization) and will only execute with that enabled.\n\n1. Configure the qdevice class on the quorum node. Note that the same quorum node can be used for multiple clusters. Additionally, this node **cannot be a normal cluster member**!\n\n    ```puppet\n    # In this example, the node's name is quorum1.test.org\n    class { 'corosync::qdevice':\n      sensitive_hacluster_hash =\u003e Sensitive('hash-of-haclusters-password-on-the-qdevice-node')\n    }\n    ```\n2. Configure and enable qdevice settings on the cluster members via the corosync main class.\n\n    ```puppet\n    class { 'corosync':\n      cluster_name                     =\u003e 'example',\n      manage_pcsd_service              =\u003e true,\n      manage_pcsd_auth                 =\u003e true,\n      sensitive_hacluster_password     =\u003e Sensitive('this-is-the-actual-password'),\n      sensitive_hacluster_hash         =\u003e Sensitive('a-hash-of-the-passwd-for-the-user-resource'),\n      manage_quorum_device             =\u003e true,\n      quorum_device_host               =\u003e 'quorum1.test.org',\n      quorum_device_algorithm          =\u003e 'ffsplit',\n      sensitive_quorum_device_password =\u003e Sensitive('Actual password for hacluster on quorum1.test.org'),\n    }\n    ```\n\nFor more information see the following:\n\n* [RedHat High Availability Add-On - 10.5 Quorum Devices](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/high_availability_add-on_reference/s1-quorumdev-haar)\n* [corosync-qdevice Man Page](https://www.systutorials.com/docs/linux/man/8-corosync-qdevice/)\n\n### Configuring primitives\n\nThe resources that Corosync will manage can be referred to as a primitive.\nThese are things like virtual IPs or services like drbd, nginx, and apache.\n\n*To assign a VIP to a network interface to be used by Nginx*\n\n```puppet\ncs_primitive { 'nginx_vip':\n  primitive_class =\u003e 'ocf',\n  primitive_type  =\u003e 'IPaddr2',\n  provided_by     =\u003e 'heartbeat',\n  parameters      =\u003e { 'ip' =\u003e '172.16.210.100', 'cidr_netmask' =\u003e '24' },\n  operations      =\u003e { 'monitor' =\u003e { 'interval' =\u003e '10s' } },\n}\n```\n\n*Make Corosync manage and monitor the state of Nginx using a custom OCF agent*\n\n```puppet\ncs_primitive { 'nginx_service':\n  primitive_class =\u003e 'ocf',\n  primitive_type  =\u003e 'nginx_fixed',\n  provided_by     =\u003e 'pacemaker',\n  operations      =\u003e {\n    'monitor'     =\u003e { 'interval' =\u003e '10s', 'timeout' =\u003e '30s' },\n    'start'       =\u003e { 'interval' =\u003e '0', 'timeout' =\u003e '30s', 'on-fail' =\u003e 'restart' }\n  },\n  require         =\u003e Cs_primitive['nginx_vip'],\n}\n```\n\n*Make Corosync manage and monitor the state of Apache using a LSB agent*\n\n```puppet\ncs_primitive { 'apache_service':\n  primitive_class =\u003e 'lsb',\n  primitive_type  =\u003e 'apache2',\n  provided_by     =\u003e 'heartbeat',\n  operations      =\u003e {\n    'monitor'     =\u003e { 'interval' =\u003e '10s', 'timeout' =\u003e '30s' },\n    'start'       =\u003e { 'interval' =\u003e '0', 'timeout' =\u003e '30s', 'on-fail' =\u003e 'restart' }\n  },\n  require         =\u003e Cs_primitive['apache2_vip'],\n}\n```\n\nNote: If you have multiple operations with the same names, you have to use an array.\nExample:\n```puppet\ncs_primitive { 'pgsql_service':\n  primitive_class =\u003e 'ocf',\n  primitive_type  =\u003e 'pgsql',\n  provided_by     =\u003e 'heartbeat',\n  operations      =\u003e [\n    { 'monitor'   =\u003e { 'interval' =\u003e '10s', 'timeout' =\u003e '30s' } },\n    { 'monitor'   =\u003e { 'interval' =\u003e '5s', 'timeout' =\u003e '30s' 'role' =\u003e 'Master', } },\n    { 'start'     =\u003e { 'interval' =\u003e '0', 'timeout' =\u003e '30s', 'on-fail' =\u003e 'restart' } }\n  ],\n}\n```\n\nIf you do mot want Puppet to interfere with manually stopped resources\n(e.g not change the `target-role` metaparameter), you can use the\n`unmanaged_metadata` parameter:\n\n```puppet\ncs_primitive { 'pgsql_service':\n  primitive_class    =\u003e 'ocf',\n  primitive_type     =\u003e 'pgsql',\n  provided_by        =\u003e 'heartbeat',\n  unmanaged_metadata =\u003e ['target-role'],\n}\n```\n\n### Configuring STONITH Resources\n\nSpecial primitives can be configured to support [STONITH (Shoot The Other Node In The Head)](https://clusterlabs.org/pacemaker/doc/en-US/Pacemaker/1.1/html-single/Pacemaker_Explained/index.html#_what_is_stonith) fencing. This is critical for clusters which include shared resources (shared disk typically) or are vulnerable to cluster splits. The STONITH resource is responsible for providing a mechanism to restart or simply halt a rouge resource, often via power fencing.\n\nThe following example performs this configuration via the *fence_vmware_soap* STONITH agent.\n\n```puppet\ncs_primitive { 'vmfence':\n  primitive_class =\u003e 'stonith',\n  primitive_type  =\u003e 'fence_vmware_soap',\n  operations      =\u003e {\n    'monitor'     =\u003e { 'interval' =\u003e '60s'},\n  },\n  parameters      =\u003e {\n    'ipaddr'          =\u003e 'vcenter.example.org',\n    'login'           =\u003e 'service-fence@vsphere.local'\n    'passwd'          =\u003e 'some plaintext secret',\n    'ssl'             =\u003e '1',\n    'ssl_insecure'    =\u003e '1',\n    'pcmk_host_map'   =\u003e 'host0.example.org:host0;host1.example.org:host1',\n    'pcmk_delay_max'  =\u003e '10s',\n  },\n}\n```\n\nNote that currently this implementation only handles STONITH for RHEL/CentOS based clusters which utilize `pcs`.\n\n### Configuring locations\n\nLocations determine on which nodes primitive resources run.\n\n```puppet\ncs_location { 'nginx_service_location':\n  primitive =\u003e 'nginx_service',\n  node_name =\u003e 'hostname',\n  score     =\u003e 'INFINITY'\n}\n```\n\nTo manage rule on a location.\nExample to force the location to not run on a container (VM).\n\n```puppet\ncs_location { 'nginx_service_location':\n  primitive =\u003e 'nginx_service',\n  rules     =\u003e [\n    { 'nginx-service-avoid-container-rule' =\u003e {\n        'score'      =\u003e '-INFINITY',\n        'expression' =\u003e [\n          { 'attribute' =\u003e '#kind',\n            'operation' =\u003e 'eq',\n            'value'     =\u003e 'container'\n          },\n        ],\n      },\n    },\n  ],\n}\n```\n\nExample of a virtual ip location that checks ping connectivity for placement.\n\n```puppet\ncs_location { 'vip-ping-connected':\n  primitive =\u003e 'vip',\n  rules     =\u003e [\n    { 'vip-ping-exclude-rule' =\u003e {\n        'score'      =\u003e '-INFINITY',\n        'expression' =\u003e [\n          { 'attribute' =\u003e 'pingd',\n            'operation' =\u003e 'lt',\n            'value'     =\u003e '100',\n          },\n        ],\n      },\n    },\n    { 'vip-ping-prefer-rule' =\u003e {\n        'score-attribute' =\u003e 'pingd',\n        'expression'      =\u003e [\n          { 'attribute' =\u003e 'pingd',\n            'operation' =\u003e 'defined',\n          }\n        ],\n      },\n    },\n  ],\n}\n```\n\nExample of another possibility to use ping connectivity for placement.\n\n```puppet\ncs_location { 'vip-ping-connected':\n  primitive =\u003e 'vip',\n  rules     =\u003e [\n    { 'vip-ping-connected-rule' =\u003e {\n        'score'      =\u003e '-INFINITY',\n        'boolean-op' =\u003e 'or',\n        'expression' =\u003e [\n          { 'attribute' =\u003e 'pingd',\n            'operation' =\u003e 'not_defined',\n          },\n          { 'attribute' =\u003e 'pingd',\n            'operation' =\u003e 'lte',\n            'value'     =\u003e '100',\n          },\n        ],\n      },\n    },\n  ],\n}\n```\n\n### Configuring colocations\n\nColocations keep primitives together.  Meaning if a vip moves to web02 from web01\nbecause web01 just hit the dirt it will drag the nginx service with it.\n\n```puppet\ncs_colocation { 'vip_with_service':\n  primitives =\u003e [ 'nginx_vip', 'nginx_service' ],\n}\n```\n\n*pcs only* Advanced colocations are also possible with colocation sets by using\narrays instead of strings in the primitives array. Additionally, a hash can be\nadded to the inner array with the specific options for that resource set.\n\n```puppet\ncs_colocation { 'mysql_and_ptheartbeat':\n  primitives =\u003e [\n    ['mysql', {'role' =\u003e 'master'}],\n    [ 'ptheartbeat' ],\n  ],\n}\n```\n\n```puppet\ncs_colocation { 'mysql_apache_munin_and_ptheartbeat':\n  primitives =\u003e [\n    ['mysql', 'apache', {'role' =\u003e 'master'}],\n    [ 'munin', 'ptheartbeat' ],\n  ],\n}\n```\n\n### Configuring migration or state order\n\nColocation defines that a set of primitives must live together on the same node\nbut order definitions will define the order of which each primitive is started.  If\nNginx is configured to listen only on our vip we definitely want the vip to be\nmigrated to a new node before nginx comes up or the migration will fail.\n\n```puppet\ncs_order { 'vip_before_service':\n  first   =\u003e 'nginx_vip',\n  second  =\u003e 'nginx_service',\n  require =\u003e Cs_colocation['vip_with_service'],\n}\n```\n\n### Configuring cloned resources/groups\n\nCloned resources should be active on multiple hosts at the same time. You can\nclone any existing resource provided the resource agent supports it.\n\n```puppet\ncs_clone { 'nginx_service-clone' :\n  ensure    =\u003e present,\n  primitive =\u003e 'nginx_service',\n  clone_max =\u003e 3,\n  require   =\u003e Cs_primitive['nginx_service'],\n}\n```\n\nYou can also clone groups:\n\n```puppet\ncs_clone { 'nginx_service-clone' :\n  ensure    =\u003e present,\n  group     =\u003e 'nginx_group',\n  clone_max =\u003e 3,\n  require   =\u003e Cs_primitive['nginx_service'],\n}\n```\n\nConfigure a Promotable (Active/Passive) resource\n\n```puppet\ncs_clone { 'redis-clone':\n  ensure            =\u003e present,\n  primitive         =\u003e 'redis',\n  clone_max         =\u003e 2,\n  clone_node_max    =\u003e 1,\n  promotable        =\u003e true,\n  promoted_max      =\u003e 1,\n  promoted_node_max =\u003e 1,\n  notify_clones     =\u003e true,\n}\n```\n\n### Corosync Properties\n\nA few global settings can be changed with the \"cs_property\" section.\n\nDisable STONITH if required.\n```puppet\ncs_property { 'stonith-enabled' :\n  value   =\u003e 'false',\n}\n```\n\nChange quorum policy\n```puppet\ncs_property { 'no-quorum-policy' :\n  value   =\u003e 'ignore',\n}\n```\n\nYou can use the replace parameter to create but not update some values:\n\n```puppet\ncs_property { 'maintenance-mode':\n  value   =\u003e 'true',\n  replace =\u003e false,\n}\n```\n\n### Resource defaults\n\nA few global settings can be changed with the \"cs_rsc_defaults\" section.\n\nDon't move resources.\n```puppet\ncs_rsc_defaults { 'resource-stickiness' :\n  value =\u003e 'INFINITY',\n}\n```\n\n### Multiple rings\n\nIn unicast mode, you can have multiple rings by specifying unicast_address and\nbind_address as arrays:\n\n```puppet\nclass { 'corosync':\n  enable_secauth    =\u003e true,\n  authkey           =\u003e '/var/lib/puppet/ssl/certs/ca.pem',\n  bind_address      =\u003e ['10.0.0.1', '10.0.1.1'],\n  unicast_addresses =\u003e [\n      [ '10.0.0.1',\n        '10.0.1.1'\n      ], [\n        '10.0.0.2',\n        '10.0.1.2'\n      ],\n  ],\n}\n```\n\nThe unicast_addresses is an array of arrays. One sub array matches one host\nIP addresses. In this example host2 has IP addresses 10.0.0.2 and 10.0.1.2.\n\n### Shadow CIB\n\nShadow CIB allows you to apply all the changes at the same time. For that, you\nneed to use the `cib` parameter and the `cs_commit` and `cs_shadow` types.\n\nShadow CIB is *the* recommended way to manage large CIB with puppet, as it will\napply all your changes at once, starting the cluster when everything is in\nplace: primitives, constraints, properties.\n\nIf you set the `cib` parameter to one `cs_*` resource we recommend you to set\nthat `cib` parameter to all the `cs_*` resources.\n\n\n```puppet\ncs_shadow {\n    'puppet':\n}\ncs_primitive { 'pgsql_service':\n  primitive_class =\u003e 'ocf',\n  primitive_type  =\u003e 'pgsql',\n  provided_by     =\u003e 'heartbeat',\n  cib             =\u003e 'puppet'\n}\ncs_commit {\n    'puppet':\n}\n```\n\n## Notes\n\n### Upstream documentation\nWe suggest you at least go read the [Clusters from Scratch](http://clusterlabs.org/pacemaker/doc/) document\nfrom Cluster Labs.  It will help you out a lot when understanding how all the pieces\nfall together a point you in the right direction when Corosync/Pacemaker fails unexpectedly.\n\n### Roadmap\n\nWe do maintain a [roadmap regarding next releases of this module](ROADMAP.md).\n\n### Operating System support matrix\n\n| OS          | release | Puppet 3.8.7  | Puppet 4 (PC1)   | Puppet 5.X       |\n|-------------|---------|---------------|------------------|------------------|\n| CentOS/RHEL | 7       | Not supported | **Supported**    | **Supported**    |\n| Debian      | 9       | Not supported | **Supported**    | **Supported**    |\n| Ubuntu      | 16.04   | Not supported | **Supported**    | **Supported**    |\n\n## Contributors\n\n[See Github](https://github.com/voxpupuli/puppet-corosync/graphs/contributors).\n\nSpecial thanks to [Puppet, Inc](http://puppet.com) for initial development and\n[Vox Pupuli](https://voxpupuli.org) to provide a platform that allows us to\ncontinue the development of this module.\n\n## Development\n\nSee the [contributing guide](.github/CONTRIBUTING.md) for details. Additionally, some general guidelines on PR structure can be found [here](https://voxpupuli.org/docs/#reviewing-a-module-pr).\n\n## Copyright and License\n\nCopyright © 2012-2014 [Puppet Inc](https://www.puppet.com/)\n\nCopyright © 2012-2018 [Multiple contributors][mc]\n\n[mc]:https://github.com/voxpupuli/puppet-corosync/graphs/contributors\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n  http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvoxpupuli%2Fpuppet-corosync","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvoxpupuli%2Fpuppet-corosync","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvoxpupuli%2Fpuppet-corosync/lists"}