summaryrefslogtreecommitdiffstats
path: root/puppet
diff options
context:
space:
mode:
Diffstat (limited to 'puppet')
-rw-r--r--puppet/compute-puppet.yaml2
-rw-r--r--puppet/controller-post-puppet.yaml10
-rw-r--r--puppet/controller-puppet.yaml40
-rw-r--r--puppet/manifests/overcloud_compute.pp4
-rw-r--r--puppet/manifests/overcloud_controller.pp10
-rw-r--r--puppet/manifests/overcloud_controller_pacemaker.pp174
6 files changed, 192 insertions, 48 deletions
diff --git a/puppet/compute-puppet.yaml b/puppet/compute-puppet.yaml
index 7e49bc22..afe85d18 100644
--- a/puppet/compute-puppet.yaml
+++ b/puppet/compute-puppet.yaml
@@ -351,7 +351,7 @@ resources:
nova::compute::libvirt::libvirt_virt_type: {get_input: nova_compute_libvirt_type}
nova_api_host: {get_input: nova_api_host}
nova::compute::vncproxy_host: {get_input: nova_public_ip}
- nova_enable_rbd_backend: {get_input: nova_enable_rbd_backend}
+ nova::compute::rbd::ephemeral_storage: {get_input: nova_enable_rbd_backend}
nova_password: {get_input: nova_password}
nova::compute::vncserver_proxyclient_address: {get_input: nova_vnc_proxyclient_address}
ceilometer::debug: {get_input: debug}
diff --git a/puppet/controller-post-puppet.yaml b/puppet/controller-post-puppet.yaml
index e88561e6..49cbe1e2 100644
--- a/puppet/controller-post-puppet.yaml
+++ b/puppet/controller-post-puppet.yaml
@@ -83,6 +83,16 @@ resources:
step: 4
update_identifier: {get_param: NodeConfigIdentifiers}
+ ControllerOvercloudServicesDeployment_Step6:
+ type: OS::Heat::StructuredDeployments
+ depends_on: ControllerOvercloudServicesDeployment_Step5
+ properties:
+ servers: {get_param: servers}
+ config: {get_resource: ControllerPuppetConfig}
+ input_values:
+ step: 5
+ update_identifier: {get_param: NodeConfigIdentifiers}
+
# Note, this should come last, so use depends_on to ensure
# this is created after any other resources.
ExtraConfig:
diff --git a/puppet/controller-puppet.yaml b/puppet/controller-puppet.yaml
index 1e563331..5a356bcc 100644
--- a/puppet/controller-puppet.yaml
+++ b/puppet/controller-puppet.yaml
@@ -72,6 +72,10 @@ parameters:
default: ''
description: Set to True to enable debugging on all services.
type: string
+ EnableFencing:
+ default: false
+ description: Whether to enable fencing in Pacemaker or not.
+ type: boolean
EnableGalera:
default: true
description: Whether to use Galera instead of regular MariaDB.
@@ -122,6 +126,38 @@ parameters:
}
}
type: json
+ FencingConfig:
+ default: {}
+ description: |
+ Pacemaker fencing configuration. The JSON should have
+ the following structure:
+ {
+ "devices": [
+ {
+ "agent": "AGENT_NAME",
+ "host_mac": "HOST_MAC_ADDRESS",
+ "params": {"PARAM_NAME": "PARAM_VALUE"}
+ }
+ ]
+ }
+ For instance:
+ {
+ "devices": [
+ {
+ "agent": "fence_xvm",
+ "host_mac": "52:54:00:aa:bb:cc",
+ "params": {
+ "multicast_address": "225.0.0.12",
+ "port": "baremetal_0",
+ "manage_fw": true,
+ "manage_key_file": true,
+ "key_file": "/etc/fence_xvm.key",
+ "key_file_password": "abcdef"
+ }
+ }
+ ]
+ }
+ type: json
Flavor:
description: Flavor for control nodes to request when deploying.
type: string
@@ -634,6 +670,7 @@ resources:
- - 'http://'
- {get_param: KeystonePublicApiVirtualIP}
- ':5000/v2.0/'
+ enable_fencing: {get_param: EnableFencing}
enable_galera: {get_param: EnableGalera}
enable_ceph_storage: {get_param: EnableCephStorage}
enable_swift_storage: {get_param: EnableSwiftStorage}
@@ -714,6 +751,7 @@ resources:
- '@'
- {get_param: MysqlVirtualIP}
- '/nova'
+ fencing_config: {get_param: FencingConfig}
pcsd_password: {get_param: PcsdPassword}
rabbit_username: {get_param: RabbitUserName}
rabbit_password: {get_param: RabbitPassword}
@@ -803,7 +841,9 @@ resources:
bootstack_nodeid: {get_input: bootstack_nodeid}
# Pacemaker
+ enable_fencing: {get_input: enable_fencing}
hacluster_pwd: {get_input: pcsd_password}
+ tripleo::fencing::config: {get_input: fencing_config}
# Swift
swift::proxy::proxy_local_net_ip: {get_input: swift_proxy_network}
diff --git a/puppet/manifests/overcloud_compute.pp b/puppet/manifests/overcloud_compute.pp
index 92171e87..67a73dda 100644
--- a/puppet/manifests/overcloud_compute.pp
+++ b/puppet/manifests/overcloud_compute.pp
@@ -51,7 +51,7 @@ nova_config {
'DEFAULT/linuxnet_interface_driver': value => 'nova.network.linux_net.LinuxOVSInterfaceDriver';
}
-$nova_enable_rbd_backend = hiera('nova_enable_rbd_backend', false)
+$nova_enable_rbd_backend = hiera('nova::compute::rbd::ephemeral_storage', false)
if $nova_enable_rbd_backend {
include ::ceph::profile::client
@@ -89,4 +89,4 @@ class { 'snmp':
snmpd_config => [ join(['rouser ', hiera('snmpd_readonly_user_name')]), 'proc cron', 'includeAllDisks 10%', 'master agentx', 'trapsink localhost public', 'iquerySecName internalUser', 'rouser internalUser', 'defaultMonitors yes', 'linkUpDownNotifications yes' ],
}
-hiera_include('compute_classes') \ No newline at end of file
+hiera_include('compute_classes')
diff --git a/puppet/manifests/overcloud_controller.pp b/puppet/manifests/overcloud_controller.pp
index db8b1cf1..777ebad6 100644
--- a/puppet/manifests/overcloud_controller.pp
+++ b/puppet/manifests/overcloud_controller.pp
@@ -237,16 +237,18 @@ if hiera('step') >= 3 {
$glance_backend = downcase(hiera('glance_backend', 'swift'))
case $glance_backend {
- swift: { $glance_store = 'glance.store.swift.Store' }
- file: { $glance_store = 'glance.store.filesystem.Store' }
- rbd: { $glance_store = 'glance.store.rbd.Store' }
+ swift: { $backend_store = 'glance.store.swift.Store' }
+ file: { $backend_store = 'glance.store.filesystem.Store' }
+ rbd: { $backend_store = 'glance.store.rbd.Store' }
default: { fail('Unrecognized glance_backend parameter.') }
}
+ $http_store = ['glance.store.http.Store']
+ $glance_store = concat($http_store, $backend_store)
# TODO: notifications, scrubber, etc.
include ::glance
class { 'glance::api':
- known_stores => [$glance_store]
+ known_stores => $glance_store
}
include ::glance::registry
include join(['::glance::backend::', $glance_backend])
diff --git a/puppet/manifests/overcloud_controller_pacemaker.pp b/puppet/manifests/overcloud_controller_pacemaker.pp
index 541e55bf..582e29ef 100644
--- a/puppet/manifests/overcloud_controller_pacemaker.pp
+++ b/puppet/manifests/overcloud_controller_pacemaker.pp
@@ -37,6 +37,8 @@ if $::hostname == downcase(hiera('bootstrap_nodeid')) {
$sync_db = false
}
+$enable_fencing = str2bool(hiera('enable_fencing', 'false')) and hiera('step') >= 5
+
# When to start and enable services which haven't been Pacemakerized
# FIXME: remove when we start all OpenStack services using Pacemaker
# (occurences of this variable will be gradually replaced with false)
@@ -72,7 +74,13 @@ if hiera('step') >= 1 {
setup_cluster => $pacemaker_master,
}
class { '::pacemaker::stonith':
- disable => true,
+ disable => !$enable_fencing,
+ }
+ if $enable_fencing {
+ include tripleo::fencing
+
+ # enable stonith after all fencing devices have been created
+ Class['tripleo::fencing'] -> Class['pacemaker::stonith']
}
# Only configure RabbitMQ in this step, don't start it yet to
@@ -175,13 +183,78 @@ if hiera('step') >= 2 {
# parameters here to configure pacemaker VIPs. The configuration
# of pacemaker VIPs could move into puppet-tripleo or we should
# make use of less specific hiera parameters here for the settings.
+ pacemaker::resource::service { 'haproxy':
+ clone_params => true,
+ }
+
$control_vip = hiera('tripleo::loadbalancer::controller_virtual_ip')
pacemaker::resource::ip { 'control_vip':
ip_address => $control_vip,
}
+ pacemaker::constraint::base { 'control_vip-then-haproxy':
+ constraint_type => 'order',
+ first_resource => "ip-${control_vip}",
+ second_resource => 'haproxy-clone',
+ first_action => 'start',
+ second_action => 'start',
+ constraint_params => 'kind=Optional',
+ require => [Pacemaker::Resource::Service['haproxy'],
+ Pacemaker::Resource::Ip['control_vip']],
+ }
+ pacemaker::constraint::colocation { 'control_vip-with-haproxy':
+ source => "ip-${control_vip}",
+ target => 'haproxy-clone',
+ score => 'INFINITY',
+ require => [Pacemaker::Resource::Service['haproxy'],
+ Pacemaker::Resource::Ip['control_vip']],
+ }
+
$public_vip = hiera('tripleo::loadbalancer::public_virtual_ip')
- pacemaker::resource::ip { 'public_vip':
- ip_address => $public_vip,
+ if $public_vip and $public_vip != $control_vip {
+ pacemaker::resource::ip { 'public_vip':
+ ip_address => $public_vip,
+ }
+ pacemaker::constraint::base { 'public_vip-then-haproxy':
+ constraint_type => 'order',
+ first_resource => "ip-${public_vip}",
+ second_resource => 'haproxy-clone',
+ first_action => 'start',
+ second_action => 'start',
+ constraint_params => 'kind=Optional',
+ require => [Pacemaker::Resource::Service['haproxy'],
+ Pacemaker::Resource::Ip['public_vip']],
+ }
+ pacemaker::constraint::colocation { 'public_vip-with-haproxy':
+ source => "ip-${public_vip}",
+ target => 'haproxy-clone',
+ score => 'INFINITY',
+ require => [Pacemaker::Resource::Service['haproxy'],
+ Pacemaker::Resource::Ip['public_vip']],
+ }
+ }
+
+ $redis_vip = hiera('redis_vip')
+ if $redis_vip and $redis_vip != $control_vip {
+ pacemaker::resource::ip { 'redis_vip':
+ ip_address => $redis_vip,
+ }
+ pacemaker::constraint::base { 'redis_vip-then-haproxy':
+ constraint_type => 'order',
+ first_resource => "ip-${redis_vip}",
+ second_resource => 'haproxy-clone',
+ first_action => 'start',
+ second_action => 'start',
+ constraint_params => 'kind=Optional',
+ require => [Pacemaker::Resource::Service['haproxy'],
+ Pacemaker::Resource::Ip['redis_vip']],
+ }
+ pacemaker::constraint::colocation { 'redis_vip-with-haproxy':
+ source => "ip-${redis_vip}",
+ target => 'haproxy-clone',
+ score => 'INFINITY',
+ require => [Pacemaker::Resource::Service['haproxy'],
+ Pacemaker::Resource::Ip['redis_vip']],
+ }
}
$internal_api_vip = hiera('tripleo::loadbalancer::internal_api_virtual_ip')
@@ -189,6 +262,23 @@ if hiera('step') >= 2 {
pacemaker::resource::ip { 'internal_api_vip':
ip_address => $internal_api_vip,
}
+ pacemaker::constraint::base { 'internal_api_vip-then-haproxy':
+ constraint_type => 'order',
+ first_resource => "ip-${internal_api_vip}",
+ second_resource => 'haproxy-clone',
+ first_action => 'start',
+ second_action => 'start',
+ constraint_params => 'kind=Optional',
+ require => [Pacemaker::Resource::Service['haproxy'],
+ Pacemaker::Resource::Ip['internal_api_vip']],
+ }
+ pacemaker::constraint::colocation { 'internal_api_vip-with-haproxy':
+ source => "ip-${internal_api_vip}",
+ target => 'haproxy-clone',
+ score => 'INFINITY',
+ require => [Pacemaker::Resource::Service['haproxy'],
+ Pacemaker::Resource::Ip['internal_api_vip']],
+ }
}
$storage_vip = hiera('tripleo::loadbalancer::storage_virtual_ip')
@@ -196,6 +286,23 @@ if hiera('step') >= 2 {
pacemaker::resource::ip { 'storage_vip':
ip_address => $storage_vip,
}
+ pacemaker::constraint::base { 'storage_vip-then-haproxy':
+ constraint_type => 'order',
+ first_resource => "ip-${storage_vip}",
+ second_resource => 'haproxy-clone',
+ first_action => 'start',
+ second_action => 'start',
+ constraint_params => 'kind=Optional',
+ require => [Pacemaker::Resource::Service['haproxy'],
+ Pacemaker::Resource::Ip['storage_vip']],
+ }
+ pacemaker::constraint::colocation { 'storage_vip-with-haproxy':
+ source => "ip-${storage_vip}",
+ target => 'haproxy-clone',
+ score => 'INFINITY',
+ require => [Pacemaker::Resource::Service['haproxy'],
+ Pacemaker::Resource::Ip['storage_vip']],
+ }
}
$storage_mgmt_vip = hiera('tripleo::loadbalancer::storage_mgmt_virtual_ip')
@@ -203,11 +310,25 @@ if hiera('step') >= 2 {
pacemaker::resource::ip { 'storage_mgmt_vip':
ip_address => $storage_mgmt_vip,
}
+ pacemaker::constraint::base { 'storage_mgmt_vip-then-haproxy':
+ constraint_type => 'order',
+ first_resource => "ip-${storage_mgmt_vip}",
+ second_resource => 'haproxy-clone',
+ first_action => 'start',
+ second_action => 'start',
+ constraint_params => 'kind=Optional',
+ require => [Pacemaker::Resource::Service['haproxy'],
+ Pacemaker::Resource::Ip['storage_mgmt_vip']],
+ }
+ pacemaker::constraint::colocation { 'storage_mgmt_vip-with-haproxy':
+ source => "ip-${storage_mgmt_vip}",
+ target => 'haproxy-clone',
+ score => 'INFINITY',
+ require => [Pacemaker::Resource::Service['haproxy'],
+ Pacemaker::Resource::Ip['storage_mgmt_vip']],
+ }
}
- pacemaker::resource::service { 'haproxy':
- clone_params => true,
- }
pacemaker::resource::service { $::memcached::params::service_name :
clone_params => true,
require => Class['::memcached'],
@@ -255,28 +376,6 @@ if hiera('step') >= 2 {
resource_params => 'wait_last_known_master=true',
require => Class['::redis'],
}
- $redis_vip = hiera('redis_vip')
- if $redis_vip and $redis_vip != $control_vip {
- pacemaker::resource::ip { 'vip-redis':
- ip_address => $redis_vip,
- }
- }
- pacemaker::constraint::base { 'redis-master-then-vip-redis':
- constraint_type => 'order',
- first_resource => 'redis-master',
- second_resource => "ip-${redis_vip}",
- first_action => 'promote',
- second_action => 'start',
- require => [Pacemaker::Resource::Ocf['redis'],
- Pacemaker::Resource::Ip['vip-redis']],
- }
- pacemaker::constraint::colocation { 'vip-redis-with-redis-master':
- source => "ip-${redis_vip}",
- target => 'redis-master',
- score => 'INFINITY',
- require => [Pacemaker::Resource::Ocf['redis'],
- Pacemaker::Resource::Ip['vip-redis']],
- }
}
@@ -444,16 +543,18 @@ if hiera('step') >= 3 {
$glance_backend = downcase(hiera('glance_backend', 'swift'))
case $glance_backend {
- swift: { $glance_store = 'glance.store.swift.Store' }
- file: { $glance_store = 'glance.store.filesystem.Store' }
- rbd: { $glance_store = 'glance.store.rbd.Store' }
+ swift: { $backend_store = 'glance.store.swift.Store' }
+ file: { $backend_store = 'glance.store.filesystem.Store' }
+ rbd: { $backend_store = 'glance.store.rbd.Store' }
default: { fail('Unrecognized glance_backend parameter.') }
}
+ $http_store = ['glance.store.http.Store']
+ $glance_store = concat($http_store, $backend_store)
# TODO: notifications, scrubber, etc.
include ::glance
class { 'glance::api':
- known_stores => [$glance_store],
+ known_stores => $glance_store,
manage_service => false,
enabled => false,
}
@@ -1233,15 +1334,6 @@ if hiera('step') >= 4 {
Pacemaker::Resource::Service[$::mongodb::params::service_name]],
}
}
- pacemaker::constraint::base { 'vip-redis-then-ceilometer-central':
- constraint_type => 'order',
- first_resource => "ip-${redis_vip}",
- second_resource => "${::ceilometer::params::agent_central_service_name}-clone",
- first_action => 'start',
- second_action => 'start',
- require => [Pacemaker::Resource::Service[$::ceilometer::params::agent_central_service_name],
- Pacemaker::Resource::Ip['vip-redis']],
- }
# Heat
pacemaker::resource::service { $::heat::params::api_service_name :