Commit 4b783fab
Changed files (6)
config/deploy/production.rb
@@ -1,46 +1,8 @@
-# Simple Role Syntax
-# ==================
-# Supports bulk-adding hosts to roles, the primary server in each group
-# is considered to be the first unless any hosts have the primary
-# property set. Don't declare `role :all`, it's a meta role.
+servers = ChefSearch.new("production")
-role :app, %w{deployer@green.cakeside.com}
-role :web, %w{deployer@green.cakeside.com}
-role :db, %w{deployer@green.cakeside.com}
+role :app, servers.find_by(:app).map { |x| "#{fetch(:user)}@#{x}" }
+role :web, servers.find_by(:www).map { |x| "#{fetch(:user)}@#{x}" }
+role :db, servers.find_by(:db).map { |x| "#{fetch(:user)}@#{x}" }
-
-# Extended Server Syntax
-# ======================
-# This can be used to drop a more detailed server definition into the
-# server list. The second argument is a, or duck-types, Hash and is
-# used to set extended properties on the server.
-
-server 'green.cakeside.com', user: 'deployer', roles: %w{web app db}
set :rails_env, 'production'
set :domain, 'www.cakeside.com'
-
-# Custom SSH Options
-# ==================
-# You may pass any option but keep in mind that net/ssh understands a
-# limited set of options, consult[net/ssh documentation](http://net-ssh.github.io/net-ssh/classes/Net/SSH.html#method-c-start).
-#
-# Global options
-# --------------
-# set :ssh_options, {
-# keys: %w(/home/rlisowski/.ssh/id_rsa),
-# forward_agent: false,
-# auth_methods: %w(password)
-# }
-#
-# And/or per server (overrides global)
-# ------------------------------------
-# server 'example.com',
-# user: 'user_name',
-# roles: %w{web app},
-# ssh_options: {
-# user: 'user_name', # overrides user setting above
-# keys: %w(/home/user_name/.ssh/id_rsa),
-# forward_agent: false,
-# auth_methods: %w(publickey password)
-# # password: 'please use keys'
-# }
config/deploy.rb
@@ -2,9 +2,8 @@
lock '3.3.5'
set :application, 'cakeside'
-set :repo_url, 'git@github.com:cakeside/cakeside.git'
+set :repo_url, 'git@gitlab.com:cakeside/cakeside.git'
set :branch, 'master'
-
set :user, "deployer"
# Default branch is :master
lib/capistrano/chef_search.rb
@@ -0,0 +1,58 @@
+require 'chef'
+require 'chef-config/workstation_config_loader'
+
+class ChefSearch
+ attr_reader :chef_environment
+
+ def initialize(chef_environment = fetch(:chef_env_name))
+ @chef_environment = chef_environment
+ load_configuration
+ end
+
+ def find_by(role, &filter)
+ hosts, _, count = search(:node, query_for(role), filter_result: filters)
+ hostnames = hostnames_from(hosts, &filter)
+ puts "Using #{hostnames.count}/#{count} hosts for role: #{role}"
+ hostnames.each { |x| puts " #{x}" }
+ hostnames
+ end
+
+ private
+
+ def filters
+ { 'fqdn' => ['fqdn'], 'ip' => [ 'ec2', 'public_ipv4' ] }
+ end
+
+ def query_for(role)
+ [
+ "chef_environment:#{chef_environment}",
+ "roles:#{role}",
+ ].join(" AND ")
+ end
+
+ def search(*params)
+ Chef::Search::Query.new.search(*params)
+ end
+
+ def hostnames_from(hosts, &filter)
+ hostnames = hosts.map { |x| x['ip'] }.compact.sort
+ if filter.nil?
+ hostnames
+ else
+ hostnames = hostnames.find_all do |hostname|
+ yield hostname
+ end
+ end
+ end
+
+ def load_configuration(system_knife_rb = '/etc/chef/client.pem')
+ if File.readable?(system_knife_rb)
+ puts "Loading chef config from #{system_knife_rb}"
+ Chef::Config.from_file(system_knife_rb)
+ else
+ @loader = ChefConfig::WorkstationConfigLoader.new(nil, nil)
+ puts "Loading chef config from #{@loader.config_location}"
+ @loader.load
+ end
+ end
+end
Capfile
@@ -1,4 +1,5 @@
# Load DSL and Setup Up Stages
+$LOAD_PATH.unshift("#{Dir.pwd}/lib")
require 'capistrano/setup'
# Includes default deployment tasks
@@ -20,6 +21,7 @@ require 'capistrano/rbenv'
require 'capistrano/bundler'
require 'capistrano/rails/assets'
require 'capistrano/rails/migrations'
+require 'capistrano/chef_search'
# Loads custom tasks from `lib/capistrano/tasks' if you have any defined.
Dir.glob('lib/capistrano/tasks/*.rake').each { |r| import r }
Gemfile
@@ -48,16 +48,17 @@ gem 'font-awesome-rails'
gem 'bootstrap-sass', '~> 2.3.0'
group :development do
+ gem 'better_errors'
+ gem 'bullet'
gem 'capistrano', '3.3.5'
- gem 'capistrano-rails'
gem 'capistrano-bundler', '~> 1.1', require: false
+ gem 'capistrano-rails'
gem 'capistrano-rbenv', '~> 2.0', require: false
- gem 'bullet'
- gem 'better_errors'
+ gem 'chef'
gem 'lol_dba'
gem 'pry-rails'
- gem 'web-console', '~> 2.0'
gem 'spring-commands-rspec'
+ gem 'web-console', '~> 2.0'
end
group :development, :test do
Gemfile.lock
@@ -99,6 +99,46 @@ GEM
rack-test (>= 0.5.4)
xpath (~> 2.0)
chartkick (2.2.3)
+ chef (12.20.3)
+ addressable
+ bundler (>= 1.10)
+ chef-config (= 12.20.3)
+ chef-zero (>= 4.8)
+ diff-lcs (~> 1.2, >= 1.2.4)
+ erubis (~> 2.7)
+ ffi-yajl (~> 2.2)
+ highline (~> 1.6, >= 1.6.9)
+ iniparse (~> 1.4)
+ mixlib-archive (~> 0.4)
+ mixlib-authentication (~> 1.4)
+ mixlib-cli (~> 1.7)
+ mixlib-log (~> 1.3)
+ mixlib-shellout (~> 2.0)
+ net-sftp (~> 2.1, >= 2.1.2)
+ net-ssh (>= 2.9, < 5.0)
+ net-ssh-multi (~> 1.2, >= 1.2.1)
+ ohai (>= 8.6.0.alpha.1, < 13)
+ plist (~> 3.2)
+ proxifier (~> 1.0)
+ rspec-core (~> 3.5)
+ rspec-expectations (~> 3.5)
+ rspec-mocks (~> 3.5)
+ rspec_junit_formatter (~> 0.2.0)
+ serverspec (~> 2.7)
+ specinfra (~> 2.10)
+ syslog-logger (~> 1.6)
+ uuidtools (~> 2.1.5)
+ chef-config (12.20.3)
+ addressable
+ fuzzyurl
+ mixlib-config (~> 2.0)
+ mixlib-shellout (~> 2.0)
+ chef-zero (4.9.0)
+ ffi-yajl (~> 2.2)
+ hashie (>= 2.0, < 4.0)
+ mixlib-log (~> 1.3)
+ rack (< 2)
+ uuidtools (~> 2.1)
cliver (0.3.2)
coderay (1.1.1)
coffee-rails (4.1.1)
@@ -154,6 +194,9 @@ GEM
faraday (0.11.0)
multipart-post (>= 1.2, < 3)
ffaker (2.5.0)
+ ffi (1.9.18)
+ ffi-yajl (2.3.0)
+ libyajl2 (~> 1.2)
fog-aws (1.3.0)
fog-core (~> 1.38)
fog-json (~> 1.0)
@@ -174,6 +217,7 @@ GEM
foreman (0.84.0)
thor (~> 0.19.1)
formatador (0.2.5)
+ fuzzyurl (0.9.0)
geoip (1.6.3)
gibbon (3.0.1)
faraday (>= 0.9.1)
@@ -208,6 +252,7 @@ GEM
parser (>= 2.2.3.0)
rainbow (~> 2.2)
terminal-table (>= 1.5.1)
+ iniparse (1.4.2)
ipaddress (0.8.3)
jbuilder (2.6.3)
activesupport (>= 3.0.0, < 5.2)
@@ -239,6 +284,7 @@ GEM
kaminari-core (= 1.0.1)
kaminari-core (1.0.1)
kgio (2.11.0)
+ libyajl2 (1.2.0)
lol_dba (2.1.2)
actionpack (>= 3.0)
activerecord (>= 3.0)
@@ -256,22 +302,52 @@ GEM
mini_magick (4.7.0)
mini_portile2 (2.1.0)
minitest (5.10.1)
+ mixlib-archive (0.4.1)
+ mixlib-log
+ mixlib-authentication (1.4.1)
+ mixlib-log
+ mixlib-cli (1.7.0)
+ mixlib-config (2.2.4)
+ mixlib-log (1.7.1)
+ mixlib-shellout (2.2.7)
multi_json (1.12.1)
multipart-post (2.0.0)
naught (1.1.0)
net-scp (1.2.1)
net-ssh (>= 2.6.5)
+ net-sftp (2.1.2)
+ net-ssh (>= 2.6.5)
net-ssh (4.1.0)
+ net-ssh-gateway (2.0.0)
+ net-ssh (>= 4.0.0)
+ net-ssh-multi (1.2.1)
+ net-ssh (>= 2.6.5)
+ net-ssh-gateway (>= 1.2.0)
+ net-telnet (0.1.1)
nokogiri (1.7.1)
mini_portile2 (~> 2.1.0)
+ ohai (8.23.0)
+ chef-config (>= 12.5.0.alpha.1, < 13)
+ ffi (~> 1.9)
+ ffi-yajl (~> 2.2)
+ ipaddress
+ mixlib-cli
+ mixlib-config (~> 2.0)
+ mixlib-log (>= 1.7.1, < 2.0)
+ mixlib-shellout (~> 2.0)
+ plist (~> 3.1)
+ systemu (~> 2.6.4)
+ wmi-lite (~> 1.0)
parser (2.4.0.0)
ast (~> 2.2)
pg (0.20.0)
phantomjs (2.1.1.0)
+ plist (3.3.0)
poltergeist (1.15.0)
capybara (~> 2.1)
cliver (~> 0.3.1)
websocket-driver (>= 0.2.0)
+ proxifier (1.0.3)
pry (0.10.4)
coderay (~> 1.1.0)
method_source (~> 0.8.1)
@@ -314,11 +390,18 @@ GEM
rake
raindrops (0.18.0)
rake (12.0.0)
+ rspec (3.5.0)
+ rspec-core (~> 3.5.0)
+ rspec-expectations (~> 3.5.0)
+ rspec-mocks (~> 3.5.0)
rspec-core (3.5.4)
rspec-support (~> 3.5.0)
rspec-expectations (3.5.0)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.5.0)
+ rspec-its (1.2.0)
+ rspec-core (>= 3.0.0)
+ rspec-expectations (>= 3.0.0)
rspec-mocks (3.5.0)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.5.0)
@@ -331,6 +414,9 @@ GEM
rspec-mocks (~> 3.5.0)
rspec-support (~> 3.5.0)
rspec-support (3.5.0)
+ rspec_junit_formatter (0.2.3)
+ builder (< 4)
+ rspec-core (>= 2, < 4, != 2.12.0)
safe_yaml (1.0.4)
sass (3.4.23)
sass-rails (5.0.6)
@@ -339,6 +425,12 @@ GEM
sprockets (>= 2.8, < 4.0)
sprockets-rails (>= 2.0, < 4.0)
tilt (>= 1.1, < 3)
+ serverspec (2.38.0)
+ multi_json
+ rspec (~> 3.0)
+ rspec-its
+ specinfra (~> 2.53)
+ sfl (2.3)
simple_oauth (0.3.1)
simplecov (0.14.1)
docile (~> 1.1.0)
@@ -350,6 +442,11 @@ GEM
hashie (~> 3.0)
socksify (1.7.1)
spank (1.0.1441140881)
+ specinfra (2.67.9)
+ net-scp
+ net-ssh (>= 2.7, < 5.0)
+ net-telnet
+ sfl
spring (2.0.1)
activesupport (>= 4.2)
spring-commands-rspec (1.0.4)
@@ -364,6 +461,8 @@ GEM
sshkit (1.13.1)
net-scp (>= 1.1.2)
net-ssh (>= 2.8.0)
+ syslog-logger (1.6.8)
+ systemu (2.6.5)
teaspoon (1.1.5)
railties (>= 3.2.5, < 6)
teaspoon-jasmine (2.3.4)
@@ -399,6 +498,7 @@ GEM
kgio (~> 2.6)
raindrops (~> 0.7)
uniform_notifier (1.10.0)
+ uuidtools (2.1.5)
web-console (2.3.0)
activemodel (>= 4.0)
binding_of_caller (>= 0.7.2)
@@ -407,6 +507,7 @@ GEM
websocket-driver (0.6.5)
websocket-extensions (>= 0.1.0)
websocket-extensions (0.1.2)
+ wmi-lite (1.0.0)
xpath (2.0.0)
nokogiri (~> 1.3)
@@ -430,6 +531,7 @@ DEPENDENCIES
capistrano-rails
capistrano-rbenv (~> 2.0)
chartkick
+ chef
coffee-rails (~> 4.1.0)
curb
daemons