Skip to content

Instantly share code, notes, and snippets.

@jedipunkz
Last active August 29, 2015 14:10
Show Gist options
  • Save jedipunkz/00e10d65f1638d27ced9 to your computer and use it in GitHub Desktop.
Save jedipunkz/00e10d65f1638d27ced9 to your computer and use it in GitHub Desktop.
#!/usr/bin/env ruby
require 'fog'
require 'yaml'
require 'erb'
class Server
attr_accessor :api
attr_accessor :name
attr_accessor :provider
attr_accessor :flavor_id
attr_accessor :image_id
attr_accessor :key_name
attr_accessor :availability_zone
attr_accessor :nics
attr_accessor :subnet_id
attr_accessor :security_group_ids
def self.create_from_file(file)
server_options = YAML.load_file(file)
if server_options.class != Array then
server_options = [server_options]
end
servers = []
server_options.each do |server_option|
server = Server.new(server_option)
server.create
servers.push server
end
return servers
end
def self.bootstrap_from_file(file)
prefix = ENV['PREFIX'] || ""
server_options = YAML.load_file(file)
if server_options.class != Array then
server_options = [server_options]
end
servers = []
rest_host = ''
db_host = ''
server_options.each do |server_option|
server = Server.new(server_option)
if server_option["provider"] == 'openstack' then
ip_dmz = server.search_ip(server_option["provider"], server_option["name"], 'dmz-net')
if server_option["role"] == 'rest' then
ip_app = server.search_ip(server_option["provider"], server_option["name"], 'app-net')
rest_host = ip_app
elsif server_option["role"] == 'db' then
ip_dbs = server.search_ip(server_option["provider"], server_option["name"], 'dbs-net')
db_host = ip_dbs
end
file = open("#{prefix}/openstack-bootstrap.sh", "a")
file.puts("knife zero bootstrap " + ip_dmz + " -N #{server_option['name']}" + " -r 'role[#{server_option['role']}]'" + " -x root" + " -i #{server_option['key_file']}" + " -E openstack")
file.close
elsif server_option["provider"] == 'AWS' then
ip = server.search_ip(server_option["provider"], server_option["name"], nil)
file = open("#{prefix}/aws-bootstrap.sh", "a")
file.puts("knife zero bootstrap " + ip + " -r 'role[#{server_option['role']}]'" + " -x ec2-user" + " -i #{server_option['key_file']}" + " --sudo" + " -E aws")
file.close
end
end
template_attribute = ERB.new(File.read("./default.erb"))
content_attribute = template_attribute.result(binding)
File.open("#{prefix}/cookbooks/openstack-sample/attributes/default.rb", "w") do |att|
att.puts content_attribute
end
template_role = ERB.new(File.read("./db.erb"))
content_role = template_role.result(binding)
File.open("#{prefix}/roles/db.rb", "w") do |role|
role.puts content_role
end
return servers
end
def initialize(server_option = {})
@provider = server_option["provider"]
@name = server_option["name"]
@flavor_id = server_option["flavor_id"]
@image_id = server_option["image_id"]
@key_name = server_option["key_name"]
@key_file = server_option["key_file"]
@availability_zone = server_option["availability_zone"]
@nics = set_nics(server_option["networks"])
@subnet_id = server_option["subnet_id"]
@security_group_ids = server_option["security_group_ids"]
@role = server_option["role"]
@api = get_api()
end
def create()
if @provider == "openstack" then
@api.servers.create(
:name => @name,
:flavor_ref => @flavor_id,
:image_ref => @image_id,
:key_name => @key_name,
:availability_zone => @availability_zone,
:nics => @nics,
:security_groups => @security_group_ids,
)
elsif @provider == "AWS" then
@api.servers.create(
:tags => {'Name' => @name},
:flavor_id => @flavor_id,
:image_id => @image_id,
:key_name => @key_name,
:groups => @security_group_ids,
)
end
end
def set_nics(networks = [])
if @provider == "openstack" then
network_api = get_network_api
@nics = []
networks.each do |network|
@nics.push({"net_id" => network_api.networks.all(:name => network).first.id})
end
end
return @nics
end
def search_ip(provider, server_name, network)
if provider == "openstack" then
server = Fog::Compute.new({
:provider => provider,
:openstack_auth_url => ENV['OS_AUTH_URL'] || "",
:openstack_username => ENV['OS_USERNAME'] || "",
:openstack_tenant => ENV['OS_TENANT_NAME'] || "",
:openstack_api_key => ENV['OS_API_KEY'] || "",
:openstack_region => ENV['OS_REGION_NAME'] || ""
})
instance = server.servers.find { |i| i.name == server_name }
return instance.addresses[network][0]['addr']
elsif provider == "AWS" then
server = Fog::Compute.new({
:provider => provider,
:aws_access_key_id => ENV["AWS_ACCESS_KEY_ID"] || "",
:aws_secret_access_key => ENV["AWS_SECRET_ACCESS_KEY"] || "",
:region => ENV["AWS_REGION"] || ""
})
instance = server.servers.find { |i| i.tags['Name'] == server_name }
return instance.dns_name
end
end
private
def get_api()
if @provider == "openstack" then
Fog::Compute.new({
:provider => @provider,
:openstack_auth_url => ENV['OS_AUTH_URL'] || "",
:openstack_username => ENV['OS_USERNAME'] || "",
:openstack_tenant => ENV['OS_TENANT_NAME'] || "",
:openstack_api_key => ENV['OS_API_KEY'] || "",
:openstack_region => ENV['OS_REGION_NAME'] || ""
})
elsif @provider == "AWS" then
Fog::Compute.new({
:provider => @provider,
:aws_access_key_id => ENV["AWS_ACCESS_KEY_ID"] || "",
:aws_secret_access_key => ENV["AWS_SECRET_ACCESS_KEY"] || "",
:region => ENV["AWS_REGION"] || ""
})
end
end
def get_network_api()
Fog::Network.new({
:provider => @provider,
:openstack_auth_url => ENV['OS_AUTH_URL'] || "",
:openstack_username => ENV['OS_USERNAME'] || "",
:openstack_tenant => ENV['OS_TENANT_NAME'] || "",
:openstack_api_key => ENV['OS_API_KEY'] || "",
:openstack_region => ENV['OS_REGION_NAME'] || "",
})
end
end
Server.create_from_file(ARGV[0])
Server.bootstrap_from_file(ARGV[0])
$ ruby fog-bootstrap.rb openstack.yaml
$ cat openstack-bootstrap.sh
knife zero bootstrap 192.168.0.240 -N instance-dbs -r 'role[db]' -x root -i /home/chef/hpwork01_key -E openstack
knife zero bootstrap 192.168.0.241 -N instance-web-01 -r 'role[web]' -x root -i /home/chef/hpwork01_key -E openstack
knife zero bootstrap 192.168.0.242 -N instance-web-02 -r 'role[web]' -x root -i /home/chef/hpwork01_key -E openstack
knife zero bootstrap 192.168.0.243 -N instance-app -r 'role[rest]' -x root -i /home/chef/hpwork01_key -E openstack
knife zero bootstrap 192.168.0.244 -N instance-lb -r 'role[lb]' -x root -i /home/chef/hpwork01_key -E openstack
$ cd $HOME/chapter12/chef-repo-openstack-sample/
$ knife cookbook upload -a
$ knife role from file roles/*.rb
$ knife environment from file environments/*.json
$ bash openstack-bootstrap.sh
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment