marionette 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +3 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +28 -0
- data/README.md +39 -0
- data/Rakefile +2 -0
- data/bin/marionette-master +9 -0
- data/bin/marionette-puppet +13 -0
- data/lib/marionette/connect.rb +58 -0
- data/lib/marionette/master.rb +51 -0
- data/lib/marionette/puppet.rb +111 -0
- data/lib/marionette/version.rb +5 -0
- data/lib/marionette.rb +1 -0
- data/marionette.gemspec +29 -0
- metadata +138 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
marionette (0.0.1)
|
5
|
+
daemons
|
6
|
+
ffi
|
7
|
+
ffi-rzmq
|
8
|
+
zmq
|
9
|
+
|
10
|
+
GEM
|
11
|
+
remote: http://rubygems.org/
|
12
|
+
specs:
|
13
|
+
daemons (1.1.0)
|
14
|
+
ffi (1.0.4)
|
15
|
+
rake (>= 0.8.7)
|
16
|
+
ffi-rzmq (0.7.0)
|
17
|
+
rake (0.8.7)
|
18
|
+
zmq (2.1.0.1)
|
19
|
+
|
20
|
+
PLATFORMS
|
21
|
+
ruby
|
22
|
+
|
23
|
+
DEPENDENCIES
|
24
|
+
daemons
|
25
|
+
ffi
|
26
|
+
ffi-rzmq
|
27
|
+
marionette!
|
28
|
+
zmq
|
data/README.md
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
Headstartapp::Marionette - ZMQ connection to puppet master
|
2
|
+
============================================================
|
3
|
+
|
4
|
+
Marionette connects a headstartapp server instance (puppet node) to its
|
5
|
+
master and executes puppet runs on demand. Marionette uses fast and lightweight
|
6
|
+
0MQ <http://zeromq.org> messaging system.
|
7
|
+
|
8
|
+
For more about Headstartapp see <http://headstartapp.com>.
|
9
|
+
|
10
|
+
Installation
|
11
|
+
------------
|
12
|
+
|
13
|
+
gem install marionette
|
14
|
+
|
15
|
+
Example
|
16
|
+
-------
|
17
|
+
|
18
|
+
Ruby:
|
19
|
+
|
20
|
+
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
|
+
|
26
|
+
|
27
|
+
CLI (start as a daemon):
|
28
|
+
|
29
|
+
marionette-master start tcp://master.example.com:5555
|
30
|
+
marionette-puppet start tcp://master.example.com:5555
|
31
|
+
|
32
|
+
|
33
|
+
Meta
|
34
|
+
----
|
35
|
+
|
36
|
+
Created and Maintained by Dan Lee
|
37
|
+
|
38
|
+
Released under the [MIT license](http://www.opensource.org/licenses/mit-license.php).
|
39
|
+
<http://github.com/headstartapp/marionette>
|
data/Rakefile
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
#!/usr/local/bin/ruby
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'daemons'
|
5
|
+
require 'marionette'
|
6
|
+
|
7
|
+
tcp = ARGV[1] rescue nil
|
8
|
+
options = { :uri => tcp } unless ARGV.nil?
|
9
|
+
puts "Connecting on #{tcp}..."
|
10
|
+
|
11
|
+
Daemons.run_proc('marionette-puppet',:dir => '/var/run', :log_output => true) do
|
12
|
+
HeadStartApp::Marionette::Connect.new(options).puppet
|
13
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module HeadStartApp
|
2
|
+
module Marionette
|
3
|
+
|
4
|
+
require 'uri'
|
5
|
+
require 'marionette/master'
|
6
|
+
require 'marionette/puppet'
|
7
|
+
|
8
|
+
|
9
|
+
# PuppetString class establishes a zmq messaging system connection with the puppet master
|
10
|
+
# and sends back stats and receives instructions to execute puppet runs or ad hoc system commands.
|
11
|
+
class Connect
|
12
|
+
attr_accessor :uri, :connection
|
13
|
+
|
14
|
+
def initialize(options = nil)
|
15
|
+
|
16
|
+
# Set default(s)
|
17
|
+
options = { :uri => "tcp://127.0.0.1:5555" } if options.nil?
|
18
|
+
|
19
|
+
# Set URI
|
20
|
+
@uri = URI(options[:uri])
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
# Connect puppet
|
25
|
+
# require 'zmq'
|
26
|
+
def puppet
|
27
|
+
require 'zmq'
|
28
|
+
|
29
|
+
# Set ZMQ context
|
30
|
+
context = ZMQ::Context.new(1)
|
31
|
+
|
32
|
+
# Set socket to talk to master
|
33
|
+
socket = context.socket(ZMQ::REP)
|
34
|
+
socket.bind(@uri.to_s)
|
35
|
+
@connection = HeadStartApp::Marionette::Puppet.new(socket)
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
# Connect master
|
40
|
+
# require 'ffi-rzmq'
|
41
|
+
def master
|
42
|
+
require 'ffi-rzmq'
|
43
|
+
|
44
|
+
# Set ZMQ context
|
45
|
+
context = ZMQ::Context.new(1)
|
46
|
+
|
47
|
+
# Set socket to talk to puppet
|
48
|
+
socket = context.socket(ZMQ::REQ)
|
49
|
+
socket.connect(@uri.to_s)
|
50
|
+
@connection = HeadStartApp::Marionette::Master.new(socket)
|
51
|
+
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module HeadStartApp
|
2
|
+
module Marionette
|
3
|
+
|
4
|
+
require 'uri'
|
5
|
+
|
6
|
+
|
7
|
+
# Master class is the ZMQ socket connection on the puppet master
|
8
|
+
class Master
|
9
|
+
attr_accessor :socket, :threads
|
10
|
+
|
11
|
+
def initialize(socket)
|
12
|
+
|
13
|
+
# Set socket
|
14
|
+
@socket = socket
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
# Sends a msg to puppet node
|
19
|
+
def send(msg)
|
20
|
+
|
21
|
+
# Send and Receive
|
22
|
+
@socket.send_string Marshal.dump(msg)
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
# Stands by for the next msg from puppet
|
27
|
+
# Processes and returns response
|
28
|
+
def receive
|
29
|
+
|
30
|
+
# Stand by for a response
|
31
|
+
begin
|
32
|
+
|
33
|
+
response = socket.recv_string
|
34
|
+
@response = Marshal.load(response)
|
35
|
+
|
36
|
+
rescue
|
37
|
+
|
38
|
+
# Catch non-marshal-able response
|
39
|
+
@response = response
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
@response
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
@@ -0,0 +1,111 @@
|
|
1
|
+
module HeadStartApp
|
2
|
+
module Marionette
|
3
|
+
|
4
|
+
require 'uri'
|
5
|
+
|
6
|
+
|
7
|
+
# Puppet class is the active ZMQ connection on the puppet node
|
8
|
+
class Puppet
|
9
|
+
attr_accessor :socket, :thread
|
10
|
+
|
11
|
+
def initialize(socket)
|
12
|
+
|
13
|
+
@socket = socket
|
14
|
+
start
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
# Starts send and response thread
|
19
|
+
def start
|
20
|
+
|
21
|
+
# 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
|
25
|
+
while true do
|
26
|
+
pull
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
# Pulls down messages from the master and pushes up stats
|
33
|
+
def pull
|
34
|
+
|
35
|
+
# Stand by for a response msg
|
36
|
+
@response = @socket.recv
|
37
|
+
|
38
|
+
begin
|
39
|
+
|
40
|
+
# Execute a puppet run and/or ad hoc system commands
|
41
|
+
@response = Marshal.load(@response)
|
42
|
+
puppet_run if @response[:run][:puppet]
|
43
|
+
system_run if @response[:run][:system]
|
44
|
+
|
45
|
+
rescue
|
46
|
+
|
47
|
+
# Catch non-hash responses
|
48
|
+
puts @response
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
# Send back system stats
|
53
|
+
# @socket.send Marshal.dump(stats)
|
54
|
+
@socket.send Marshal.dump(Time.now)
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
# Fetches thread status
|
59
|
+
def status
|
60
|
+
|
61
|
+
# Returns Thread status
|
62
|
+
@thread.status
|
63
|
+
|
64
|
+
end
|
65
|
+
|
66
|
+
# Stop the pull-loop thread
|
67
|
+
def disconnect
|
68
|
+
|
69
|
+
# Exit returns the Thread
|
70
|
+
# - Note: @thread was never joined
|
71
|
+
@thread.exit
|
72
|
+
|
73
|
+
end
|
74
|
+
|
75
|
+
# Executes ad hoc system command msg'd from the master
|
76
|
+
def system_run
|
77
|
+
|
78
|
+
system "#{@response[:system][:command]}"
|
79
|
+
|
80
|
+
end
|
81
|
+
|
82
|
+
# Executes a puppet run
|
83
|
+
def puppet_run
|
84
|
+
|
85
|
+
if @response[:puppet].nil?
|
86
|
+
system "puppetd --onetime --no-daemonize"
|
87
|
+
else
|
88
|
+
system "puppetd #{@response[:puppet][:args]}"
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
92
|
+
|
93
|
+
# Gathers stats
|
94
|
+
# - to be set up as a fact(s) later
|
95
|
+
def stats
|
96
|
+
|
97
|
+
stats = {}
|
98
|
+
stats[:disk] = `df -h -P` rescue nil
|
99
|
+
stats[:network] = `vnstat` rescue nil
|
100
|
+
stats[:memory] = `vmstat -a` rescue nil
|
101
|
+
stats[:process] = `monit status` rescue nil
|
102
|
+
stats[:cpu] = `mpstat -P ALL | awk 'NR>2' | cut -c14-` rescue nil
|
103
|
+
stats
|
104
|
+
|
105
|
+
end
|
106
|
+
|
107
|
+
end
|
108
|
+
|
109
|
+
end
|
110
|
+
|
111
|
+
end
|
data/lib/marionette.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'marionette/connect'
|
data/marionette.gemspec
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "marionette/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "marionette"
|
7
|
+
s.version = HeadStartApp::Marionette::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ["Dan Lee"]
|
10
|
+
s.email = ["dan@headstartapp.com"]
|
11
|
+
s.homepage = "http://headstartapp.com"
|
12
|
+
s.summary = %q{0MQ connection between puppet and master.}
|
13
|
+
s.description = %q{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.}
|
14
|
+
|
15
|
+
s.rubyforge_project = "marionette"
|
16
|
+
|
17
|
+
s.files = `git ls-files`.split("\n")
|
18
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
19
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
20
|
+
s.executables << 'marionette-master'
|
21
|
+
s.executables << 'marionette-puppet'
|
22
|
+
s.add_dependency('zmq')
|
23
|
+
s.add_dependency('ffi')
|
24
|
+
s.add_dependency('ffi-rzmq')
|
25
|
+
s.add_dependency('daemons')
|
26
|
+
s.require_paths = ["lib"]
|
27
|
+
s.bindir = "bin"
|
28
|
+
s.require_paths = ["lib"]
|
29
|
+
end
|
metadata
ADDED
@@ -0,0 +1,138 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: marionette
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 29
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 1
|
10
|
+
version: 0.0.1
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Dan Lee
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2011-01-08 00:00:00 -08:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: zmq
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 3
|
30
|
+
segments:
|
31
|
+
- 0
|
32
|
+
version: "0"
|
33
|
+
type: :runtime
|
34
|
+
version_requirements: *id001
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: ffi
|
37
|
+
prerelease: false
|
38
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
hash: 3
|
44
|
+
segments:
|
45
|
+
- 0
|
46
|
+
version: "0"
|
47
|
+
type: :runtime
|
48
|
+
version_requirements: *id002
|
49
|
+
- !ruby/object:Gem::Dependency
|
50
|
+
name: ffi-rzmq
|
51
|
+
prerelease: false
|
52
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
53
|
+
none: false
|
54
|
+
requirements:
|
55
|
+
- - ">="
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
hash: 3
|
58
|
+
segments:
|
59
|
+
- 0
|
60
|
+
version: "0"
|
61
|
+
type: :runtime
|
62
|
+
version_requirements: *id003
|
63
|
+
- !ruby/object:Gem::Dependency
|
64
|
+
name: daemons
|
65
|
+
prerelease: false
|
66
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
67
|
+
none: false
|
68
|
+
requirements:
|
69
|
+
- - ">="
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
hash: 3
|
72
|
+
segments:
|
73
|
+
- 0
|
74
|
+
version: "0"
|
75
|
+
type: :runtime
|
76
|
+
version_requirements: *id004
|
77
|
+
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
|
+
email:
|
79
|
+
- dan@headstartapp.com
|
80
|
+
executables:
|
81
|
+
- marionette-master
|
82
|
+
- marionette-puppet
|
83
|
+
- marionette-master
|
84
|
+
- marionette-puppet
|
85
|
+
extensions: []
|
86
|
+
|
87
|
+
extra_rdoc_files: []
|
88
|
+
|
89
|
+
files:
|
90
|
+
- .gitignore
|
91
|
+
- Gemfile
|
92
|
+
- Gemfile.lock
|
93
|
+
- README.md
|
94
|
+
- Rakefile
|
95
|
+
- bin/marionette-master
|
96
|
+
- bin/marionette-puppet
|
97
|
+
- lib/marionette.rb
|
98
|
+
- lib/marionette/connect.rb
|
99
|
+
- lib/marionette/master.rb
|
100
|
+
- lib/marionette/puppet.rb
|
101
|
+
- lib/marionette/version.rb
|
102
|
+
- marionette.gemspec
|
103
|
+
has_rdoc: true
|
104
|
+
homepage: http://headstartapp.com
|
105
|
+
licenses: []
|
106
|
+
|
107
|
+
post_install_message:
|
108
|
+
rdoc_options: []
|
109
|
+
|
110
|
+
require_paths:
|
111
|
+
- lib
|
112
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
113
|
+
none: false
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
hash: 3
|
118
|
+
segments:
|
119
|
+
- 0
|
120
|
+
version: "0"
|
121
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
122
|
+
none: false
|
123
|
+
requirements:
|
124
|
+
- - ">="
|
125
|
+
- !ruby/object:Gem::Version
|
126
|
+
hash: 3
|
127
|
+
segments:
|
128
|
+
- 0
|
129
|
+
version: "0"
|
130
|
+
requirements: []
|
131
|
+
|
132
|
+
rubyforge_project: marionette
|
133
|
+
rubygems_version: 1.4.1
|
134
|
+
signing_key:
|
135
|
+
specification_version: 3
|
136
|
+
summary: 0MQ connection between puppet and master.
|
137
|
+
test_files: []
|
138
|
+
|