odania_ops 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 97a7f695f5c90058224a5945f971f81bdf97decb
4
- data.tar.gz: e84dea70dcf975dd26226d8ce484d4219f35a08e
3
+ metadata.gz: 27bedf19aac7aa4c2167f33d7b57d03559503203
4
+ data.tar.gz: 5c8fddfd1d0e66be797cad0e2fc79b00c66c20c2
5
5
  SHA512:
6
- metadata.gz: 77868151a59fd20e06a6926e45d9e0f7e6b3bec0b66b779550495ebc4dbded834ca2bb1b1cb348f24e8fa579aae2084f2a69b60eaa8c3f0c06c89cce10c3f261
7
- data.tar.gz: ec2ac486a197c4b51ae431238d8455ba3fb590537e48fe332ec75caa56ef5d1c10e0a9540cc837ea5b8b05fa9b40c0d05b3db976f27e37b888af367eeba98763
6
+ metadata.gz: f26ec148dd4a29a41041dfc3da16a87c43f4b8e0a9114fd245295e92d9ae82a99c3cbc4d55752a83b42bb6f44ae0edf331170c29b429684278083193c19391d6
7
+ data.tar.gz: 424639eb2f838cb2c486ae5d602d88278e22e0c000483b337a19ecabd497e453d8efc93638ee035a621489e95bfd4554129e875e1d1cc5b2667ab5b070a413b1
data/Gemfile.lock CHANGED
@@ -1,34 +1,45 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- odania_ops (0.0.5)
4
+ odania_ops (0.0.6)
5
5
  activesupport
6
6
  deep_merge
7
7
  docker-api
8
+ erubis
8
9
  httparty
10
+ sshkit
9
11
  thor
10
12
 
11
13
  GEM
12
14
  remote: https://rubygems.org/
13
15
  specs:
14
- activesupport (4.2.5)
16
+ activesupport (4.2.5.1)
15
17
  i18n (~> 0.7)
16
18
  json (~> 1.7, >= 1.7.7)
17
19
  minitest (~> 5.1)
18
20
  thread_safe (~> 0.3, >= 0.3.4)
19
21
  tzinfo (~> 1.1)
22
+ colorize (0.7.7)
20
23
  deep_merge (1.0.1)
21
24
  docker-api (1.24.1)
22
25
  excon (>= 0.38.0)
23
26
  json
27
+ erubis (2.7.0)
24
28
  excon (0.45.4)
25
29
  httparty (0.13.7)
26
30
  json (~> 1.8)
27
31
  multi_xml (>= 0.5.2)
28
32
  i18n (0.7.0)
29
33
  json (1.8.3)
30
- minitest (5.8.3)
34
+ minitest (5.8.4)
31
35
  multi_xml (0.5.5)
36
+ net-scp (1.2.1)
37
+ net-ssh (>= 2.6.5)
38
+ net-ssh (3.0.2)
39
+ sshkit (1.7.1)
40
+ colorize (>= 0.7.0)
41
+ net-scp (>= 1.1.2)
42
+ net-ssh (>= 2.8.0)
32
43
  thor (0.19.1)
33
44
  thread_safe (0.3.5)
34
45
  tzinfo (1.2.2)
@@ -0,0 +1,52 @@
1
+ module OdaniaOps
2
+ module Cli
3
+ class Backup < Thor
4
+ desc 'execute <options>', 'Executes a backup'
5
+ option :type, :type => :string, :required => true
6
+ option :host, :type => :string, :required => true
7
+ option :host_user, :type => :string, :required => true
8
+ option :target_host, :type => :string, :required => true
9
+ option :target_type, :type => :string, :required => true
10
+ option :target_user, :type => :string, :required => true
11
+ option :target_password, :type => :string, :required => true
12
+ option :jumpbox, :type => :string
13
+
14
+ def execute(opts=nil)
15
+ @type = options[:type]
16
+ $logger.info "Starting backup [#{@type}] #{options[:host]} -> [#{options[:target_type]}] #{options[:target_host]} (Jumpbox: #{options[:jumpbox]})"
17
+ opts = opts.nil? ? {} : JSON.parse(opts)
18
+
19
+ # Detect implementation
20
+ backup_script_file = "/tmp/#{Time.now.to_i}_backup.rb"
21
+ clazz = "OdaniaOps::Implementations::Backup::#{@type}".constantize.new options[:host], opts
22
+ clazz.write backup_script_file
23
+
24
+ set_jump_host(options[:jumpbox]) unless options[:jumpbox].nil?
25
+
26
+ server_host = options[:host_user].nil? ? options[:host] : "#{options[:host_user]}@#{options[:host]}"
27
+ on server_host, in: :sequence do |host|
28
+ within '/tmp' do
29
+ server_backup_file = "/tmp/#{@type}_backup.rb"
30
+ upload! backup_script_file, server_backup_file
31
+ result = capture "sudo #{server_backup_file}"
32
+ $logger.info result
33
+ end
34
+ end
35
+
36
+ $logger.info "Finished backup [#{@type}] #{options[:host]} -> [#{options[:target_type]}] #{options[:target_host]} (Jumpbox: #{options[:jumpbox]})"
37
+ end
38
+
39
+ private
40
+
41
+ def set_jump_host(host)
42
+ SSHKit::Backend::Netssh.configure do |ssh|
43
+ ssh.ssh_options = {
44
+ forward_agent: true,
45
+ auth_methods: %w(publickey),
46
+ proxy: Net::SSH::Proxy::Command.new("ssh #{host} -W %h:%p")
47
+ }
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -18,10 +18,11 @@ module OdaniaOps
18
18
 
19
19
  $logger.info "Tagging #{build_tag} as latest"
20
20
  OdaniaOps::Helper::Docker.remote_tag "#{image_name}:#{build_tag}"
21
- OdaniaOps::Helper::Docker.remote_tag "#{image_name}:#{build_tag}", "#{image_name}:latest", true
21
+ OdaniaOps::Helper::Docker.remote_tag "#{image_name}:#{build_tag}", "#{image_name}:latest"
22
22
 
23
23
  $logger.info "Pushing #{build_tag}"
24
- OdaniaOps::Helper::Docker.push image_name
24
+ OdaniaOps::Helper::Docker.push image_name, build_tag
25
+ OdaniaOps::Helper::Docker.push image_name, 'latest'
25
26
  end
26
27
 
27
28
  desc 'base_image_check <folder>', 'Searches for all Dockerfiles under <folder> and looks for the base image'
@@ -97,4 +98,4 @@ module OdaniaOps
97
98
  end
98
99
  end
99
100
  end
100
- end
101
+ end
@@ -0,0 +1,20 @@
1
+ module OdaniaOps
2
+ module Cli
3
+ class Node < Thor
4
+ desc 'exec <command>', 'Run command on nodes'
5
+ option :hosts, :type => :string, :aliases => [:h], :required => true
6
+ option :process, :type => :string, :default => :sequence, :banner => 'Process in sequence or parallel'
7
+ def exec(*args)
8
+ command = args.join(' ')
9
+ on options[:hosts].split(','), in: options[:process].to_sym do |host|
10
+ within '/tmp' do
11
+ result = capture command
12
+ result.split("\n").each do |line|
13
+ info "#{host}: #{line}"
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,10 @@
1
+ module OdaniaOps
2
+ module Helper
3
+ class Backup
4
+ def space_used(user, host)
5
+ result = `echo "df -h" | sftp -b - #{user}@#{host}`
6
+ puts result.inspect
7
+ end
8
+ end
9
+ end
10
+ end
@@ -10,6 +10,9 @@ module OdaniaOps
10
10
  config_file = retrieve_config_folder folder
11
11
  end
12
12
 
13
+ $config = {}
14
+ return unless File.exists? config_file
15
+
13
16
  $logger.debug "Loading config file #{config_file}"
14
17
  $config = YAML.load_file(config_file)
15
18
  $logger.debug $config.inspect
@@ -29,9 +32,10 @@ module OdaniaOps
29
32
  folder = next_folder
30
33
  end
31
34
 
32
- raise "No configuration found! Looking in #{start_folder} and above."
35
+ $logger.error "No configuration found! Looking in #{start_folder} and above."
36
+ ''
33
37
  end
34
38
  end
35
39
  end
36
40
  end
37
- end
41
+ end
@@ -8,14 +8,14 @@ module OdaniaOps
8
8
  data['tags']
9
9
  end
10
10
 
11
- def remote_tag(image_name_and_tag, target_image_name_and_tag=nil, force=false)
11
+ def remote_tag(image_name_and_tag, target_image_name_and_tag=nil)
12
12
  target_image_name_and_tag = image_name_and_tag if target_image_name_and_tag.nil?
13
- opts = force ? '-f' : ''
14
- OdaniaOps::Helper::Shell.execute("docker tag #{opts} #{image_name_and_tag} #{registry_name}/#{target_image_name_and_tag}")
13
+ OdaniaOps::Helper::Shell.execute("docker tag #{image_name_and_tag} #{registry_name}/#{target_image_name_and_tag}")
15
14
  end
16
15
 
17
- def push(image_name)
18
- OdaniaOps::Helper::Shell.execute("docker push #{registry_name}/#{image_name}")
16
+ def push(image_name, tag=nil)
17
+ tag = ":#{tag}" unless tag.nil? or tag.empty?
18
+ OdaniaOps::Helper::Shell.execute("docker push #{registry_name}/#{image_name}#{tag}")
19
19
  end
20
20
 
21
21
  def login
@@ -0,0 +1,9 @@
1
+ module OdaniaOps
2
+ module Implementations
3
+ module Backup
4
+ class Mongodb
5
+
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,24 @@
1
+ module OdaniaOps
2
+ module Implementations
3
+ module Backup
4
+ class Mysql
5
+ attr_accessor :template, :host, :opts
6
+
7
+ def initialize(host, opts)
8
+ self.host = host
9
+ self.opts = opts
10
+ self.template = File.new(File.join(BASE_DIR, 'templates', 'backup', 'mysql.rb.erb')).read
11
+ end
12
+
13
+ def render
14
+ Erubis::Eruby.new(self.template).result(binding)
15
+ end
16
+
17
+ def write(target_file)
18
+ File.write(target_file, self.render)
19
+ `chmod +x #{target_file}`
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,9 @@
1
+ module OdaniaOps
2
+ module Implementations
3
+ module Backup
4
+ class Postgres
5
+
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module OdaniaOps
2
+ module Implementations
3
+ module Backup
4
+ class Rsync
5
+
6
+ end
7
+ end
8
+ end
9
+ end
@@ -1,3 +1,3 @@
1
1
  module OdaniaOps
2
- VERSION = '0.0.5'
2
+ VERSION = '0.0.6'
3
3
  end
data/lib/odania_ops.rb CHANGED
@@ -4,14 +4,28 @@ require 'httparty'
4
4
  require 'logger'
5
5
  require 'yaml'
6
6
  require 'deep_merge/rails_compat'
7
+ require 'erubis'
7
8
  require 'active_support/all'
8
9
  require 'docker-api'
9
10
 
11
+ require 'net/ssh/proxy/command'
12
+ require 'sshkit'
13
+ require 'sshkit/dsl'
14
+
15
+ BASE_DIR = File.absolute_path File.join(File.dirname(__FILE__), '..') unless defined? BASE_DIR
16
+
17
+ require_relative 'odania_ops/cli/backup'
10
18
  require_relative 'odania_ops/cli/config'
11
19
  require_relative 'odania_ops/cli/docker'
20
+ require_relative 'odania_ops/cli/node'
21
+ require_relative 'odania_ops/helper/backup'
12
22
  require_relative 'odania_ops/helper/config'
13
23
  require_relative 'odania_ops/helper/docker'
14
24
  require_relative 'odania_ops/helper/shell'
25
+ require_relative 'odania_ops/implementations/backup/mongodb'
26
+ require_relative 'odania_ops/implementations/backup/mysql'
27
+ require_relative 'odania_ops/implementations/backup/postgres'
28
+ require_relative 'odania_ops/implementations/backup/rsync'
15
29
 
16
30
  # Setup logger
17
31
  $logger = Logger.new(STDOUT)
@@ -31,11 +45,17 @@ module OdaniaOps
31
45
  $logger.level = "Logger::#{options['log_level']}".constantize
32
46
  end
33
47
 
48
+ desc 'backup', 'Backup helper'
49
+ subcommand 'backup', Backup
50
+
34
51
  desc 'docker', 'Docker helper'
35
52
  subcommand 'docker', Docker
36
53
 
37
54
  desc 'config', 'Manage configuration'
38
55
  subcommand 'config', Config
56
+
57
+ desc 'node', 'Execute commands on nodes'
58
+ subcommand 'node', Node
39
59
  end
40
60
  end
41
61
  end
data/odania_ops.gemspec CHANGED
@@ -19,6 +19,8 @@ Gem::Specification.new do |gem|
19
19
  gem.add_dependency 'activesupport'
20
20
  gem.add_dependency 'deep_merge'
21
21
  gem.add_dependency 'docker-api'
22
+ gem.add_dependency 'erubis'
22
23
  gem.add_dependency 'httparty'
23
24
  gem.add_dependency 'thor'
25
+ gem.add_dependency 'sshkit'
24
26
  end
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env ruby
2
+ require 'fileutils'
3
+
4
+ # Config
5
+ mysql_user = '<%= opts['user'] %>'
6
+ mysql_pass = '<%= opts['password'] %>'
7
+ mysql_host = '127.0.0.1'
8
+
9
+ # Backup folder
10
+ backup_dir = '/media/backup/<%= host %>/mysql'
11
+
12
+ # Create folder if needed
13
+ FileUtils.mkdir_p backup_dir unless File.directory? backup_dir
14
+
15
+ # Backup MySql
16
+ result = ` mysql -u #{mysql_user} -p#{mysql_pass} -h #{mysql_host} --silent -N -e 'show databases'`.split("\n")
17
+ result.each do |db_name|
18
+ db_name = db_name.strip
19
+ next if %w(information_schema performance_schema).include? db_name
20
+
21
+ filename = "#{backup_dir}/#{db_name}.mysql.sql.gz"
22
+ puts "Backing up #{db_name} to #{filename}"
23
+ ` mysqldump -u #{mysql_user} -p#{mysql_pass} -h #{mysql_host} -e --opt -c #{db_name} | gzip -c > #{filename}`
24
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: odania_ops
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Petersen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-01-11 00:00:00.000000000 Z
11
+ date: 2016-11-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: erubis
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'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: httparty
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -80,6 +94,20 @@ dependencies:
80
94
  - - ">="
81
95
  - !ruby/object:Gem::Version
82
96
  version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: sshkit
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
83
111
  description: Ops tools for managing servers
84
112
  email:
85
113
  - mike@odania-it.com
@@ -98,13 +126,21 @@ files:
98
126
  - bin/odania-ops
99
127
  - bin/ops
100
128
  - lib/odania_ops.rb
129
+ - lib/odania_ops/cli/backup.rb
101
130
  - lib/odania_ops/cli/config.rb
102
131
  - lib/odania_ops/cli/docker.rb
132
+ - lib/odania_ops/cli/node.rb
133
+ - lib/odania_ops/helper/backup.rb
103
134
  - lib/odania_ops/helper/config.rb
104
135
  - lib/odania_ops/helper/docker.rb
105
136
  - lib/odania_ops/helper/shell.rb
137
+ - lib/odania_ops/implementations/backup/mongodb.rb
138
+ - lib/odania_ops/implementations/backup/mysql.rb
139
+ - lib/odania_ops/implementations/backup/postgres.rb
140
+ - lib/odania_ops/implementations/backup/rsync.rb
106
141
  - lib/odania_ops/version.rb
107
142
  - odania_ops.gemspec
143
+ - templates/backup/mysql.rb.erb
108
144
  homepage: http://www.odania.com/ops-tools
109
145
  licenses:
110
146
  - MIT
@@ -125,7 +161,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
125
161
  version: '0'
126
162
  requirements: []
127
163
  rubyforge_project:
128
- rubygems_version: 2.4.6
164
+ rubygems_version: 2.6.7
129
165
  signing_key:
130
166
  specification_version: 4
131
167
  summary: Ops tools for managing servers