147 lines
5.6 KiB
Ruby
147 lines
5.6 KiB
Ruby
#!/usr/bin/env ruby
|
|
|
|
# Copyright 2013 Mirantis, Inc.
|
|
#
|
|
# 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.
|
|
|
|
require 'json'
|
|
require 'yaml'
|
|
|
|
nodes = {
|
|
"compute-01" => '64:7D:B8:84:64:79',
|
|
"controller-01" => "64:43:7B:CA:56:DD",
|
|
}
|
|
|
|
|
|
public_iface = "eth0"
|
|
internal_iface = "eth1"
|
|
private_iface = "eth2"
|
|
default_gateway = "10.20.0.1"
|
|
master_ip = "10.20.0.2"
|
|
dns1 = default_gateway
|
|
internal_net = '10.20.1.0'
|
|
|
|
internal_net_prefix = internal_net.split('.')[0..2].join(".")
|
|
|
|
|
|
template = YAML.load(File.open('example_new.yaml'))
|
|
template_node = template['node_01']
|
|
newyaml = template
|
|
newyaml['nodes'] = []
|
|
newyaml.delete('node_01')
|
|
cluster = JSON.load(File.open("simple.json"))
|
|
nodes.each do |node,macaddr|
|
|
result = template_node.clone
|
|
json_node = cluster.select {|n| n['mac'].to_s == macaddr.to_s.upcase}[0]
|
|
mac = json_node['mac'].to_s
|
|
ip = json_node['ip'].to_s
|
|
l_octet = ip.split('.')[3]
|
|
id = json_node['id'].to_s
|
|
uid = id
|
|
if node == nodes.select{ |n,m| n.to_s =~ /controller/ }.map{|n,m| n}.first
|
|
role = 'primary-controller'
|
|
elsif node =~ /controller/
|
|
role = 'controller'
|
|
elsif node == nodes.select { |n,m| n.to_s =~ /swiftproxy/ }.map{|n,m| n}.first
|
|
role = 'primary-swift-proxy'
|
|
elsif node =~ /swiftproxy/
|
|
role = 'swift-proxy'
|
|
elsif node =~ /swift-\d+/
|
|
role = 'storage'
|
|
else
|
|
role = 'compute'
|
|
end
|
|
|
|
cobbler_dnsname = "#{node}.domain.tld"
|
|
cobbler_interfaces = {
|
|
public_iface => {"ip_address"=>ip, "netmask"=> "255.255.255.0", "dns_name"=>cobbler_dnsname, "static"=> "1", "mac_address" => mac}
|
|
}
|
|
cobbler_interfaces_extra = {
|
|
public_iface => {'onboot'=>'yes','peerdns'=>'no'},
|
|
internal_iface => {'onboot'=>'no','peerdns'=>'no'},
|
|
private_iface => {'onboot'=>'no','peerdns'=>'no'}
|
|
}
|
|
result['interfaces'] = cobbler_interfaces
|
|
result['interfaces_extra'] = cobbler_interfaces_extra
|
|
result['power_address'] = ip
|
|
result['mac'] = mac
|
|
result['default_gateway'] = default_gateway
|
|
result['name'] = node
|
|
result['id'] = id
|
|
result['uid'] = uid
|
|
result['ip'] = ip
|
|
result['name_servers'] = master_ip
|
|
result['role'] = role
|
|
result['fqdn'] = cobbler_dnsname
|
|
system_disk=json_node['meta']['disks'].select {|disk| disk['name'] == 'vda'}.first
|
|
cinder_disk=json_node['meta']['disks'].select {|disk| disk['name'] == 'vdb'}.first
|
|
|
|
system_disk_path = system_disk['disk']
|
|
system_disk_size = (system_disk['size']/1048756.0).floor
|
|
cinder_disk_path = cinder_disk['disk']
|
|
cinder_disk_size = (cinder_disk['size']/1048756.0).floor
|
|
|
|
system_pv_size = system_disk_size - 201
|
|
swap_size = 1024
|
|
free_vg_size = system_pv_size - swap_size
|
|
free_extents = (free_vg_size/32.0).floor
|
|
system_disk_size = 32 * free_extents
|
|
|
|
|
|
# ks_spaces: '"[{\"type\": \"disk\", \"id\": \"disk/by-path/pci-0000:00:06.0-virtio-pci-virtio3\",
|
|
# \"volumes\": [{\"mount\": \"/boot\", \"type\": \"partition\", \"size\": 200},
|
|
# {\"type\": \"mbr\"}, {\"size\": 20000, \"type\": \"pv\", \"vg\": \"os\"}],
|
|
# \"size\": 20480}, {\"type\": \"vg\", \"id\": \"os\", \"volumes\": [{\"mount\":
|
|
# \"/\", \"type\": \"lv\", \"name\": \"root\", \"size\": 10240 }, {\"mount\":
|
|
# \"swap\", \"type\": \"lv\", \"name\": \"swap\", \"size\": 2048}]}]"'
|
|
|
|
|
|
ks_spaces = '"[{\"type\": \"disk\", \"id\": \"' +
|
|
system_disk_path.to_s +
|
|
'\",\"volumes\": [{\"mount\": \"/boot\", \"type\": \"partition\", \"size\": 200}, {\"type\": \"mbr\"}, {\"size\": ' +
|
|
system_pv_size.to_s +
|
|
', \"type\": \"pv\", \"vg\": \"os\"}],\"size\": ' +
|
|
system_disk_size.to_s +
|
|
'},{\"type\": \"vg\", \"id\": \"os\", \"volumes\": [{\"mount\": \"/\", \"type\": \"lv\", \"name\": \"root\", \"size\": ' +
|
|
system_disk_size.to_s +
|
|
'}, {\"mount\": \"swap\", \"type\": \"lv\", \"name\": \"swap\", \"size\": '+
|
|
swap_size.to_s +
|
|
'}]}, {\"type\": \"disk\", \"id\": \"' + cinder_disk_path + '\", \"volumes\": [{\"type\": \"mbr\"}, {\"size\": ' +
|
|
cinder_disk_size.to_s +
|
|
', \"type\": \"pv\", \"vg\": \"cinder-volumes\"}], \"size\": ' +
|
|
cinder_disk_size.to_s + '}]"'
|
|
|
|
|
|
cobbler_ks_meta={"ks_spaces"=>ks_spaces,"mco_host"=>master_ip}
|
|
|
|
result['ks_meta'] = result['ks_meta'].update(cobbler_ks_meta)
|
|
puppet_network_data = [
|
|
{"name" => 'public', 'ip'=>ip, "dev" => public_iface, 'netmask' => "255.255.255.0", "gateway" => default_gateway },
|
|
{"name" => ['management','storage'], 'ip'=>"#{internal_net_prefix.to_s}.#{l_octet}", "dev" => internal_iface, 'netmask' => "255.255.255.0"},
|
|
{"name" => 'fixed', "dev" => private_iface},
|
|
]
|
|
result['network_data'] = puppet_network_data
|
|
# puts result.to_yaml
|
|
newyaml['nodes'].push(result)
|
|
end
|
|
|
|
newyaml['attributes']['master_ip'] = master_ip
|
|
newyaml['attributes']['dns_nameservers'] = master_ip
|
|
newyaml['attributes']['libvirt_type'] = 'kvm'
|
|
newyaml['attributes']['floating_network_range'] = '10.20.0.150/28'
|
|
newyaml['attributes']['fixed_network_range'] = '10.20.1.0/24'
|
|
newyaml['attributes']['base_syslog']['syslog_server'] = master_ip
|
|
|
|
puts newyaml.to_yaml
|
|
|