recipes/mon.rb (114 lines of code) (raw):
#
# Author: Hans Chris Jones <chris.jones@lambdastack.io>
# Cookbook: ceph
# Recipe: mon
#
# Copyright 2017, Bloomberg Finance L.P.
#
# 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.
#
# This recipe creates a monitor cluster
#
# You should never change the mon default path or
# the keyring path.
# Don't change the cluster name either
# Default path for mon data: /var/lib/ceph/mon/$cluster-$id/
# which will be /var/lib/ceph/mon/ceph-`hostname`/
# This path is used by upstart. If changed, upstart won't
# start the monitor
# The keyring files are created using the following pattern:
# /etc/ceph/$cluster.client.$name.keyring
# e.g. /etc/ceph/ceph.client.admin.keyring
# The bootstrap-osd and bootstrap-mds keyring are a bit
# different and are created in
# /var/lib/ceph/bootstrap-{osd,mds}/ceph.keyring
# IMPORTANT: The NTP or CHRONY recipe is not part of the lower level ceph cookbook but you must use an NTP
# server to keep your cluster in time sync. If time drift occurs then ceph will not work properly. This is
# true for any distributed system.
include_recipe 'chef-sugar::default'
node.default['ceph']['is_mon'] = true
include_recipe 'ceph-chef'
include_recipe 'ceph-chef::mon_install'
service_type = node['ceph']['mon']['init_style']
# If not using rbd then this is not required but it's included anyway
if node['ceph']['version'] == 'hammer'
directory '/var/lib/qemu' do
owner 'root'
group 'root'
mode '0755'
recursive true
action :create
end
directory '/var/run/ceph' do
mode node['ceph']['mode']
recursive true
action :create
not_if 'test -d /var/run/ceph'
end
directory "/var/lib/ceph/mon/#{node['ceph']['cluster']}-#{node['hostname']}" do
owner node['ceph']['owner']
group node['ceph']['group']
mode node['ceph']['mode']
recursive true
action :create
not_if "test -d /var/lib/ceph/mon/#{node['ceph']['cluster']}-#{node['hostname']}"
end
directory '/var/lib/ceph/bootstrap-osd' do
owner node['ceph']['owner']
group node['ceph']['group']
mode node['ceph']['mode']
recursive true
action :create
not_if 'test -d /var/lib/ceph/bootstrap-osd'
end
directory '/var/lib/ceph/bootstrap-rgw' do
owner node['ceph']['owner']
group node['ceph']['group']
mode node['ceph']['mode']
recursive true
action :create
not_if 'test -d /var/lib/ceph/bootstrap-rgw'
end
directory '/var/lib/ceph/bootstrap-mds' do
owner node['ceph']['owner']
group node['ceph']['group']
mode node['ceph']['mode']
recursive true
action :create
not_if 'test -d /var/lib/ceph/bootstrap-mds'
end
end
# Create in a scratch area
keyring = "#{node['ceph']['mon']['keyring_path']}/#{node['ceph']['cluster']}.mon.keyring"
# This will execute on other nodes besides the first mon node.
execute 'format ceph-mon-secret as keyring' do
command lazy { "ceph-authtool --create-keyring #{keyring} --name=mon. --add-key=#{node['ceph']['monitor-secret']} --cap mon 'allow *'" }
creates keyring
user node['ceph']['owner']
group node['ceph']['group']
only_if { ceph_chef_mon_secret }
not_if "test -s #{keyring}"
sensitive true if Chef::Resource::Execute.method_defined? :sensitive
end
# This should only run once to generate the mon key and then the command above should be executed on other nodes
execute 'generate ceph-mon-secret as keyring' do
command lazy { "ceph-authtool --create-keyring #{keyring} --name=mon. --gen-key --cap mon 'allow *'" }
creates keyring
user node['ceph']['owner']
group node['ceph']['group']
not_if { ceph_chef_mon_secret }
not_if "test -s #{keyring}"
notifies :create, 'ruby_block[save ceph_chef_mon_secret]', :immediately
sensitive true if Chef::Resource::Execute.method_defined? :sensitive
end
# Part of monitor-secret calls above - Also, you can set node['ceph']['monitor-secret'] = ceph_chef_keygen()
# in a higher level recipe like the way ceph-chef does it in ceph-mon.rb
ruby_block 'save ceph_chef_mon_secret' do
block do
fetch = Mixlib::ShellOut.new("ceph-authtool #{keyring} --print-key --name=mon.")
fetch.run_command
key = fetch.stdout
node.normal['ceph']['monitor-secret'] = key.delete!("\n")
# node.set['ceph']['monitor-secret'] = key.delete!("\n")
# node.save
end
action :nothing
end
# For now, make all mon nodes admin nodes
include_recipe 'ceph-chef::admin_client'
# Add admin key to monitor key and put a copy in the /var/lib/ceph/mon/... area
# Admin key is required on any host that may perform 'ceph' related calls such as 'ceph -s'
# In this case, all monitors have admin keys
# grep -Fxq 'admin'
execute 'make sure monitor key is in mon data' do
command lazy { "ceph-authtool #{keyring} --import-keyring /etc/ceph/#{node['ceph']['cluster']}.client.admin.keyring" }
user node['ceph']['owner']
group node['ceph']['group']
not_if "grep 'admin' #{keyring}"
end
execute 'ceph-mon mkfs' do
command lazy { "ceph-mon --mkfs -i #{node['hostname']} --fsid #{node['ceph']['fsid-secret']} --keyring #{keyring}" }
creates "/var/lib/ceph/mon/#{node['ceph']['cluster']}-#{node['hostname']}/keyring"
user node['ceph']['owner']
group node['ceph']['group']
not_if "test -s /var/lib/ceph/mon/#{node['ceph']['cluster']}-#{node['hostname']}/keyring"
end
ruby_block 'mon-finalize' do
block do
['done', service_type].each do |ack|
::File.open("/var/lib/ceph/mon/#{node['ceph']['cluster']}-#{node['hostname']}/#{ack}", 'w').close
end
end
not_if "test -f /var/lib/ceph/mon/#{node['ceph']['cluster']}-#{node['hostname']}/done"
end
if node['ceph']['version'] != 'hammer'
# Include our overridden systemd file to handle starting the service during bootstrap
cookbook_file '/etc/systemd/system/ceph-mon@.service' do
notifies :run, 'execute[ceph-systemctl-daemon-reload]', :immediately
action :create
only_if { rhel? && systemd? }
end
execute 'chown mon dir' do
command "chown -R #{node['ceph']['owner']}:#{node['ceph']['group']} /var/lib/ceph/mon/#{node['ceph']['cluster']}-#{node['hostname']}"
only_if { rhel? && systemd? }
end
end