Improves support for ceph-mds

This change adds a profile for the MDS service and extends the
existing MDS class to enable the service on boot and set the
daemon binding address.

Change-Id: I558b43deaa9b243c54f3d7ae945f11dd4925eb5d
Related-Bug: #1644784
This commit is contained in:
Giulio Fidente 2016-11-25 10:50:09 +01:00
parent e21a6310a2
commit 5cc19541b8
8 changed files with 215 additions and 19 deletions

View File

@ -20,26 +20,95 @@
#
# === Parameters:
#
# [*public_addr*] The bind IP address.
# Optional. The IPv(4|6) address on which MDS binds itself.
#
# [*pkg_mds*] Package name for the MDS service.
# Optional. Defaults to the value of ceph::params::pkg_mds
#
# [*pkg_mds_ensure*] Ensure status for the pkg_mds package resources
# Optional. Defaults to present.
#
# [*mds_activate*] Switch to activate the '[mds]' section in the config.
# Optional. Defaults to 'true'.
# Optional. Defaults to true.
#
# [*mds_data*] The path to the MDS data.
# Optional. Default provided by Ceph is '/var/lib/ceph/mds/$cluster-$id'.
# Optional. Same default as ceph.
#
# [*mds_enable*] Whether to enable ceph-mds instance on boot.
# Optional. Default is true.
#
# [*mds_ensure*] Whether to start the MDS service.
# Optional. Default is running.
#
# [*mds_id*] The ID of the MDS instance.
# Optional. Default is $::hostname
#
# [*keyring*] The location of the keyring used by MDSs
# Optional. Defaults to /var/lib/ceph/mds/$cluster-$id/keyring.
# Optional. Same default as ceph.
#
# [*cluster*] The ceph cluster
# Optional. Default to 'ceph'.
#
class ceph::mds (
$mds_activate = true,
$mds_data = '/var/lib/ceph/mds/$cluster-$id',
$keyring = '/var/lib/ceph/mds/$cluster-$id/keyring',
) {
$public_addr = undef,
$pkg_mds = $::ceph::params::pkg_mds,
$pkg_mds_ensure = present,
$mds_activate = true,
$mds_data = undef,
$mds_enable = true,
$mds_ensure = 'running',
$mds_id = $::hostname,
$keyring = undef,
$cluster = 'ceph',
) inherits ceph::params {
if $mds_data {
$mds_data_real = $mds_data
} else {
$mds_data_real = "/var/lib/ceph/mds/${cluster}-${mds_id}"
}
if $keyring {
$keyring_real = $keyring
} else {
$keyring_real = "${mds_data_real}/keyring"
}
Ceph_config<||> ~> Service<| tag == 'ceph-mds' |>
Package<| tag == 'ceph' |>
-> File[$mds_data_real]
-> Service<| tag == 'ceph-mds' |>
$mds_service_name = "ceph-mds@${mds_id}"
service { $mds_service_name:
ensure => $mds_ensure,
enable => $mds_enable,
tag => ['ceph-mds']
}
package { $pkg_mds:
ensure => $pkg_mds_ensure,
tag => 'ceph',
}
file { $mds_data_real:
ensure => directory,
owner => 'ceph',
group => 'ceph',
mode => '0750',
selinux_ignore_defaults => true,
}
# [mds]
if $mds_activate {
ceph_config {
'mds/mds_data': value => $mds_data;
'mds/keyring': value => $keyring;
'mds/mds_data': value => $mds_data_real;
'mds/keyring': value => $keyring_real;
}
if $public_addr {
ceph_config {
"mds.${mds_id}/public_addr": value => $public_addr;
}
}
} else {
ceph_config {

View File

@ -47,6 +47,7 @@ class ceph::params (
$enable_sig = false,
$release = 'jewel',
) {
$pkg_mds = 'ceph-mds'
case $::osfamily {
'Debian': {

41
manifests/profile/mds.pp Normal file
View File

@ -0,0 +1,41 @@
#
# Copyright (C) 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.
#
# Author: Giulio Fidente <gfidente@redhat.com>
#
# == Class: ceph::profile::mds
#
# Profile for a Ceph mds
#
class ceph::profile::mds {
require ::ceph::profile::base
class { '::ceph::mds':
public_addr => $ceph::profile::params::public_addr,
}
if !empty($ceph::profile::params::mds_key) {
ceph::key { "mds.${::hostname}":
cap_mon => 'allow profile mds',
cap_osd => 'allow rwx',
cap_mds => 'allow',
inject => true,
keyring_path => "/var/lib/ceph/mds/ceph-${::hostname}/keyring",
secret => $ceph::profile::params::mds_key,
user => 'ceph',
group => 'ceph'
}
}
}

View File

@ -91,6 +91,9 @@
# This is useful when not specifying public_network or when there is more than one IP address on
# the same network and you want to be specific about the IP to bind the MON on.
#
# [*mds_key*] The mds secret key.
# Optional but required when using cephx.
#
# [*mon_key*] The mon secret key.
# Optional. Either mon_key or mon_keyring need to be set when using cephx.
#
@ -189,6 +192,7 @@ class ceph::profile::params (
$cluster_network = undef,
$public_network = undef,
$public_addr = undef,
$mds_key = undef,
$mon_key = undef,
$mon_keyring = undef,
$client_keys = {},

View File

@ -0,0 +1,19 @@
---
prelude: >
Improves support for the MDS service and adds a profile class for it.
features:
- |
The MDS class is extended to allow for binding address and instance ID
configuration. It now also ensures that the needed packages for the MDS
daemon are installed and that the service is manageable by Puppet.
- |
A new MDS profile class is added which, in addition to deploying the MDS
service will create a new keyring for it, allowing MDS profilation and
access to the OSD pools.
other:
- |
The package installed by default for the MDS service can be configured
via ceph::params::pkg_mds
- |
The keyring for the MDS service is only created if a key is given, the
key to use can be configured via ceph::profile::params::mds_key

View File

@ -21,22 +21,35 @@ describe 'ceph::mds' do
shared_examples_for 'ceph mds' do
describe "activated with default params" do
it { is_expected.to contain_ceph_config('mds/mds_data').with_value('/var/lib/ceph/mds/$cluster-$id') }
it { is_expected.to contain_ceph_config('mds/keyring').with_value('/var/lib/ceph/mds/$cluster-$id/keyring') }
it { is_expected.to contain_ceph_config('mds/mds_data').with_value('/var/lib/ceph/mds/ceph-myhostname') }
it { is_expected.to contain_ceph_config('mds/keyring').with_value('/var/lib/ceph/mds/ceph-myhostname/keyring') }
it { is_expected.to contain_package('ceph-mds').with('ensure' => 'present') }
end
describe "activated with custom params" do
let :params do
{
:mds_data => '/usr/local/ceph/var/lib/mds/_cluster-_id',
:keyring => '/usr/local/ceph/var/lib/mds/_cluster-_id/keyring'
:public_addr => '1.2.3.4',
:mds_id => 'mymds',
:mds_data => '/usr/local/ceph/var/lib/mds/_cluster-_id',
:keyring => '/usr/local/ceph/var/lib/mds/_cluster-_id/keyring'
}
end
it { is_expected.to contain_ceph_config('mds/mds_data').with_value('/usr/local/ceph/var/lib/mds/_cluster-_id') }
it { is_expected.to contain_ceph_config('mds/keyring').with_value('/usr/local/ceph/var/lib/mds/_cluster-_id/keyring') }
it { is_expected.to contain_package('ceph-mds').with('ensure' => 'present') }
it {
is_expected.to contain_service('ceph-mds@mymds').with('ensure' => 'running')
}
it { is_expected.to contain_ceph_config('mds.mymds/public_addr').with_value('1.2.3.4') }
it { is_expected.to contain_file('/usr/local/ceph/var/lib/mds/_cluster-_id').with( {
'ensure' => 'directory',
'owner' => 'ceph',
'group' => 'ceph',
'mode' => '0750',
'selinux_ignore_defaults' => true,
} ) }
end
describe "not activated" do
@ -46,8 +59,6 @@ describe 'ceph::mds' do
}
end
it { is_expected.to_not contain_ceph_config('mds/mds_data').with_value('/var/lib/ceph/mds/_cluster-_id') }
it { is_expected.to_not contain_ceph_config('mds/keyring').with_value('/var/lib/ceph/mds/_cluster-_id/keyring') }
it { is_expected.to contain_ceph_config('mds/mds_data').with_ensure('absent') }
it { is_expected.to contain_ceph_config('mds/keyring').with_ensure('absent') }
@ -59,7 +70,7 @@ describe 'ceph::mds' do
}).each do |os,facts|
context "on #{os}" do
let (:facts) do
facts.merge!(OSDefaults.get_facts())
facts.merge!(OSDefaults.get_facts({:hostname => 'myhostname'}))
end
it_behaves_like 'ceph mds'

View File

@ -0,0 +1,50 @@
#
# Copyright (C) 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.
#
# Author: Giulio Fidente <gfidente@redhat.com>
#
require 'spec_helper'
describe 'ceph::profile::mds' do
shared_examples_for 'ceph profile mds' do
it { is_expected.to contain_class('ceph::mds').with(
'public_addr' => '10.11.12.2',
)}
it { is_expected.to contain_ceph__key('mds.myhostname').with(
:cap_mon => 'allow profile mds',
:cap_osd => 'allow rwx',
:cap_mds => 'allow',
:inject => true,
:keyring_path => "/var/lib/ceph/mds/ceph-myhostname/keyring",
:secret => 'AQDLOh1VgEp6FRAAFzT7Zw+Y9V6JJExQAsRnRQ==',
:user => 'ceph',
:group => 'ceph'
)}
end
on_supported_os({
:supported_os => OSDefaults.get_supported_os
}).each do |os,facts|
context "on #{os}" do
let (:facts) do
facts.merge!(OSDefaults.get_facts({:hostname => 'myhostname'}))
end
it_behaves_like 'ceph profile mds'
end
end
end

View File

@ -25,6 +25,7 @@ ceph::profile::params::osd_max_scrubs: '1'
ceph::profile::params::osd_op_threads: '2'
######## Keys
ceph::profile::params::mds_key: 'AQDLOh1VgEp6FRAAFzT7Zw+Y9V6JJExQAsRnRQ=='
ceph::profile::params::mon_key: 'AQATGHJTUCBqIBAA7M2yafV1xctn1pgr3GcKPg=='
ceph::profile::params::client_keys:
'client.admin':