From 57c6e08276bbdb308dfae4f6ea6bc54e10261a19 Mon Sep 17 00:00:00 2001 From: Alexandre Marangone Date: Thu, 21 Mar 2013 10:58:38 -0700 Subject: [PATCH 1/3] Support EL, Fedora and (open)SuSE repo - Recipe is now ceph::repo - For EL, add EPEL repository for dependencies by default. Deactivable by using el_add_epel: false under ceph: {} in the chef environment. - Handle package names difference between EL/FC/SuSE and Debian. Signed-off-by: Alexandre Marangone --- attributes/{apt.rb => repo.rb} | 1 + recipes/apt.rb | 3 ++- recipes/default.rb | 36 ++++++++++++++++++-------- recipes/repo.rb | 8 ++++++ recipes/rpm.rb | 47 ++++++++++++++++++++++++++++++++++ 5 files changed, 84 insertions(+), 11 deletions(-) rename attributes/{apt.rb => repo.rb} (81%) create mode 100644 recipes/repo.rb create mode 100644 recipes/rpm.rb diff --git a/attributes/apt.rb b/attributes/repo.rb similarity index 81% rename from attributes/apt.rb rename to attributes/repo.rb index 3e8804e..c753e56 100644 --- a/attributes/apt.rb +++ b/attributes/repo.rb @@ -1,3 +1,4 @@ default['ceph']['branch'] = "stable" # Can be stable, testing or dev. # Major release version to install or gitbuilder branch default['ceph']['version'] = "bobtail" +default['ceph']['el_add_epel'] = true diff --git a/recipes/apt.rb b/recipes/apt.rb index f666cb1..0b3dabe 100644 --- a/recipes/apt.rb +++ b/recipes/apt.rb @@ -4,7 +4,7 @@ case node['ceph']['branch'] when "stable" apt_repository "ceph-stable" do repo_name "ceph" - uri "http://www.ceph.com/debian-#{node['ceph']['version']}/" + uri "http://ceph.com/debian-#{node['ceph']['version']}/" distribution node['lsb']['codename'] components ["main"] key "https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc" @@ -26,3 +26,4 @@ when "dev" key "https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/autobuild.asc" end end + diff --git a/recipes/default.rb b/recipes/default.rb index 327eec6..8cb9395 100644 --- a/recipes/default.rb +++ b/recipes/default.rb @@ -16,18 +16,34 @@ # 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. - -packages = %w{ - ceph - ceph-common -} -if node['ceph']['install_debug'] - packages_dbg = %w{ - ceph-dbg - ceph-common-dbg +packages = [] + +case node['platform_family'] +when "debian" + packages = %w{ + ceph + ceph-common } - packages += packages_dbg + + if node['ceph']['install_debug'] + packages_dbg = %w{ + ceph-dbg + ceph-common-dbg + } + packages += packages_dbg + end +when "rhel", "fedora" + packages = %w{ + ceph + } + + if node['ceph']['install_debug'] + packages_dbg = %w{ + ceph-debug + } + packages += packages_dbg + end end packages.each do |pkg| diff --git a/recipes/repo.rb b/recipes/repo.rb new file mode 100644 index 0000000..3f50c17 --- /dev/null +++ b/recipes/repo.rb @@ -0,0 +1,8 @@ +case node['platform_family'] +when "debian" + include_recipe "ceph::apt" +when "rhel", "suse" + include_recipe "ceph::rpm" +else + raise "not supported" +end diff --git a/recipes/rpm.rb b/recipes/rpm.rb new file mode 100644 index 0000000..7659271 --- /dev/null +++ b/recipes/rpm.rb @@ -0,0 +1,47 @@ +case node['platform_family'] +when "rhel" + version = %x[ cat /etc/redhat-release | awk '{print $3}' | awk -F. '{print $1}' ].chomp + release = "el" + version + if node['ceph']['el_add_epel'] == true + # We need to do this since the EPEL + # version might change + epel_package = %x[ curl -s http://dl.fedoraproject.org/pub/epel/fullfilelist | grep ^#{version}/#{node['kernel']['machine']}/epel-release ].chomp + system "rpm -U http://dl.fedoraproject.org/pub/epel/#{epel_package}" + end +when "fedora" + version = %x[ cat /etc/fedora-release | awk '{print $3}' ].chomp + release = "fc" + version +when "suse" + suse = %x[ head -n1 /etc/SuSE-release| awk '{print $1}' ].chomp.downcase #can be suse or opensuse + version = %x[ grep VERSION /etc/SuSE-release | awk -F'= ' '{print $2}' ].chomp + release = suse + version +end + +end_path = "/#{release}/x86_64/ceph-release-1-0.#{release}.noarch.rpm" +case node['ceph']['branch'] +when "stable" + path = "http://ceph.com/rpm-#{node['ceph']['version']}" + end_path + system "rpm -U #{path}" +when "testing" + path = "http://ceph.com/rpm-testing" + end_path + system "rpm -U #{path}" +when "dev" + if node['platform'] == "centos" + baseurl="http://gitbuilder.ceph.com/ceph-rpm-centos#{version}-x86_64-basic/ref/#{node['ceph']['version']}/x86_64/" + elsif node['platform'] == "fedora" + baseurl="http://gitbuilder.ceph.com/ceph-rpm-#{release}-x86_64-basic/ref/#{node['ceph']['version']}/RPMS/x86_64/" + else + raise "repository not available for your distribution" + end + # Instead of using the yum cookbook, + # we do it this way. It avoids a dependency + system "curl -s 'https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/autobuild.asc' > /etc/pki/rpm-gpg/RPM-GPG-KEY-CEPH" + system "cat > /etc/yum.repos.d/ceph.repo << EOF\n" \ + "[ceph]\n" \ + "name=Ceph\n" \ + "baseurl=#{baseurl}\n" \ + "enabled=1\n" \ + "gpgcheck=1\n" \ + "gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CEPH\n" \ + "EOF\n" +end From d1e074afd06c8062328a3798a4933a6fa0a2289d Mon Sep 17 00:00:00 2001 From: Alexandre Marangone Date: Thu, 21 Mar 2013 11:02:32 -0700 Subject: [PATCH 2/3] Upstart and SYSV Init support - Handles different service names between upstart and sysvinit. - Create mon_dir/(upstart|sysvinit) depending on service to be used. Signed-off-by: Alexandre Marangone --- libraries/default.rb | 9 +++++++++ recipes/mon.rb | 22 ++++++++++++++++------ recipes/osd.rb | 17 ++++++++++++----- 3 files changed, 37 insertions(+), 11 deletions(-) diff --git a/libraries/default.rb b/libraries/default.rb index 687e3d7..308d883 100644 --- a/libraries/default.rb +++ b/libraries/default.rb @@ -118,3 +118,12 @@ def have_quorum?() state = JSON.parse(mon_status)['state'] return QUORUM_STATES.include?(state) end + +def service_type() + case node['platform'] + when 'ubuntu' + return "upstart" + else + return "sysvinit" + end +end diff --git a/recipes/mon.rb b/recipes/mon.rb index 4b96429..f523d0e 100644 --- a/recipes/mon.rb +++ b/recipes/mon.rb @@ -19,11 +19,21 @@ require 'json' include_recipe "ceph::default" include_recipe "ceph::conf" -service "ceph-mon-all-starter" do - provider Chef::Provider::Service::Upstart - action [:enable] +service_type = service_type() +service "ceph_mon" do + case service_type + when "upstart" + service_name "ceph-mon-all-starter" + provider Chef::Provider::Service::Upstart + action :enable + when "sysvinit" + service_name "ceph" + provider Chef::Provider::Service::Init + end + supports :restart => true end + # TODO cluster name cluster = 'ceph' @@ -43,11 +53,11 @@ ceph-authtool "$KR" --create-keyring --name=mon. --add-key='#{node["ceph"]["moni ceph-mon --mkfs -i #{node['hostname']} --keyring "$KR" rm -f -- "$KR" touch /var/lib/ceph/mon/ceph-#{node['hostname']}/done -touch /var/lib/ceph/mon/ceph-#{node['hostname']}/upstart +touch /var/lib/ceph/mon/ceph-#{node['hostname']}/#{service_type} EOH creates '/var/lib/ceph/mon/ceph-#{node["hostname"]}/done' - creates '/var/lib/ceph/mon/ceph-#{node["hostname"]}/upstart' - notifies :start, "service[ceph-mon-all-starter]", :immediately + creates "/var/lib/ceph/mon/ceph-#{node["hostname"]}/#{service_type}" + notifies :start, "service[ceph_mon]", :immediately end ruby_block "tell ceph-mon about its peers" do diff --git a/recipes/osd.rb b/recipes/osd.rb index c79a229..ce26224 100644 --- a/recipes/osd.rb +++ b/recipes/osd.rb @@ -44,11 +44,18 @@ if !search(:node,"hostname:#{node['hostname']} AND dmcrypt:true").empty? end end -service "ceph-osd-all" do - provider Chef::Provider::Service::Upstart - service_name "ceph-osd-all" +service_type = service_type() +service "ceph_osd" do + case service_type + when "sysvinit" + service_name "ceph" + provider Chef::Provider::Service::Init + when "upstart" + service_name "ceph-osd-all" + provider Chef::Provider::Service::Upstart + action :enable + end supports :restart => true - action :enable end mons = get_mon_nodes("ceph_bootstrap_osd_key:*") @@ -130,7 +137,7 @@ else execute "Creating Ceph OSD on #{osd_device['device']}" do command "ceph-disk-prepare #{dmcrypt} #{osd_device['device']}" action :run - notifies :start, "service[ceph-osd-all]", :immediately + notifies :start, "service[ceph_osd]", :immediately end # we add this status to the node env # so that we can implement recreate From 904fb27f0d35e9a87d25d3a643e7fb273fae4401 Mon Sep 17 00:00:00 2001 From: Alexandre Marangone Date: Mon, 25 Mar 2013 12:42:19 -0700 Subject: [PATCH 3/3] Create mon data dir before calling ceph-mon --mkfs Signed-off-by: Alexandre Marangone --- recipes/mon.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/recipes/mon.rb b/recipes/mon.rb index f523d0e..5cd76de 100644 --- a/recipes/mon.rb +++ b/recipes/mon.rb @@ -41,6 +41,7 @@ execute 'ceph-mon mkfs' do command <<-EOH set -e mkdir -p /var/run/ceph +mkdir -p /var/lib/ceph/mon/ceph-#{node['hostname']} # TODO chef creates doesn't seem to suppressing re-runs, do it manually if [ -e '/var/lib/ceph/mon/ceph-#{node["hostname"]}/done' ]; then echo 'ceph-mon mkfs already done, skipping'