marionette 0.0.1 → 0.0.2
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/.gitignore +2 -0
- data/README.md +34 -7
- data/Rakefile +97 -0
- data/bin/{marionette-puppet → marionette} +1 -2
- data/lib/marionette/puppet.rb +20 -7
- data/lib/marionette/version.rb +1 -1
- data/marionette.gemspec +4 -4
- metadata +26 -15
- data/bin/marionette-master +0 -9
data/README.md
CHANGED
@@ -7,27 +7,54 @@ master and executes puppet runs on demand. Marionette uses fast and lightweight
|
|
7
7
|
|
8
8
|
For more about Headstartapp see <http://headstartapp.com>.
|
9
9
|
|
10
|
+
|
10
11
|
Installation
|
11
12
|
------------
|
12
13
|
|
14
|
+
If you're using RVM, run this under the system context.
|
15
|
+
Be sure to have the appropriate port open (for the following example, port 5555)
|
16
|
+
on the puppet node.
|
17
|
+
|
13
18
|
gem install marionette
|
14
19
|
|
20
|
+
|
21
|
+
|
15
22
|
Example
|
16
23
|
-------
|
17
24
|
|
25
|
+
In this example, puppet and master are on the same local network and the puppet's ip is 192.168.1.1.
|
26
|
+
|
27
|
+
Note: By default, Marionette connects to "tcp://127.0.0.1:5555"
|
28
|
+
|
29
|
+
Results:
|
30
|
+
1) on the pupet, /tmp/test.out contains "test #{Time.now}"
|
31
|
+
2) master.receive returns puppet's facts as a hash.
|
32
|
+
3) Note: this example does not execute a puppet run.
|
33
|
+
|
34
|
+
|
18
35
|
Ruby:
|
19
36
|
|
37
|
+
require 'rubygems'
|
20
38
|
require 'marionette'
|
21
|
-
# By default, Marionette connects to "tcp://master.headstartapp.com:5555"
|
22
|
-
Headstartapp::Marionette::Connect.new.master
|
23
|
-
# Connect to a different master
|
24
|
-
Headstartapp::Marionette::Connect.new("tcp://master.example.com:5555").master
|
25
39
|
|
40
|
+
puppet = HeadStartApp::Marionette::Connect.new(:uri=>"192.168.1.1:5555) puppet
|
41
|
+
master = HeadStartApp::Marionette::Connect.new(:uri=>"192.168.1.1:5555").master
|
42
|
+
message = {:run=>{:system=>true,:facter=>true},:system=>{:command=>"echo 'test @ #{Time.now}' > /tmp/test.out"}}
|
43
|
+
master.send message
|
44
|
+
master.receive
|
45
|
+
|
46
|
+
|
47
|
+
|
48
|
+
CLI (start marionette-puppet as a daemon):
|
49
|
+
|
50
|
+
marionette start tcp://192.168.1.1:5555
|
51
|
+
|
52
|
+
|
53
|
+
|
54
|
+
Rake (set up marionette as a service:
|
26
55
|
|
27
|
-
|
56
|
+
rake setup-service
|
28
57
|
|
29
|
-
marionette-master start tcp://master.example.com:5555
|
30
|
-
marionette-puppet start tcp://master.example.com:5555
|
31
58
|
|
32
59
|
|
33
60
|
Meta
|
data/Rakefile
CHANGED
@@ -1,2 +1,99 @@
|
|
1
1
|
require 'bundler'
|
2
2
|
Bundler::GemHelper.install_tasks
|
3
|
+
|
4
|
+
require 'rake'
|
5
|
+
|
6
|
+
namespace :marionette do
|
7
|
+
|
8
|
+
# task description
|
9
|
+
desc 'Set up marionette as a service (run this as sudo/root)'
|
10
|
+
|
11
|
+
# define task:
|
12
|
+
# 1) write to init.d/marionette
|
13
|
+
# 2) set permissions
|
14
|
+
# 3) set ifconfig
|
15
|
+
# 4) start service
|
16
|
+
task :service do
|
17
|
+
|
18
|
+
script = <<CODE
|
19
|
+
#!/bin/bash
|
20
|
+
|
21
|
+
### BEGIN INIT INFO
|
22
|
+
# Provides: marionette
|
23
|
+
# Default-Start: 2 3 4 5
|
24
|
+
# Default-Stop: 0 1 6
|
25
|
+
# Short-Description: start and stop marionette
|
26
|
+
# Description: 0mq connection for puppet and master.
|
27
|
+
# chkconfig: - 85 15
|
28
|
+
### END INIT INFO
|
29
|
+
|
30
|
+
# source function library
|
31
|
+
. /etc/rc.d/init.d/functions
|
32
|
+
|
33
|
+
RETVAL=0
|
34
|
+
prog="marionette"
|
35
|
+
|
36
|
+
set -e
|
37
|
+
|
38
|
+
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
|
39
|
+
DESC="marionette daemon"
|
40
|
+
NAME=marionette
|
41
|
+
DAEMON=/usr/local/bin/$NAME
|
42
|
+
PIDFILE=/var/run/$NAME.pid
|
43
|
+
LOGFILE=/var/log/$NAME.log
|
44
|
+
SCRIPTNAME=/etc/init.d/$NAME
|
45
|
+
IP=`ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'`
|
46
|
+
TCP=tcp://$IP:5555
|
47
|
+
|
48
|
+
# Gracefully exit if the package has been removed.
|
49
|
+
# test -x $DAEMON || exit 0
|
50
|
+
|
51
|
+
d_start() {
|
52
|
+
$DAEMON start $TCP || echo -en "\n already running"
|
53
|
+
}
|
54
|
+
|
55
|
+
d_stop() {
|
56
|
+
kill -9 `cat $PIDFILE` || echo -en "\n not running"
|
57
|
+
}
|
58
|
+
|
59
|
+
case "$1" in
|
60
|
+
start)
|
61
|
+
echo -n "Starting $DESC: $NAME"
|
62
|
+
d_start
|
63
|
+
echo "."
|
64
|
+
;;
|
65
|
+
stop)
|
66
|
+
echo -n "Stopping $DESC: $NAME"
|
67
|
+
d_stop
|
68
|
+
echo "."
|
69
|
+
;;
|
70
|
+
restart)
|
71
|
+
echo -n "Restarting $DESC: $NAME"
|
72
|
+
d_stop
|
73
|
+
sleep 5
|
74
|
+
d_start
|
75
|
+
echo "."
|
76
|
+
;;
|
77
|
+
*)
|
78
|
+
echo "Usage: $SCRIPTNAME {start|stop|restart}" >&2
|
79
|
+
exit 3
|
80
|
+
;;
|
81
|
+
esac
|
82
|
+
|
83
|
+
exit 0
|
84
|
+
|
85
|
+
CODE
|
86
|
+
file = File.open('/etc/init.d/marionette','w')
|
87
|
+
file.write script
|
88
|
+
file.close
|
89
|
+
|
90
|
+
system "chmod 755 /etc/init.d/marionette"
|
91
|
+
system "chkconfig marionette on"
|
92
|
+
system "service marionette start"
|
93
|
+
end
|
94
|
+
|
95
|
+
# set "service" as the default task
|
96
|
+
task :default => [:service]
|
97
|
+
|
98
|
+
end
|
99
|
+
|
@@ -6,8 +6,7 @@ require 'marionette'
|
|
6
6
|
|
7
7
|
tcp = ARGV[1] rescue nil
|
8
8
|
options = { :uri => tcp } unless ARGV.nil?
|
9
|
-
puts "Connecting on #{tcp}..."
|
10
9
|
|
11
|
-
Daemons.run_proc('marionette
|
10
|
+
Daemons.run_proc('marionette',:dir_mode => :system, :log_output => true) do
|
12
11
|
HeadStartApp::Marionette::Connect.new(options).puppet
|
13
12
|
end
|
data/lib/marionette/puppet.rb
CHANGED
@@ -2,11 +2,12 @@ module HeadStartApp
|
|
2
2
|
module Marionette
|
3
3
|
|
4
4
|
require 'uri'
|
5
|
+
require 'facter'
|
5
6
|
|
6
7
|
|
7
8
|
# Puppet class is the active ZMQ connection on the puppet node
|
8
9
|
class Puppet
|
9
|
-
attr_accessor :socket, :thread
|
10
|
+
attr_accessor :socket, :thread, :message
|
10
11
|
|
11
12
|
def initialize(socket)
|
12
13
|
|
@@ -19,13 +20,13 @@ module HeadStartApp
|
|
19
20
|
def start
|
20
21
|
|
21
22
|
# Kill existing and create new pull-loop thread
|
22
|
-
@thread.kill unless @thread.nil?
|
23
|
-
Thread.abort_on_exception = true
|
24
|
-
@thread = Thread.new do
|
23
|
+
# @thread.kill unless @thread.nil?
|
24
|
+
# Thread.abort_on_exception = true
|
25
|
+
# @thread = Thread.new do
|
25
26
|
while true do
|
26
27
|
pull
|
27
28
|
end
|
28
|
-
end
|
29
|
+
# end
|
29
30
|
|
30
31
|
end
|
31
32
|
|
@@ -35,12 +36,16 @@ module HeadStartApp
|
|
35
36
|
# Stand by for a response msg
|
36
37
|
@response = @socket.recv
|
37
38
|
|
39
|
+
# Sets default message to current time
|
40
|
+
@message = "Response from node @ #{Time.now}."
|
41
|
+
|
38
42
|
begin
|
39
43
|
|
40
44
|
# Execute a puppet run and/or ad hoc system commands
|
41
45
|
@response = Marshal.load(@response)
|
42
46
|
puppet_run if @response[:run][:puppet]
|
43
47
|
system_run if @response[:run][:system]
|
48
|
+
facter_run if @response[:run][:facter]
|
44
49
|
|
45
50
|
rescue
|
46
51
|
|
@@ -51,7 +56,7 @@ module HeadStartApp
|
|
51
56
|
|
52
57
|
# Send back system stats
|
53
58
|
# @socket.send Marshal.dump(stats)
|
54
|
-
@socket.send Marshal.dump(
|
59
|
+
@socket.send Marshal.dump(@message)
|
55
60
|
|
56
61
|
end
|
57
62
|
|
@@ -89,8 +94,16 @@ module HeadStartApp
|
|
89
94
|
end
|
90
95
|
|
91
96
|
end
|
97
|
+
|
98
|
+
# Fetches facts collection
|
99
|
+
def facter_run
|
100
|
+
|
101
|
+
Facter.loadfacts
|
102
|
+
@message = Facter.collection.to_hash
|
103
|
+
|
104
|
+
end
|
92
105
|
|
93
|
-
#
|
106
|
+
# Some stats
|
94
107
|
# - to be set up as a fact(s) later
|
95
108
|
def stats
|
96
109
|
|
data/lib/marionette/version.rb
CHANGED
data/marionette.gemspec
CHANGED
@@ -17,13 +17,13 @@ Gem::Specification.new do |s|
|
|
17
17
|
s.files = `git ls-files`.split("\n")
|
18
18
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
19
19
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
20
|
-
s.executables << 'marionette
|
21
|
-
s.
|
20
|
+
s.executables << 'marionette'
|
21
|
+
s.add_dependency('facter')
|
22
22
|
s.add_dependency('zmq')
|
23
23
|
s.add_dependency('ffi')
|
24
24
|
s.add_dependency('ffi-rzmq')
|
25
25
|
s.add_dependency('daemons')
|
26
26
|
s.require_paths = ["lib"]
|
27
27
|
s.bindir = "bin"
|
28
|
-
|
29
|
-
|
28
|
+
end
|
29
|
+
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: marionette
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 27
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 2
|
10
|
+
version: 0.0.2
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Dan Lee
|
@@ -15,11 +15,11 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-01-
|
18
|
+
date: 2011-01-10 00:00:00 -08:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
22
|
-
name:
|
22
|
+
name: facter
|
23
23
|
prerelease: false
|
24
24
|
requirement: &id001 !ruby/object:Gem::Requirement
|
25
25
|
none: false
|
@@ -33,7 +33,7 @@ dependencies:
|
|
33
33
|
type: :runtime
|
34
34
|
version_requirements: *id001
|
35
35
|
- !ruby/object:Gem::Dependency
|
36
|
-
name:
|
36
|
+
name: zmq
|
37
37
|
prerelease: false
|
38
38
|
requirement: &id002 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
@@ -47,7 +47,7 @@ dependencies:
|
|
47
47
|
type: :runtime
|
48
48
|
version_requirements: *id002
|
49
49
|
- !ruby/object:Gem::Dependency
|
50
|
-
name: ffi
|
50
|
+
name: ffi
|
51
51
|
prerelease: false
|
52
52
|
requirement: &id003 !ruby/object:Gem::Requirement
|
53
53
|
none: false
|
@@ -61,7 +61,7 @@ dependencies:
|
|
61
61
|
type: :runtime
|
62
62
|
version_requirements: *id003
|
63
63
|
- !ruby/object:Gem::Dependency
|
64
|
-
name:
|
64
|
+
name: ffi-rzmq
|
65
65
|
prerelease: false
|
66
66
|
requirement: &id004 !ruby/object:Gem::Requirement
|
67
67
|
none: false
|
@@ -74,14 +74,26 @@ dependencies:
|
|
74
74
|
version: "0"
|
75
75
|
type: :runtime
|
76
76
|
version_requirements: *id004
|
77
|
+
- !ruby/object:Gem::Dependency
|
78
|
+
name: daemons
|
79
|
+
prerelease: false
|
80
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ">="
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
hash: 3
|
86
|
+
segments:
|
87
|
+
- 0
|
88
|
+
version: "0"
|
89
|
+
type: :runtime
|
90
|
+
version_requirements: *id005
|
77
91
|
description: Marionette connects a headstartapp server instance (puppet node) to its master and executes puppet runs on demand. Marionette uses fast and lightweight 0MQ <http://zeromq.org> messaging system.
|
78
92
|
email:
|
79
93
|
- dan@headstartapp.com
|
80
94
|
executables:
|
81
|
-
- marionette
|
82
|
-
- marionette
|
83
|
-
- marionette-master
|
84
|
-
- marionette-puppet
|
95
|
+
- marionette
|
96
|
+
- marionette
|
85
97
|
extensions: []
|
86
98
|
|
87
99
|
extra_rdoc_files: []
|
@@ -92,8 +104,7 @@ files:
|
|
92
104
|
- Gemfile.lock
|
93
105
|
- README.md
|
94
106
|
- Rakefile
|
95
|
-
- bin/marionette
|
96
|
-
- bin/marionette-puppet
|
107
|
+
- bin/marionette
|
97
108
|
- lib/marionette.rb
|
98
109
|
- lib/marionette/connect.rb
|
99
110
|
- lib/marionette/master.rb
|
@@ -130,7 +141,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
130
141
|
requirements: []
|
131
142
|
|
132
143
|
rubyforge_project: marionette
|
133
|
-
rubygems_version: 1.4.
|
144
|
+
rubygems_version: 1.4.2
|
134
145
|
signing_key:
|
135
146
|
specification_version: 3
|
136
147
|
summary: 0MQ connection between puppet and master.
|