chef-vpc-toolkit 2.3.2 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/CHANGELOG CHANGED
@@ -1,3 +1,6 @@
1
+ * Thu Mar 27 2011 Dan Prince <dan.prince@rackspace.com> - 2.4.0
2
+ - Implement 'chef:poll_clients' task.
3
+
1
4
  * Thu Mar 22 2011 Dan Prince <dan.prince@rackspace.com> - 2.3.2
2
5
  - Display the correct owner name when listing remote groups.
3
6
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 2.3.2
1
+ 2.4.0
@@ -1,4 +1,6 @@
1
1
  # Installation functions for Chef 0.8 RPMs obtained from the ELFF repo.
2
+ export CHEF_STATUS_PORT="1234"
3
+ export STATUS_MONITOR_DIR="/root/status_monitor"
2
4
 
3
5
  function configure_chef_server {
4
6
 
@@ -28,18 +30,49 @@ $CLIENT_VALIDATION_KEY
28
30
  sed -e "/^$/d" -i /etc/chef/validation.pem
29
31
  fi
30
32
 
31
- sed -e "s|localhost|$SERVER_NAME|g" -i /etc/chef/client.rb
32
- sed -e "s|^chef_server_url.*|chef_server_url \"http://$SERVER_NAME:4000\"|g" -i /etc/chef/client.rb
33
- sed -e "s|^log_location.*|log_location \"\/var/log/chef/client.log\"|g" -i /etc/chef/client.rb
33
+ local CLIENT_CONFIG="/etc/chef/client.rb"
34
+ local CHEF_NOTIFICATION_HANDLER=/var/lib/chef/handlers/netcat.rb
35
+ sed -e "s|localhost|$SERVER_NAME|g" -i $CLIENT_CONFIG
36
+ sed -e "s|^chef_server_url.*|chef_server_url \"http://$SERVER_NAME:4000\"|g" -i $CLIENT_CONFIG
37
+ sed -e "s|^log_location.*|log_location \"\/var/log/chef/client.log\"|g" -i $CLIENT_CONFIG
38
+ cat >> $CLIENT_CONFIG <<-EOF_CAT_CHEF_CLIENT_CONF
39
+ # custom Chef notification handler
40
+ require "$CHEF_NOTIFICATION_HANDLER"
41
+ netcat_handler = NetcatHandler.new
42
+ report_handlers << netcat_handler
43
+ exception_handlers << netcat_handler
44
+ EOF_CAT_CHEF_CLIENT_CONF
45
+
34
46
 
35
- local CHEF_CLIENT_CONF=/etc/default/chef-client
36
- [ -d /etc/sysconfig/ ] && CHEF_CLIENT_CONF=/etc/sysconfig/chef-client
37
- cat > $CHEF_CLIENT_CONF <<-"EOF_CAT_CHEF_CLIENT_CONF"
47
+ local CHEF_SYSCONFIG=/etc/default/chef-client
48
+ [ -d /etc/sysconfig/ ] && CHEF_SYSCONFIG=/etc/sysconfig/chef-client
49
+ cat > $CHEF_SYSCONFIG <<-"EOF_CAT_CHEF_SYSCONFIG"
38
50
  INTERVAL=600
39
51
  SPLAY=20
40
52
  CONFIG=/etc/chef/client.rb
41
53
  LOGFILE=/var/log/chef/client.log
42
- EOF_CAT_CHEF_CLIENT_CONF
54
+ EOF_CAT_CHEF_SYSCONFIG
55
+
56
+ mkdir -p /var/lib/chef/handlers
57
+ cat > $CHEF_NOTIFICATION_HANDLER <<-EOF_CHEF_NOTIFY
58
+ require 'socket'
59
+ class NetcatHandler < Chef::Handler
60
+ def report
61
+ begin
62
+ socket = TCPSocket.open('$SERVER_NAME', $CHEF_STATUS_PORT)
63
+ hostname=%x{hostname}.chomp
64
+ if success?
65
+ socket.write("#{hostname}:ONLINE\n")
66
+ else
67
+ socket.write("#{hostname}:FAILURE\n")
68
+ end
69
+ socket.close()
70
+ rescue Exception => e
71
+ Chef::Log.error("Netcat handler failed: " + e.message)
72
+ end
73
+ end
74
+ end
75
+ EOF_CHEF_NOTIFY
43
76
 
44
77
  }
45
78
 
@@ -131,6 +164,8 @@ knife node delete "$NODE_NAME.$DOMAIN_NAME" -y &> /dev/null || \
131
164
  knife client delete "$NODE_NAME.$DOMAIN_NAME" -y &> /dev/null || \
132
165
  { echo "Failed to delete client with knife. Ignoring..."; }
133
166
 
167
+ #send a reset notification for the Chef client status monitor
168
+ echo "$NODE_NAME:RESET" | nc localhost $CHEF_STATUS_PORT
134
169
  }
135
170
 
136
171
  function knife_create_databag {
@@ -231,3 +266,65 @@ function start_chef_client {
231
266
  fi
232
267
 
233
268
  }
269
+
270
+
271
+ function start_notification_server {
272
+
273
+
274
+ [ -d "$STATUS_MONITOR_DIR" ] && return 0;
275
+
276
+ if [ -f /usr/bin/yum ]; then
277
+ rpm -q nc &> /dev/null || yum install -y -q nc
278
+ elif [ -f /usr/bin/dpkg ]; then
279
+ dpkg -L netcat-openbsd > /dev/null 2>&1 || apt-get install -y --quiet netcat-openbsd > /dev/null 2>&1
280
+ else
281
+ echo "Failed to install netcat. (for Chef client status monitoring)"
282
+ exit 1
283
+ fi
284
+
285
+ mkdir -p $STATUS_MONITOR_DIR
286
+ cat >> $STATUS_MONITOR_DIR/server.sh <<-EOF_NC_NOTIFY_SERVER
287
+ #!/bin/bash
288
+ while true; do
289
+ nc -d -k -l $CHEF_STATUS_PORT > $STATUS_MONITOR_DIR/status.out
290
+ done
291
+ EOF_NC_NOTIFY_SERVER
292
+ bash $STATUS_MONITOR_DIR/server.sh &> /dev/null < /dev/null &
293
+
294
+ if [ -f /etc/rc.local ]; then
295
+ echo "bash $STATUS_MONITOR_DIR/server.sh &> /dev/null < /dev/null &" >> /etc/rc.local
296
+ fi
297
+
298
+ }
299
+
300
+ function poll_chef_client_online {
301
+
302
+ local CLIENT_NAMES=${1:?"Please specify a chef client name."}
303
+ local SECS=${2:-"600"} #10 minutes
304
+
305
+ local SLEEP_COUNT=5
306
+ local COUNT=1
307
+ local MAX_COUNT=$(( $SECS / $SLEEP_COUNT ))
308
+ local FAILED_CLIENTS=""
309
+ local ALL_ONLINE="true"
310
+ until (( $COUNT == $MAX_COUNT )); do
311
+ ALL_ONLINE="true"
312
+ FAILED_CLIENTS=""
313
+ for NAME in $CLIENT_NAMES; do
314
+ if ! grep "$NAME:" $STATUS_MONITOR_DIR/status.out | tail -n 1 | grep -c ":ONLINE" &> /dev/null; then
315
+ ALL_ONLINE="false"
316
+ FAILED_CLIENTS="$NAME $FAILED_CLIENTS"
317
+ fi
318
+ done
319
+ if [[ $ALL_ONLINE == "true" ]]; then
320
+ echo "All Chef client(s) ran successfully."
321
+ return 0
322
+ fi
323
+ COUNT=$(( $COUNT + 1 ))
324
+ sleep $SLEEP_COUNT
325
+ done
326
+
327
+ echo "Chef client(s) failed to run: $FAILED_CLIENTS"
328
+ return 1
329
+
330
+ }
@@ -92,6 +92,7 @@ mkdir -p /root/cookbook-repos
92
92
 
93
93
  configure_chef_server
94
94
  start_chef_server
95
+ start_notification_server
95
96
 
96
97
  #{configure_client_script}
97
98
 
@@ -279,6 +280,22 @@ def self.rsync_cookbook_repos(options, local_dir="#{CHEF_VPC_PROJECT}/cookbook-r
279
280
 
280
281
  end
281
282
 
283
+ def self.poll_clients(options, client_names, timeout=600)
284
+
285
+ output=%x{
286
+ ssh -o "StrictHostKeyChecking no" root@#{options['ssh_gateway_ip']} bash <<-"EOF_GATEWAY"
287
+ ssh #{options['chef_server_name']} bash <<-"EOF_BASH"
288
+ #{IO.read(CHEF_INSTALL_FUNCTIONS)}
289
+ poll_chef_client_online "#{client_names}" "#{timeout}"
290
+ EOF_BASH
291
+ EOF_GATEWAY
292
+ }
293
+ retval=$?
294
+ puts output
295
+ return retval.success?
296
+
297
+ end
298
+
282
299
  end
283
300
 
284
301
  end
@@ -189,7 +189,7 @@ namespace :chef do
189
189
 
190
190
  lines=ENV['LINES']
191
191
  server=ENV['SERVER_NAME']
192
- if server && server.empty?
192
+ if server and server.empty?
193
193
  server=nil
194
194
  end
195
195
  if lines.nil? or lines.empty? then
@@ -198,7 +198,7 @@ namespace :chef do
198
198
  configs=ChefInstaller.load_configs
199
199
  group=ServerGroup.fetch(:source => "cache")
200
200
  group.server_names do |name|
201
- if server && server != name
201
+ if server and server != name
202
202
  next
203
203
  end
204
204
 
@@ -209,6 +209,25 @@ namespace :chef do
209
209
 
210
210
  end
211
211
 
212
+ desc "Poll for Chef clients to finish running."
213
+ task :poll_clients do
214
+
215
+ server_list=ENV['SERVER_NAME']
216
+ timeout=ENV['CHEF_TIMEOUT']
217
+ group=ServerGroup.fetch(:source => "cache")
218
+ if server_list.nil? or server_list.empty?
219
+ server_list=group.server_names.collect{|x| x+" "}.to_s
220
+ end
221
+ if timeout.nil? or timeout.empty?
222
+ timeout=600
223
+ end
224
+ configs=ChefInstaller.load_configs
225
+ configs["ssh_gateway_ip"]=group.vpn_gateway_ip
226
+ puts "Polling for Chef clients to finish running..."
227
+ ChefInstaller.poll_clients(configs, server_list, timeout)
228
+
229
+ end
230
+
212
231
  #Deprecated
213
232
  task :sync_repos => "chef:push_repos"
214
233
 
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chef-vpc-toolkit
3
3
  version: !ruby/object:Gem::Version
4
- hash: 7
4
+ hash: 31
5
5
  prerelease: false
6
6
  segments:
7
7
  - 2
8
- - 3
9
- - 2
10
- version: 2.3.2
8
+ - 4
9
+ - 0
10
+ version: 2.4.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Dan Prince
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-03-22 00:00:00 -04:00
18
+ date: 2011-03-28 00:00:00 -04:00
19
19
  default_executable: chef-vpc-toolkit
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency