open-dock 0.0.10
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.
- checksums.yaml +7 -0
- data/.gitignore +16 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +163 -0
- data/Rakefile +2 -0
- data/bin/ops +3 -0
- data/lib/open-dock.rb +5 -0
- data/lib/open-dock/base.rb +17 -0
- data/lib/open-dock/commands/create_domain.rb +16 -0
- data/lib/open-dock/commands/create_host.rb +17 -0
- data/lib/open-dock/commands/delete_domain.rb +14 -0
- data/lib/open-dock/commands/delete_host.rb +16 -0
- data/lib/open-dock/commands/exec_host.rb +16 -0
- data/lib/open-dock/commands/list.rb +29 -0
- data/lib/open-dock/commands/provision_host.rb +11 -0
- data/lib/open-dock/commands/ship_host.rb +26 -0
- data/lib/open-dock/commands/unship_host.rb +16 -0
- data/lib/open-dock/digitalocean.rb +33 -0
- data/lib/open-dock/docker.rb +16 -0
- data/lib/open-dock/ops.rb +14 -0
- data/lib/open-dock/version.rb +3 -0
- data/lib/tasks/.gitkeep +0 -0
- data/open-dock.gemspec +27 -0
- metadata +127 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 8ce090366c643fc9d48113fbeb6a1e95b8b4189e
|
4
|
+
data.tar.gz: 343c0491c26a1a049b592c3d10342715da1163cc
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 38b03e75289cdeab1bab570e05dcd8711694b9d9e1695bc0a44ba1c345bca32fb51e6fdd4fa97e2b7bec3a45d460082906a0450e7d2974a7a7390c7ecfba56d3
|
7
|
+
data.tar.gz: eba86bd3992dbe5f3347481623ceda37fff8997a5f3cdd6058b7ca7308274eaec8d3371f88e6947c181949a11c1ac1f27b420bc2b972e9e535cbb074367526cf
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2014 Juan Lebrijo
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,163 @@
|
|
1
|
+
# Open Dock
|
2
|
+
|
3
|
+
Covers Provision and Configuration Operations for complex server clouds:
|
4
|
+
|
5
|
+
1. PROVISION: Create hosts from all possible cloud providers (i.e.: DigitalOcean, GCloud, Rackspace, Linode ...).
|
6
|
+
1. WIRING: Ship those hosts with Docker containers.
|
7
|
+
1. CONFIGURATION: Build Chef cookbooks and configure/re-configure your servers.
|
8
|
+
|
9
|
+
## Installation
|
10
|
+
|
11
|
+
Add this line to your application's Gemfile:
|
12
|
+
|
13
|
+
```ruby
|
14
|
+
gem 'open-dock'
|
15
|
+
```
|
16
|
+
|
17
|
+
And then execute:
|
18
|
+
|
19
|
+
$ bundle
|
20
|
+
|
21
|
+
Or install it yourself as:
|
22
|
+
|
23
|
+
$ gem install open-dock
|
24
|
+
|
25
|
+
|
26
|
+
## Usage: Provision with OPS command
|
27
|
+
|
28
|
+
OPS command is focused to cover first Provision configurations for a the Operations of your infrastructure.
|
29
|
+
|
30
|
+
You can create an infrastructure project (like me [/ops](https://github.com/jlebrijo/ops))
|
31
|
+
|
32
|
+
```
|
33
|
+
mkdir ops && cd ops
|
34
|
+
rbenv local 2.1.2
|
35
|
+
git init
|
36
|
+
```
|
37
|
+
|
38
|
+
Create a Gemfile:
|
39
|
+
|
40
|
+
```
|
41
|
+
source 'https://rubygems.org'
|
42
|
+
|
43
|
+
gem 'open-dock'
|
44
|
+
|
45
|
+
# OPTIONAL: Add next gems if you want to integrate with Chef as Configuration management tecnology
|
46
|
+
gem 'knife-solo'
|
47
|
+
gem 'librarian-chef'
|
48
|
+
gem 'foodcritic'
|
49
|
+
```
|
50
|
+
|
51
|
+
And: `bundle install`
|
52
|
+
|
53
|
+
To avoid `bundle exec` repfix: `bundle install --binstubs .bundle/bin`
|
54
|
+
|
55
|
+
Or integrate it within your Chef infrastructure project. Just add the gem to your Gemfile.
|
56
|
+
|
57
|
+
### Folder Structure
|
58
|
+
|
59
|
+
TODO: `ops init` to create this structure
|
60
|
+
|
61
|
+
Structure:
|
62
|
+
|
63
|
+
```
|
64
|
+
ops
|
65
|
+
providers
|
66
|
+
digitalocean.yml
|
67
|
+
hosts
|
68
|
+
example.com.yml
|
69
|
+
containers
|
70
|
+
example.com.yml
|
71
|
+
```
|
72
|
+
|
73
|
+
#### Provider file syntax
|
74
|
+
|
75
|
+
TODO: Create more providers (aws, linode, gcloud, ...)
|
76
|
+
|
77
|
+
For a Digital Ocean provider create a file (ops/providers/digitalocean.yml) with your account API key:
|
78
|
+
|
79
|
+
```yml
|
80
|
+
token: a206ae60dda6bxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcf0cbf41
|
81
|
+
```
|
82
|
+
|
83
|
+
#### Host file syntax
|
84
|
+
|
85
|
+
For a Digital Ocean host we can make the following file (ops/hosts/example.com.yml):
|
86
|
+
|
87
|
+
```yml
|
88
|
+
user: core # User to connect the host
|
89
|
+
# Values to configure DigitalOcean machine
|
90
|
+
size: 1gb
|
91
|
+
region: ams3
|
92
|
+
image: coreos-stable
|
93
|
+
ssh_keys:
|
94
|
+
- e7:51:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:88:57
|
95
|
+
```
|
96
|
+
|
97
|
+
And create the host: `ops create host example.com`
|
98
|
+
|
99
|
+
### Containers file syntax
|
100
|
+
|
101
|
+
In this file we can configure all containers to run in the host provided in the name:
|
102
|
+
|
103
|
+
```yml
|
104
|
+
www:
|
105
|
+
image: jlebrijo/prun
|
106
|
+
ports:
|
107
|
+
- '2222:22'
|
108
|
+
- '80:80'
|
109
|
+
# command: /bin/bash
|
110
|
+
|
111
|
+
# OPTIONS: use the long name of the options, 'detach' instead of '-d'
|
112
|
+
detach: true
|
113
|
+
# interactive: true
|
114
|
+
# memory: 8g
|
115
|
+
# cpuset: 0-7
|
116
|
+
|
117
|
+
# POST-CONDITIONS: execute after build the container:
|
118
|
+
post-conditions:
|
119
|
+
- sshpass -p 'J3mw?$_6' ssh-copy-id -o 'StrictHostKeyChecking no' -i ~/.ssh/id_rsa.pub root@lebrijo.com -p 2222
|
120
|
+
- ssh root@lebrijo.com -p 2222 "echo 'root:K8rt$_?1' | chpasswd"
|
121
|
+
|
122
|
+
# here you can create other containers
|
123
|
+
# db:
|
124
|
+
# image: ubuntu/postgresql
|
125
|
+
```
|
126
|
+
|
127
|
+
Create containers at host: `ops ship host example.com`
|
128
|
+
|
129
|
+
### Commands
|
130
|
+
|
131
|
+
Create/delete domain names, create/delete hosts and ship/unship hosts:
|
132
|
+
|
133
|
+
* `ops create host HOST_NAME` create the host defined by the name of the file in the 'ops/hosts' folder.
|
134
|
+
* `ops delete host HOST_NAME`
|
135
|
+
* `ops create domain DOMAIN_NAME [IP_ADDRESS]` create a domain to be managed by DigitalOcean.
|
136
|
+
* `ops delete domain DOMAIN_NAME [IP_ADDRESS]`
|
137
|
+
* `ops ship host HOST_NAME` run the containers in the host.
|
138
|
+
* `ops unship host HOST_NAME`
|
139
|
+
|
140
|
+
### TODO: Configuration with Chef
|
141
|
+
|
142
|
+
Configuration with chef commands
|
143
|
+
|
144
|
+
* `ops configure host HOST_NAME`: configure with chef all containers in host. Here you need to install knife-solo gem.
|
145
|
+
* knife solo cook [container_user]@[container_dns_name] -p [container_ssh_port]
|
146
|
+
|
147
|
+
## Contributing
|
148
|
+
|
149
|
+
1. Fork it ( https://github.com/[my-github-username]/open-dock/fork )
|
150
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
151
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
152
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
153
|
+
5. Create a new Pull Request
|
154
|
+
|
155
|
+
## License
|
156
|
+
|
157
|
+
[MIT License](http://opensource.org/licenses/MIT). Made by [Lebrijo.com](http://lebrijo.com)
|
158
|
+
|
159
|
+
## Release notes
|
160
|
+
|
161
|
+
### v0.0.10
|
162
|
+
|
163
|
+
* First publication: split 'open-dock' gem from 'prun-ops' gem
|
data/Rakefile
ADDED
data/bin/ops
ADDED
data/lib/open-dock.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
module Ops
|
2
|
+
DIR = "ops"
|
3
|
+
HOSTS_DIR = "#{DIR}/hosts"
|
4
|
+
CONTAINERS_DIR = "#{DIR}/containers"
|
5
|
+
PROVIDERS_DIR = "#{DIR}/providers"
|
6
|
+
|
7
|
+
|
8
|
+
def self.get_user_for(host_name)
|
9
|
+
host_file = "#{HOSTS_DIR}/#{host_name}.yml"
|
10
|
+
begin
|
11
|
+
params = YAML.load_file host_file
|
12
|
+
params["user"]
|
13
|
+
rescue
|
14
|
+
raise "Please, create '#{host_file}' configuring your host"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
command :'create domain' do |c|
|
2
|
+
c.summary = 'Create a domain in your DigitalOcean account'
|
3
|
+
c.syntax = 'ops create domain [domain name] [ip address]'
|
4
|
+
c.description = "Create the domain with #{DigitalOcean::CONFIG_FILE} credentials"
|
5
|
+
c.example 'Create the domain example.com in your DigitalOcean console', 'ops create domain example.com'
|
6
|
+
c.action do |args, options|
|
7
|
+
ip = (args[1].nil?)? '1.1.1.1':args[1]
|
8
|
+
domain = DropletKit::Domain.new(ip_address: ip, name: args[0])
|
9
|
+
resp = DigitalOcean::client.domains.create domain
|
10
|
+
if domain == resp
|
11
|
+
say "Domain #{resp.name} succesfully created!"
|
12
|
+
else
|
13
|
+
raise resp
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
command :'create host' do |c|
|
2
|
+
c.summary = 'Create a droplet/host in your DO account'
|
3
|
+
c.syntax = 'ops create host [DNS_name]'
|
4
|
+
c.description = "Creates the host described in the file #{Ops::HOSTS_DIR}/[DNS_name].yml"
|
5
|
+
c.example "Create the host example.com in your DigitalOcean console. This is described in '#{Ops::HOSTS_DIR}/example.com.yml' like:\n # size: 512mb\n # region: ams1\n # image: coreos-stable\n # ssh_keys:\n # - e7:51:47:bc:7f:dc:2f:3c:56:65:28:e1:10:9c:88:57 xx:xx:xx:xx:xx:xx:xx", 'ops create host example.com'
|
6
|
+
c.action do |args, options|
|
7
|
+
droplet = DigitalOcean::build_droplet args[0]
|
8
|
+
cli = DigitalOcean::client
|
9
|
+
resp = cli.droplets.create droplet
|
10
|
+
if resp == droplet
|
11
|
+
ip = cli.find_droplet_by_name(args[0]).networks["v4"].first.ip_address
|
12
|
+
say "Droplet #{args[0]} (IP: #{ip}) succesfully created!"
|
13
|
+
else
|
14
|
+
raise resp
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
command :'delete domain' do |c|
|
2
|
+
c.summary = 'Delete a domain in your DigitalOcean account'
|
3
|
+
c.syntax = 'ops delete domain [domain name]'
|
4
|
+
c.description = "Delete the domain with #{DigitalOcean::CONFIG_FILE} credentials"
|
5
|
+
c.example 'Delete the domain example.com in your DigitalOcean console', 'ops delete domain example.com'
|
6
|
+
c.action do |args, options|
|
7
|
+
resp = DigitalOcean::client.domains.delete name: args[0]
|
8
|
+
if resp.is_a?(TrueClass)
|
9
|
+
say "Domain #{args[0]} succesfully deleted!"
|
10
|
+
else
|
11
|
+
raise resp
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
command :'delete host' do |c|
|
2
|
+
c.summary = 'Delete a host in your DigitalOcean account'
|
3
|
+
c.syntax = 'ops delete host [DNS_name]'
|
4
|
+
c.description = "Delete the host, based on DNS_name, which (not need but) should be described in its #{Ops::HOSTS_DIR}/[DNS_name].yml file "
|
5
|
+
c.example 'Delete the host example.com in your DigitalOcean console', 'ops delete host example.com'
|
6
|
+
c.action do |args, options|
|
7
|
+
cli = DigitalOcean::client
|
8
|
+
id = cli.find_droplet_by_name(args[0]).id
|
9
|
+
resp = cli.droplets.delete id: id
|
10
|
+
if resp.is_a?(TrueClass)
|
11
|
+
say "Droplet #{args[0]} succesfully deleted!"
|
12
|
+
else
|
13
|
+
raise resp
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
command :'exec host' do |c|
|
2
|
+
c.summary = 'Execute a command in host'
|
3
|
+
c.description = "Execute a command in host defined by DNS_name"
|
4
|
+
c.syntax = 'ops exec host [host_name] "[command]"'
|
5
|
+
c.example "", "ops exec host example.com 'docker ps -a'"
|
6
|
+
c.action do |args, options|
|
7
|
+
host = args[0]
|
8
|
+
user = Ops::get_user_for(host)
|
9
|
+
|
10
|
+
Net::SSH.start(host, user) do |ssh|
|
11
|
+
Docker::containers_for(host).each do |container_name, config|
|
12
|
+
ssh.exec args[1]
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
command :list do |c|
|
2
|
+
c.summary = 'List all droplet creation parameters'
|
3
|
+
c.syntax = 'ops list'
|
4
|
+
c.description = "This shows a list in the format '- [id] => [description]'. Use [id] values to create your host file in #{Ops::DIR}/hosts/[dns_name].yml "
|
5
|
+
c.action do |args, options|
|
6
|
+
cli = DigitalOcean::client
|
7
|
+
say "\nDESCRIPTION: #{c.description}\n"
|
8
|
+
|
9
|
+
say "\nSizes:"
|
10
|
+
cli.sizes.all.each do |i|
|
11
|
+
say " - #{i.slug.ljust(6)} => $#{i.price_monthly}/mo"
|
12
|
+
end
|
13
|
+
|
14
|
+
say "\nRegions:"
|
15
|
+
cli.regions.all.each do |i|
|
16
|
+
say " - #{i.slug.ljust(6)} => #{i.name}"
|
17
|
+
end
|
18
|
+
|
19
|
+
say "\nImages:"
|
20
|
+
cli.images.all.each do |i|
|
21
|
+
say " - #{i.slug.ljust(20)} => #{i.distribution} #{i.name}" unless i.slug.nil?
|
22
|
+
end
|
23
|
+
|
24
|
+
say "\nSSH Keys:"
|
25
|
+
cli.ssh_keys.all.each do |i|
|
26
|
+
say " - #{i.fingerprint} => #{i.name}"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
command :'provision host' do |c|
|
2
|
+
c.summary = 'Create and ship the host based on config files'
|
3
|
+
c.syntax = 'ops provision host [host_name]'
|
4
|
+
c.description = "Agregate both commands Create and Ship host"
|
5
|
+
c.example "Creates and ships example.com host", 'ops provisiion host example.com'
|
6
|
+
c.action do |args, options|
|
7
|
+
system "#{program :name} create host #{args.join(" ")}"
|
8
|
+
sleep 15
|
9
|
+
system "#{program :name} ship host #{args.join(" ")}"
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
command :'ship host' do |c|
|
2
|
+
c.summary = 'Create Docker containers defined in ops/containers/[host_name].yml'
|
3
|
+
c.syntax = 'ops ship host [host_name]'
|
4
|
+
c.description = "Create all docker containers described in #{Ops::CONTAINERS_DIR}/[host_name].yml"
|
5
|
+
c.example "Create a container called 'www' in the host example.com. This is described in '#{Ops::CONTAINERS_DIR}/example.com.yml' like:\n # www:\n # detach: true\n # image: jlebrijo/prun\n # ports:\n # - '2222:22'\n # - '80:80'", 'ops ship host example.com'
|
6
|
+
c.action do |args, options|
|
7
|
+
host = args[0]
|
8
|
+
user = Ops::get_user_for(host)
|
9
|
+
|
10
|
+
Docker::containers_for(host).each do |container_name, config|
|
11
|
+
ports = config["ports"].map{|port| "-p #{port}"}.join(" ")
|
12
|
+
options = []
|
13
|
+
config.reject{|k| Docker::SPECIAL_OPTS.include? k}.each do |option, value|
|
14
|
+
options << "--#{option}=#{value}"
|
15
|
+
end
|
16
|
+
say "Container '#{container_name}' loading on #{host}, please wait ....\n"
|
17
|
+
Net::SSH.start(host, user) do |ssh|
|
18
|
+
command = "docker run #{options.join(" ")} --name #{container_name} #{ports} #{config["image"]} #{config["command"]}"
|
19
|
+
say "Docker CMD: #{command}\n"
|
20
|
+
ssh.exec command
|
21
|
+
end
|
22
|
+
sleep 5
|
23
|
+
config["post-conditions"].each { |c| system c }
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
command :'unship host' do |c|
|
2
|
+
c.summary = 'Removes all Docker containers defined for the host in '#{Ops::CONTAINERS_DIR}/[host_name].yml'
|
3
|
+
c.syntax = 'ops ship host [host_name]'
|
4
|
+
c.description = "Removes all Docker containers defined for the host in '#{Ops::CONTAINERS_DIR}/[host_name].yml"
|
5
|
+
c.example "", 'ops unship host example.com'
|
6
|
+
c.action do |args, options|
|
7
|
+
host = args[0]
|
8
|
+
user = Ops::get_user_for(host)
|
9
|
+
|
10
|
+
Net::SSH.start(host, user) do |ssh|
|
11
|
+
Docker::containers_for(host).each do |container_name, config|
|
12
|
+
ssh.exec "docker rm -f #{container_name}"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'droplet_kit'
|
2
|
+
require 'yaml'
|
3
|
+
|
4
|
+
module DigitalOcean
|
5
|
+
CONFIG_FILE = "#{Ops::PROVIDERS_DIR}/digitalocean.yml"
|
6
|
+
|
7
|
+
def self.client
|
8
|
+
begin
|
9
|
+
config = YAML.load_file CONFIG_FILE
|
10
|
+
rescue
|
11
|
+
raise "Please, create '#{CONFIG_FILE}' file with token value"
|
12
|
+
end
|
13
|
+
DropletKit::Client.new(access_token: config["token"])
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.build_droplet(host_name)
|
17
|
+
begin
|
18
|
+
params = YAML.load_file "#{Ops::DIR}/hosts/#{host_name}.yml"
|
19
|
+
params["name"]= host_name
|
20
|
+
rescue
|
21
|
+
raise "Please, create '#{CONFIG_FILE}' file with token value"
|
22
|
+
end
|
23
|
+
DropletKit::Droplet.new params
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
module DropletKit
|
28
|
+
class Client
|
29
|
+
def find_droplet_by_name(host_name)
|
30
|
+
self.droplets.all.find{|d| d.name == host_name}
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'droplet_kit'
|
2
|
+
require 'yaml'
|
3
|
+
|
4
|
+
module Docker
|
5
|
+
SPECIAL_OPTS = ["image", "ports", "command", "post-conditions"]
|
6
|
+
|
7
|
+
def self.containers_for(host_name)
|
8
|
+
config_file = "#{Ops::CONTAINERS_DIR}/#{host_name}.yml"
|
9
|
+
begin
|
10
|
+
config = YAML.load_file config_file
|
11
|
+
rescue
|
12
|
+
raise "Please, create '#{config_file}' file with all containers configured"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'commander/import'
|
3
|
+
require 'net/ssh'
|
4
|
+
require 'open-dock/base'
|
5
|
+
require 'open-dock/digitalocean'
|
6
|
+
require 'open-dock/docker'
|
7
|
+
require 'open-dock/version'
|
8
|
+
|
9
|
+
program :name, 'ops'
|
10
|
+
program :version, OpenDock::VERSION
|
11
|
+
program :description, 'Encapsulates Operations commands for complex server clouds: Provision and Configuration from all possible providers such as DigitalOcean, Google Cloud, Rackspace, Linode,...'
|
12
|
+
program :help_formatter, :compact
|
13
|
+
|
14
|
+
Dir.glob("#{File.dirname(__FILE__)}/commands/*.rb").each { |r| load r }
|
data/lib/tasks/.gitkeep
ADDED
File without changes
|
data/open-dock.gemspec
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'open-dock/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "open-dock"
|
8
|
+
spec.version = OpenDock::VERSION
|
9
|
+
spec.authors = ["Juan Lebrijo"]
|
10
|
+
spec.email = ["juan@lebrijo.com"]
|
11
|
+
spec.summary = %q{Encapsulates Provision and Configuration Operations commands needed for complex server clouds.}
|
12
|
+
spec.description = %q{Encapsulates Operations commands for complex server clouds: Provision and Configuration from all possible providers such as DigitalOcean, Google Cloud, Rackspace, Linode,...}
|
13
|
+
spec.homepage = "http://github.com/jlebrijo/open-dock"
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files -z`.split("\x0")
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
spec.executables = ['ops']
|
21
|
+
|
22
|
+
spec.add_development_dependency "bundler", "~> 1.6"
|
23
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
24
|
+
|
25
|
+
spec.add_runtime_dependency "commander"
|
26
|
+
spec.add_runtime_dependency "droplet_kit"
|
27
|
+
end
|
metadata
ADDED
@@ -0,0 +1,127 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: open-dock
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.10
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Juan Lebrijo
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-11-16 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.6'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.6'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: commander
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: droplet_kit
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
description: 'Encapsulates Operations commands for complex server clouds: Provision
|
70
|
+
and Configuration from all possible providers such as DigitalOcean, Google Cloud,
|
71
|
+
Rackspace, Linode,...'
|
72
|
+
email:
|
73
|
+
- juan@lebrijo.com
|
74
|
+
executables:
|
75
|
+
- ops
|
76
|
+
extensions: []
|
77
|
+
extra_rdoc_files: []
|
78
|
+
files:
|
79
|
+
- ".gitignore"
|
80
|
+
- Gemfile
|
81
|
+
- LICENSE.txt
|
82
|
+
- README.md
|
83
|
+
- Rakefile
|
84
|
+
- bin/ops
|
85
|
+
- lib/open-dock.rb
|
86
|
+
- lib/open-dock/base.rb
|
87
|
+
- lib/open-dock/commands/create_domain.rb
|
88
|
+
- lib/open-dock/commands/create_host.rb
|
89
|
+
- lib/open-dock/commands/delete_domain.rb
|
90
|
+
- lib/open-dock/commands/delete_host.rb
|
91
|
+
- lib/open-dock/commands/exec_host.rb
|
92
|
+
- lib/open-dock/commands/list.rb
|
93
|
+
- lib/open-dock/commands/provision_host.rb
|
94
|
+
- lib/open-dock/commands/ship_host.rb
|
95
|
+
- lib/open-dock/commands/unship_host.rb
|
96
|
+
- lib/open-dock/digitalocean.rb
|
97
|
+
- lib/open-dock/docker.rb
|
98
|
+
- lib/open-dock/ops.rb
|
99
|
+
- lib/open-dock/version.rb
|
100
|
+
- lib/tasks/.gitkeep
|
101
|
+
- open-dock.gemspec
|
102
|
+
homepage: http://github.com/jlebrijo/open-dock
|
103
|
+
licenses:
|
104
|
+
- MIT
|
105
|
+
metadata: {}
|
106
|
+
post_install_message:
|
107
|
+
rdoc_options: []
|
108
|
+
require_paths:
|
109
|
+
- lib
|
110
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
111
|
+
requirements:
|
112
|
+
- - ">="
|
113
|
+
- !ruby/object:Gem::Version
|
114
|
+
version: '0'
|
115
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
116
|
+
requirements:
|
117
|
+
- - ">="
|
118
|
+
- !ruby/object:Gem::Version
|
119
|
+
version: '0'
|
120
|
+
requirements: []
|
121
|
+
rubyforge_project:
|
122
|
+
rubygems_version: 2.4.2
|
123
|
+
signing_key:
|
124
|
+
specification_version: 4
|
125
|
+
summary: Encapsulates Provision and Configuration Operations commands needed for complex
|
126
|
+
server clouds.
|
127
|
+
test_files: []
|