Create a gist now

Instantly share code, notes, and snippets.

A Chef recipe for creating EBS volumes. See: http://clarkdave.net/2013/04/managing-ebs-volumes-with-chef/
# The database recipe should be included by any server running a DB. It creates
# a /data directory and, if on EC2, will mount an EBS volume here
directory '/data' do
mode '0755'
end
if node[:app][:ec2] || node[:cloud][:provider] == 'ec2'
aws = data_bag_item('aws', 'main')
include_recipe 'aws'
if node[:app][:ebs][:raid]
aws_ebs_raid 'data_volume_raid' do
mount_point '/data'
disk_count 2
disk_size node[:app][:ebs][:size]
level 10
filesystem 'ext4'
action :auto_attach
end
else
# get a device id to use
devices = Dir.glob('/dev/xvd?')
devices = ['/dev/xvdf'] if devices.empty?
devid = devices.sort.last[-1,1].succ
# save the device used for data_volume on this node -- this volume will now always
# be attached to this device
node.set_unless[:aws][:ebs_volume][:data_volume][:device] = "/dev/xvd#{devid}"
device_id = node[:aws][:ebs_volume][:data_volume][:device]
# no raid, so just mount and format a single volume
aws_ebs_volume 'data_volume' do
aws_access_key aws['aws_access_key_id']
aws_secret_access_key aws['aws_secret_access_key']
size node[:app][:ebs][:size]
device device_id.gsub('xvd', 'sd') # aws uses sdx instead of xvdx
action [:create, :attach]
end
# wait for the drive to attach, before making a filesystem
ruby_block "sleeping_data_volume" do
block do
timeout = 0
until File.blockdev?(device_id) || timeout == 1000
Chef::Log.debug("device #{device_id} not ready - sleeping 10s")
timeout += 10
sleep 10
end
end
end
# create a filesystem
execute 'mkfs' do
command "mkfs -t ext4 #{device_id}"
end
mount '/data' do
device device_id
fstype 'ext4'
options 'noatime,nobootwait'
action [:enable, :mount]
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment