Last active
August 29, 2015 14:10
-
-
Save jedipunkz/00e10d65f1638d27ced9 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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]) | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
$ 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