class Skirnir::Site
Attributes
chef[R]
config[R]
info[R]
nodes[R]
silent[RW]
vagrant[R]
Public Class Methods
new()
click to toggle source
# File lib/skirnir/site.rb, line 11 def initialize @silent = false end
Public Instance Methods
all_environments(filename = DEFAULT_FILENAME)
click to toggle source
# File lib/skirnir/site.rb, line 96 def all_environments(filename = DEFAULT_FILENAME) all = get_config all.keys.select {|x| x != 'common'} end
chef_data_for_all_nodes()
click to toggle source
# File lib/skirnir/site.rb, line 75 def chef_data_for_all_nodes result = {} @nodes.each do |node| name = node.name name += @info['node_suffix'] unless @info['node_suffix'].empty? attribs = chef_hash_for_node(node) run_list = node.run_list result[name] = { 'attributes' => attribs, 'run_list' => run_list} end result end
chef_hash_for_node(node)
click to toggle source
@param node [Node]
# File lib/skirnir/site.rb, line 64 def chef_hash_for_node(node) result = chef.get_for_roles(node.roles) result.deep_merge!(node.chef_hash) nodes_info = @nodes.map {|n| n.to_h} nodes_hash = Hash.construct(%w(site nodes), nodes_info) result.deep_merge!(nodes_hash) result end
chef_hash_for_node_name(name)
click to toggle source
# File lib/skirnir/site.rb, line 55 def chef_hash_for_node_name(name) node = (@nodes.select {|node| node.name == name}).first raise "Unknown node name ''#{name}''" if node.nil? chef_hash_for_node(node) end
nodes_with_role(role)
click to toggle source
@return [Array<Node>]
# File lib/skirnir/site.rb, line 51 def nodes_with_role(role) @nodes.select {|node| node.has_role? role} end
read(env, filename = DEFAULT_FILENAME)
click to toggle source
# File lib/skirnir/site.rb, line 27 def read(env, filename = DEFAULT_FILENAME) all = get_config filename puts "- Section: #{env}\n\n" unless @silent config = all['common'].deep_merge!(all[env]) if File.exists?(LOCAL_FILENAME) local = YAML.load(IO.read(LOCAL_FILENAME)) config.deep_merge!(local) end @config = config @info = config['info'] @vagrant = config['vagrant'] @chef = Skirnir::Chef.new(config['chef']) @nodes = config['nodes'].map {|node| Skirnir::Node.new(site_name, node)} setup_role_chefs @nodes end
read_default()
click to toggle source
# File lib/skirnir/site.rb, line 15 def read_default env=get_env_from_local_section('vagrant') read(env, 'config.yml') end
read_for_update()
click to toggle source
# File lib/skirnir/site.rb, line 21 def read_for_update env = get_env_from_local_section('update') read(env, 'config.yml') end
site_name()
click to toggle source
# File lib/skirnir/site.rb, line 92 def site_name @info['site_name'] end
Private Instance Methods
get_config(filename = DEFAULT_FILENAME)
click to toggle source
# File lib/skirnir/site.rb, line 103 def get_config(filename = DEFAULT_FILENAME) puts "Reading config from #{filename}\n" unless @silent YAML.load(IO.read(filename)) end
get_env_from_local_section(section_name)
click to toggle source
# File lib/skirnir/site.rb, line 108 def get_env_from_local_section(section_name) raise "Can't determine default environment; #{LOCAL_FILENAME} missing" unless File.exists?(LOCAL_FILENAME) local = YAML.load(IO.read(LOCAL_FILENAME)) unless local.has_key?(section_name) && local[section_name].has_key?('env') raise "Can't determine default environment; YAML #{section_name}/env entry missing" end local[section_name]['env'] end
setup_chef_app_should_migrate()
click to toggle source
# File lib/skirnir/site.rb, line 148 def setup_chef_app_should_migrate should_migrate = true nodes_with_role('app').each do |node| node.chef.set('all', %w(site app should_migrate), should_migrate) should_migrate = false end end
setup_chef_db_host()
click to toggle source
# File lib/skirnir/site.rb, line 126 def setup_chef_db_host db_nodes = nodes_with_role('db') raise "Expected single node with role 'db'; found #{db_nodes.count}" if db_nodes.count != 1 db_ip = db_nodes[0].ip_int app_nodes = nodes_with_role('app') is_local = app_nodes.all? {|node| node.ip_int == db_ip} @chef.set('all', %w(site db host), is_local ? 'localhost' : db_ip) @chef.set('all', %w(site db is_local), is_local) @chef.set('db', %w(site db bind_address), is_local ? '127.0.0.1' : db_ip) end
setup_chef_nginx()
click to toggle source
# File lib/skirnir/site.rb, line 141 def setup_chef_nginx # TODO this is no good for staging, need is_local for web too web_ips = nodes_with_role('web').map{|node| node.ip_int}.map{|ip| "#{ip}/32"} @chef.set('app', ['nginx'], { 'authorized_ips' => web_ips, 'realip' => { 'addresses' => web_ips}}) end
setup_role_chefs()
click to toggle source
# File lib/skirnir/site.rb, line 120 def setup_role_chefs setup_chef_db_host setup_chef_nginx setup_chef_app_should_migrate end