merge pacemaker cookbooks

Preliminary merge of git://github.com/ktc-itsnotbutter/pacemaker.git
(in the chef/cookbooks/pacemaker/ directory) with the cookbook
from the pacemaker_service branch of:

  https://github.com/mattray/barclamp_ha_service.git

(in the chef/cookbooks/pacemaker2/ directory)

since both forks had some nice stuff.  This merge is not complete yet.
This commit is contained in:
Adam Spiers
2013-12-12 22:59:32 +00:00
parent e46108de39
commit a10a3ad461
13 changed files with 355 additions and 4 deletions

View File

@@ -1,4 +1,4 @@
Description DESCRIPTION
=========== ===========
This is a cookbook for installing and configuring pacemaker. This is a cookbook for installing and configuring pacemaker.

View File

@@ -1,3 +1,17 @@
# Copyright 2011, Dell, 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.
#
# Only use short hostname (not FQDN) # Only use short hostname (not FQDN)
default['pacemaker']['nodes'] = ['node1', 'node2'] default['pacemaker']['nodes'] = ['node1', 'node2']
@@ -79,3 +93,4 @@ default['pacemaker']['order']['o-lvm']['resources'] = ['drbd-cluster', 'clvm-clo
default['pacemaker']['order']['o-lvm']['active'] = "#{pacemaker['nodes']}" default['pacemaker']['order']['o-lvm']['active'] = "#{pacemaker['nodes']}"
default['pacemaker']['property']['no-quorum-policy'] = "ignore" default['pacemaker']['property']['no-quorum-policy'] = "ignore"
default['pacemaker']['services'] = {}

View File

@@ -0,0 +1,22 @@
name "pacemaker-active"
description "pacemaker active."
override_attributes(
"pacemaker" => {
"services" => {
"apache2" => {
"vip" => "10.0.111.5",
"active" => "ubuntu1-1004.vm"
},
"mysql" => {
"vip" => "10.0.111.7",
"passive" => ["ubuntu1-1004.vm"]
}
}
}
)
run_list(
"recipe[pacemaker::master]",
"recipe[pacemaker::services]"
)

View File

@@ -0,0 +1,14 @@
name "pacemaker-passive"
description "pacemaker passive."
override_attributes(
"pacemaker" => {
"services" => {
}
}
)
run_list(
"recipe[pacemaker::client]",
"recipe[pacemaker::services]"
)

3
files/default/corosync Normal file
View File

@@ -0,0 +1,3 @@
# managed by Chef
# start corosync at boot [yes|no]
START=yes

View File

@@ -1,7 +1,7 @@
name "pacemaker" name "pacemaker"
maintainer "Robert Choi" maintainer "Crowbar Project"
maintainer_email "taeilchoi1@gmail.com" maintainer_email "crowbar@dell.com"
license "Apache 2.0" license "Apache 2.0"
description "Installs/Configures Pacemaker" description "Installs/configures Pacemaker"
long_description IO.read(File.join(File.dirname(__FILE__), 'README.md')) long_description IO.read(File.join(File.dirname(__FILE__), 'README.md'))
version "0.1" version "0.1"

68
providers/service.rb Normal file
View File

@@ -0,0 +1,68 @@
#
# Author:: Matt Ray (<matt@opscode.com>)
# Cookbook Name:: pacemaker
# Provider:: service
#
# Copyright:: 2011, Opscode, 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.
#
# actions :create, :remove
# attribute :service, :kind_of => String, :name_attribute => true
# attribute :vip, :kind_of => String
# attribute :active, :default => false
# attribute :path, :kind_of => String
action :create do
service = new_resource.service
vip = new_resource.vip
active = new_resource.active
path = new_resource.path
Chef::Log.info "pacemaker_service #{service} #{vip} #{active} #{path}"
oldservice = node['pacemaker']['services'][service]
newservice = {}
newservice['vip'] = vip
if active
newservice['active'] = node.name
else
#search for active?
#newservice['active'] =
if oldservice
newservice['active'] = oldservice['active']
newservice['passive'] = oldservice['passive']
newservice['passive'].push(node.name)
newservice['passive'].uniq!.sort!
else
newservice['passive'] = [node.name]
end
end
#compare with previous state
if newservice != oldservice
#put the service into the attributes of the node
node['pacemaker']['services'][service] = newservice
#figure out how pacemaker handles services
new_resource.updated_by_last_action(true)
end
end
action :remove do
service = new_resource.service
if node['pacemaker']['services'][service]
#remove the parameters into the attributes of the node
node['pacemaker']['services'].delete(service)
#figure out how to restore services from pacemaker control
new_resource.updated_by_last_action(true)
end
end

29
recipes/client.rb Normal file
View File

@@ -0,0 +1,29 @@
require 'base64'
# Install haveged to create entropy so keygen doesn't take an hour
%w{ corosync pacemaker }.each do |pkg|
package pkg
end
authkey = ""
# Find the master node:
if !File.exists?("/etc/corosync/authkey")
master = search(:node, "corosync:authkey")
if master.nil? or (master.length > 1)
Chef::Application.fatal! "You must have one node with the pacemaker::master recipe in their run list to be a client."
end
Chef::Log.info "Found pacemaker::master node: #{master[0].name}"
authkey = Base64.decode64(master[0]['corosync']['authkey'])
end
file "/etc/corosync/authkey" do
not_if {File.exists?("/etc/corosync/authkey")}
content authkey
owner "root"
mode "0400"
action :create
end
#manage the corosync services
include_recipe "pacemaker::default"

43
recipes/master.rb Normal file
View File

@@ -0,0 +1,43 @@
require 'base64'
# Install haveged to create entropy so keygen doesn't take an hour
# odd errors coming out of automated installation, gets restarted next
package "haveged" do
ignore_failure true
end
%w{ corosync pacemaker }.each do |pkg|
package pkg
end
service "haveged" do
supports :restart => true, :status => :true
action [:enable, :start]
end
#create authkey
execute "corosync-keygen" do
creates "/etc/corosync/authkey"
user "root"
umask "0400"
action :run
end
# Read authkey (it's binary) into encoded format and save to chef server
ruby_block "Store authkey" do
block do
file = File.new('/etc/corosync/authkey', 'r')
contents = ""
file.each do |f|
contents << f
end
packed = Base64.encode64(contents)
node.set_unless['corosync']['authkey'] = packed
node.save
end
action :nothing
subscribes :create, resources(:execute => "corosync-keygen"), :immediately
end
#manage the corosync services
include_recipe "pacemaker::default"

34
recipes/services.rb Normal file
View File

@@ -0,0 +1,34 @@
#
# Author:: Matt Ray (<matt@opscode.com>)
# Cookbook Name:: pacemaker
# Recipe:: services
#
# Copyright 2011, Opscode, 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.
#
node['pacemaker']['services'].keys.each do |svc|
Chef::Log.debug "Pacemaker::services #{svc}"
Chef::Log.debug node['pacemaker']['services'][svc]
isactive = false
if node['pacemaker']['services'][svc]['active'].eql?(node.name)
isactive = true
end
pacemaker_service svc do
vip node['pacemaker']['services'][svc]['vip']
active isactive
path node['pacemaker']['services'][svc]['path']
action :create
end
end

26
resources/service.rb Normal file
View File

@@ -0,0 +1,26 @@
#
# Author:: Matt Ray (<matt@opscode.com>)
# Cookbook Name:: pacemaker
# Resource:: service
#
# Copyright:: 2011, Opscode, 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.
#
actions :create, :remove
attribute :service, :kind_of => String, :name_attribute => true
attribute :vip, :kind_of => String
attribute :active, :default => false
attribute :path, :kind_of => String

View File

@@ -0,0 +1,77 @@
# Dynamically generated by Chef on <%= node["fqdn"] %>
# Please read the openais.conf.5 manual page
totem {
version: 2
# How long before declaring a token lost (ms)
token: 3000
# How many token retransmits before forming a new configuration
token_retransmits_before_loss_const: 10
# How long to wait for join messages in the membership protocol (ms)
join: 60
# How long to wait for consensus to be achieved before starting a new round of membership configuration (ms)
consensus: 5000
# Turn off the virtual synchrony filter
vsftype: none
# Number of messages that may be sent by one processor on receipt of the token
max_messages: 20
# Limit generated nodeids to 31-bits (positive signed integers)
clear_node_high_bit: yes
# Disable encryption
secauth: off
# How many threads to use for encryption/decryption
threads: 0
# Optionally assign a fixed node id (integer)
# nodeid: 1234
# This specifies the mode of redundant ring, which may be none, active, or passive.
rrp_mode: none
interface {
# The following values need to be set based on your environment
ringnumber: 0
bindnetaddr: <%= @bindnetaddr %>
mcastaddr: 226.94.1.1
mcastport: 5405
}
}
amf {
mode: disabled
}
service {
# Load the Pacemaker Cluster Resource Manager
ver: 0
name: pacemaker
}
aisexec {
user: root
group: root
}
logging {
fileline: off
to_stderr: yes
to_logfile: no
to_syslog: yes
syslog_facility: daemon
debug: off
timestamp: on
logger_subsys {
subsys: AMF
debug: off
tags: enter|leave|trace1|trace2|trace3|trace4|trace6
}
}

View File

@@ -0,0 +1,20 @@
# Logging
debug 1
use_logd false
logfacility daemon
# Misc Options
traditional_compression off
compression bz2
coredumps true
# Communications
udpport 691
bcast eth0
autojoin any
# Thresholds (in seconds)
keepalive 1
warntime 6
deadtime 10
initdead 15