puppet-tripleo/manifests/profile/pacemaker/ceph_nfs.pp

155 lines
5.2 KiB
Puppet

# Copyright 2016 Red Hat, 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.
#
# == Class: tripleo::profile::pacemaker::ceph_nfs
#
# Ganesha Pacemaker HA profile for tripleo
#
# === Parameters
#
# [*bootstrap_node*]
# (Optional) The hostname of the node responsible for bootstrapping tasks
# Defaults to hiera('ceph_nfs_short_bootstrap_node_name')
#
# [*step*]
# (Optional) The current step in deployment. See tripleo-heat-templates
# for more details.
# Defaults to hiera('step')
#
# [*pcs_tries*]
# (Optional) The number of times pcs commands should be retried.
# Defaults to hiera('pcs_tries', 20)
#
class tripleo::profile::pacemaker::ceph_nfs (
$bootstrap_node = hiera('ceph_nfs_short_bootstrap_node_name'),
$step = hiera('step'),
$pcs_tries = hiera('pcs_tries', 20),
) {
if $bootstrap_node and $::hostname == downcase($bootstrap_node) {
$pacemaker_master = true
} else {
$pacemaker_master = false
}
$ganesha_vip = hiera('ganesha_vip')
# NB: Until the IPaddr2 RA has a fix for https://bugzilla.redhat.com/show_bug.cgi?id=1445628
# we need to specify the nic when creating the ipv6 vip.
if is_ipv6_address($ganesha_vip) {
$netmask = '128'
$nic = interface_for_ip($ganesha_vip)
$ipv6_addrlabel = '99'
} else {
$netmask = '32'
$nic = ''
$ipv6_addrlabel = ''
}
Service <| tag == 'ceph-nfs' |> {
hasrestart => true,
restart => '/bin/true',
start => '/bin/true',
stop => '/bin/true',
}
if $step >= 2 {
if $pacemaker_master {
# At step2 we only create the node property on master so that
# both VIP and (later at step5) ceph-nfs service can start on master
# node only. This way we can guarantee that the VIP and ceph-nfs are
# colocated. Later we expand the properties on all nodes where ceph_nfs
# is supposed to run.
pacemaker::property { 'ceph-nfs-role-node-property':
property => 'ceph-nfs-role',
value => true,
tries => $pcs_tries,
node => $::hostname,
}
pacemaker::resource::ip { 'ganesha_vip':
ip_address => $ganesha_vip,
cidr_netmask => $netmask,
nic => $nic,
#ipv6_addrlabel => $ipv6_addrlabel,
#ipv6_addrlabel => '',
tries => $pcs_tries,
location_rule => {
resource_discovery => 'exclusive',
score => 0,
expression => ['ceph-nfs-role eq true'],
},
}
}
}
# When we create manila-share resource at step 5 we need the ceph-nfs pcmk resource up
# and running. But since we moved to pcs commands invoked on host, manila-share at step5
# gets created *before* ceph-nfs (as it is invoked via step_config vs docker_config)
if $step >= 4 and $pacemaker_master {
pacemaker::resource::service { 'ceph-nfs' :
service_name => 'ceph-nfs@pacemaker',
op_params => 'start timeout=200s stop timeout=200s',
tries => $pcs_tries,
location_rule => {
resource_discovery => 'exclusive',
score => 0,
expression => ['ceph-nfs-role eq true'],
},
}
pacemaker::constraint::colocation { 'ganesha_vip-with-ganesha':
source => "ip-${ganesha_vip}",
target => 'ceph-nfs',
score => 'INFINITY',
tries => $pcs_tries,
}
pacemaker::constraint::order { 'ganesha_vip-then-ganesha':
first_resource => "ip-${ganesha_vip}",
second_resource => 'ceph-nfs',
first_action => 'start',
second_action => 'start',
constraint_params => 'kind=Optional',
tries => $pcs_tries,
tag => 'pacemaker_constraint',
}
# See comment on pacemaker::property at step2
if (hiera('ceph_nfs_short_node_names_override', undef)) {
$ceph_nfs_short_node_names = hiera('ceph_nfs_short_node_names_override')
} else {
$ceph_nfs_short_node_names = hiera('ceph_nfs_short_node_names')
}
$ceph_nfs_short_node_names.each |String $node_name| {
# We only set the properties for the non-bootstrap nodes
# because we set the property for the bootstrap node at step 2
# already
if $node_name != $bootstrap_node {
pacemaker::property { "ceph-nfs-role-${node_name}":
property => 'ceph-nfs-role',
value => true,
tries => $pcs_tries,
node => $node_name,
}
}
}
Pacemaker::Resource::Ip['ganesha_vip']
-> Pacemaker::Resource::Service['ceph-nfs']
-> Pacemaker::Constraint::Order['ganesha_vip-then-ganesha']
-> Pacemaker::Constraint::Colocation['ganesha_vip-with-ganesha']
-> Pacemaker::Property<||>
}
}