pero 0.1.8 → 0.4.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ead39fbc282e03a7035b106c0e00c0fd763a9753dbc8726fdf60c4f135632947
4
- data.tar.gz: 4acf8ddf945f939da41e9be7b0f0a4e1ea4f941d28824e8674771a5c1bf2af2c
3
+ metadata.gz: aceef1110ee7ca0f327637032d8c85072f81404b3ec82689f3acbf58653bec7c
4
+ data.tar.gz: c403a7d48a21536cbb38b48e88b683ccc6762c589ac16a29a92482b59657b89e
5
5
  SHA512:
6
- metadata.gz: 260feaad123a26da33a14abfa8869e693ae0dafc0fa85e6286468c43ffd3c93b79608e5e0792f7048bf5dd05aea88ca4cc160e6827b71699284c62d0fb4cc158
7
- data.tar.gz: 397a20a1d09cdaea967183770876fc2538c2c50729b98b7b2e4f1b4e8c254f294eafaaf75841408fe2121a6f41ac52cb521ea664fb830f1cb101cdcfb14dbc92
6
+ metadata.gz: 5e6bdbf09b67c5ebc60ec3098fc7e5df48fe31b9f8af7b6b5110fadb74d3e8ca8dd639496ce9a58d5a386e7758def6d921d5f3a6fd41d1da7239bda284e6c920
7
+ data.tar.gz: 51d394f061d6e4c04b3ad4a58ae70e9ec958e03a3f60739f12a83c7884da315c7c8245b76f5e75be38c242a3076154e7290b12765c4edf51bbfbab27cc48cae7
data/.gitignore CHANGED
@@ -6,3 +6,4 @@ run
6
6
  yaml
7
7
  log
8
8
  pkg
9
+ Gemfile.lock
data/Rakefile CHANGED
@@ -4,3 +4,8 @@ require "rspec/core/rake_task"
4
4
  RSpec::Core::RakeTask.new(:spec)
5
5
 
6
6
  task :default => :spec
7
+
8
+ task :build_docker do
9
+ puts `docker build -f ./misc/Dockerfile -t pyama/puppet:3.0.1 .`
10
+ puts `docker push pyama/puppet:3.0.1`
11
+ end
@@ -20,6 +20,7 @@ module Pero
20
20
  option :user, type: :string, aliases: ['-x'], desc: "ssh user"
21
21
  option :key, type: :string, aliases: ['-i'], desc: "ssh private key"
22
22
  option :port, type: :numeric, aliases: ['-p'], desc: "ssh port"
23
+ option "timeout", default: 10, type: :numeric, desc: "ssh connect timeout"
23
24
  option :ssh_config, type: :string, desc: "ssh config path"
24
25
  option :environment, type: :string, desc: "puppet environment"
25
26
  option :ask_password, type: :boolean, default: false, desc: "ask ssh or sudo password"
@@ -39,22 +40,38 @@ module Pero
39
40
 
40
41
  desc "apply", "puppet apply"
41
42
  shared_options
42
- option "server-version", type: :string, default: "6.12.0"
43
+ option "server-version", type: :string
44
+ option "image-name", type: :string
43
45
  option :noop, aliases: '-n', default: false, type: :boolean
46
+ option :test, aliases: '-t', default: false, type: :boolean
44
47
  option :verbose, aliases: '-v', default: true, type: :boolean
45
48
  option :tags, default: nil, type: :array
49
+ option :volumes, default: nil, type: :array
46
50
  option "one-shot", default: false, type: :boolean, desc: "stop puppet server after run"
47
51
  def apply(name_regexp)
52
+
53
+ if !options["image-name"] && !options["server-version"]
54
+ Pero.log.error "image-name or server-version are required"
55
+ return
56
+ end
57
+
48
58
  begin
49
59
  prepare
50
60
  nodes = Pero::History.search(name_regexp)
51
61
  return unless nodes
52
62
  Parallel.each(nodes, in_process: options["concurrent"]) do |n|
53
63
  opt = n["last_options"].merge(options)
64
+ opt["environment"] = "production" if opt["environment"].nil? || opt["environment"].empty?
65
+ if options["image-name"]
66
+ opt.delete("server-version")
67
+ else
68
+ opt.delete("image-name")
69
+ end
54
70
  puppet = Pero::Puppet.new(opt["host"], opt)
55
71
  puppet.apply
56
72
  end
57
73
  rescue => e
74
+ Pero.log.error e.backtrace.join("\n")
58
75
  Pero.log.error e.inspect
59
76
  end
60
77
  end
@@ -65,19 +82,23 @@ module Pero
65
82
  option "node-name", aliases: '-N', default: "", type: :string, desc: "json node name(default hostname)"
66
83
  def bootstrap(*hosts)
67
84
  begin
85
+ options["environment"] = "production" if options["environment"].nil? || options["environment"].empty?
68
86
  Parallel.each(hosts, in_process: options["concurrent"]) do |host|
69
- next if host =~ /^-/
87
+ raise "unknown option #{host}" if host =~ /^-/
70
88
  puppet = Pero::Puppet.new(host, options)
89
+
90
+ Pero.log.info "bootstrap pero #{host}"
71
91
  puppet.install
72
92
  end
73
93
  rescue => e
94
+ Pero.log.error e.backtrace.join("\n")
74
95
  Pero.log.error e.inspect
75
96
  end
76
97
  end
77
98
 
78
99
  no_commands do
79
100
  def prepare
80
- `bundle insatll` if File.exists?("Gemfile")
101
+ `bundle install` if File.exists?("Gemfile")
81
102
  `bundle exec librarian-puppet install` if File.exists?("Puppetfile")
82
103
  end
83
104
  end
@@ -4,16 +4,22 @@ require "retryable"
4
4
  require 'net/https'
5
5
  module Pero
6
6
  class Docker
7
- attr_reader :server_version
8
- def initialize(version, environment)
7
+ attr_reader :server_version, :image_name, :volumes
8
+ def initialize(version, image_name, environment, volumes)
9
9
  @server_version = version
10
+ @image_name = image_name
10
11
  @environment = environment
12
+ @volumes = volumes
11
13
  end
12
14
 
13
15
  def build
14
16
  Pero.log.info "start build container"
15
17
  begin
16
- image = ::Docker::Image.build(docker_file)
18
+ image = if image_name
19
+ ::Docker::Image.create('fromImage' => image_name)
20
+ else
21
+ ::Docker::Image.build(docker_file)
22
+ end
17
23
  rescue => e
18
24
  Pero.log.debug docker_file
19
25
  Pero.log.error "failed build container #{e.inspect}"
@@ -24,7 +30,7 @@ module Pero
24
30
  end
25
31
 
26
32
  def container_name
27
- "pero-#{server_version}-#{Digest::MD5.hexdigest(Dir.pwd)[0..5]}-#{@environment}"
33
+ "pero-#{Digest::MD5.hexdigest(Dir.pwd)[0..5]}-#{@environment}"
28
34
  end
29
35
 
30
36
  def find
@@ -35,7 +41,7 @@ module Pero
35
41
 
36
42
  def alerady_run?
37
43
  c = find
38
- c && c.info["State"] != "exited" && c
44
+ c && c.info["State"] == "running" && c.exec(['pkill', '-HUP', '-f', 'puppet-server']) && c
39
45
  end
40
46
 
41
47
  def run
@@ -43,39 +49,44 @@ module Pero
43
49
  c.delete(:force => true) if c.info["Names"].first == "/#{container_name}"
44
50
  end
45
51
 
52
+ vols = volumes || []
53
+ vols << "#{Dir.pwd}:/etc/puppetlabs/code/environments/#{@environment}"
54
+ vols << "#{Dir.pwd}/keys:/etc/puppetlabs/puppet/eyaml/"
55
+
46
56
  container = ::Docker::Container.create({
47
57
  'name' => container_name,
48
58
  'Hostname' => 'puppet',
49
59
  'Image' => build.id,
50
60
  'ExposedPorts' => { '8140/tcp' => {} },
61
+ 'HostConfig' => {
62
+ 'Binds' => vols,
63
+ 'PortBindings' => {
64
+ '8140/tcp' => [{ 'HostPort' => "0" }],
65
+ },
66
+ },
67
+ 'Cmd' => ["bash", "-c", "rm -rf #{conf_dir}/ssl/* && #{create_ca} && #{run_cmd}"]
51
68
  })
52
69
 
53
70
  Pero.log.info "start puppet master container"
54
- container.start(
55
- 'Binds' => [
56
- "#{Dir.pwd}:/etc/puppetlabs/code/environments/#{@environment}",
57
- "#{Dir.pwd}/keys:/etc/puppetlabs/puppet/eyaml/",
58
- ],
59
- 'PortBindings' => {
60
- '8140/tcp' => [{ 'HostPort' => "0" }],
61
- },
62
- )
71
+ container.start
63
72
 
64
73
  container = find
65
74
  raise "can't start container" unless container
66
75
  begin
67
76
  Retryable.retryable(tries: 20, sleep: 5) do
68
- https = Net::HTTP.new('localhost', container.info["Ports"].first["PublicPort"])
69
- https.use_ssl = true
70
- https.verify_mode = OpenSSL::SSL::VERIFY_NONE
71
- Pero.log.debug "start server health check"
72
- https.start {
73
- response = https.get('/')
74
- Pero.log.debug "puppet http response #{response}"
75
- }
76
- rescue => e
77
- Pero.log.debug e.inspect
78
- raise e
77
+ begin
78
+ https = Net::HTTP.new('localhost', container.info["Ports"].first["PublicPort"])
79
+ https.use_ssl = true
80
+ https.verify_mode = OpenSSL::SSL::VERIFY_NONE
81
+ Pero.log.debug "start server health check"
82
+ https.start {
83
+ response = https.get('/')
84
+ Pero.log.debug "puppet http response #{response}"
85
+ }
86
+ rescue => e
87
+ Pero.log.debug e.inspect
88
+ raise e
89
+ end
79
90
  end
80
91
  rescue
81
92
  Pero.log.error "can't start container.please check [ docker logs #{container.info["id"]} ]"
@@ -103,15 +114,28 @@ EOS
103
114
 
104
115
 
105
116
  end
117
+
118
+ def conf_dir
119
+ if Gem::Version.new("4.0.0") > Gem::Version.new(server_version)
120
+ "/etc/puppet"
121
+ elsif Gem::Version.new("5.0.0") > Gem::Version.new(server_version) && Gem::Version.new("4.0.0") <= Gem::Version.new(server_version)
122
+ "/etc/puppetlabs/puppet/"
123
+ elsif Gem::Version.new("6.0.0") > Gem::Version.new(server_version)&& Gem::Version.new("5.0.0") <= Gem::Version.new(server_version)
124
+ "/etc/puppetlabs/puppet/"
125
+ else
126
+ "/etc/puppetlabs/puppet/"
127
+ end
128
+ end
129
+
106
130
  def docker_file
107
- release_package,package_name, conf_dir = if Gem::Version.new("4.0.0") > Gem::Version.new(server_version)
108
- ["puppetlabs-release-el-#{el}.noarch.rpm", "puppet-server", "/etc/puppet"]
131
+ release_package,package_name = if Gem::Version.new("4.0.0") > Gem::Version.new(server_version)
132
+ ["puppetlabs-release-el-#{el}.noarch.rpm", "puppet-server"]
109
133
  elsif Gem::Version.new("5.0.0") > Gem::Version.new(server_version) && Gem::Version.new("4.0.0") <= Gem::Version.new(server_version)
110
- ["puppetlabs-release-pc1-el-#{el}.noarch.rpm", "puppetserver", "/etc/puppetlabs/puppet/"]
134
+ ["puppetlabs-release-pc1-el-#{el}.noarch.rpm", "puppetserver"]
111
135
  elsif Gem::Version.new("6.0.0") > Gem::Version.new(server_version)&& Gem::Version.new("5.0.0") <= Gem::Version.new(server_version)
112
- ["puppet5-release-el-#{el}.noarch.rpm", "puppetserver", "/etc/puppetlabs/puppet/"]
136
+ ["puppet5-release-el-#{el}.noarch.rpm", "puppetserver"]
113
137
  else
114
- ["puppet6-release-el-#{el}.noarch.rpm", "puppetserver", "/etc/puppetlabs/puppet/"]
138
+ ["puppet6-release-el-#{el}.noarch.rpm", "puppetserver"]
115
139
  end
116
140
 
117
141
  <<-EOS
@@ -121,7 +145,6 @@ rpm -ivh #{release_package}
121
145
  RUN yum install -y #{package_name}-#{server_version}
122
146
  ENV PATH $PATH:/opt/puppetlabs/bin
123
147
  RUN echo -e "#{puppet_config.split(/\n/).join("\\n")}" > #{conf_dir}/puppet.conf
124
- CMD bash -c "rm -rf #{conf_dir}/ssl/* && #{create_ca} && #{run_cmd}"
125
148
  EOS
126
149
  end
127
150
 
@@ -21,12 +21,13 @@ module Pero
21
21
  class History
22
22
  class Attribute
23
23
  def initialize(specinfra, options)
24
- name = if options["node-name"].empty?
24
+ name = if options["node-name"].nil? || options["node-name"].empty?
25
25
  specinfra.run_command("hostname").stdout.chomp
26
26
  else
27
27
  options["node-name"]
28
28
  end
29
29
  options.delete("noop")
30
+ options.delete("tags")
30
31
  @h = {
31
32
  name: name,
32
33
  last_options: options
@@ -53,6 +53,7 @@ module Pero
53
53
  opts[:password] = @options["password"] if @options["password"]
54
54
  opts[:keys] = [@options["key"]] if @options["key"]
55
55
  opts[:port] = @options["port"] if @options["port"]
56
+ opts[:timeout] = @options["timeout"] if @options["timeout"]
56
57
 
57
58
  if @options["vagrant"]
58
59
  config = Tempfile.new('', Dir.tmpdir)
@@ -78,7 +79,6 @@ module Pero
78
79
  end
79
80
 
80
81
  def install
81
- Pero.log.info "bootstrap pero"
82
82
  osi = specinfra.os_info
83
83
  os = case osi[:family]
84
84
  when "redhat"
@@ -108,7 +108,7 @@ module Pero
108
108
  end
109
109
 
110
110
  def run_container
111
- docker = Pero::Docker.new(@options["server-version"], @options["environment"])
111
+ docker = Pero::Docker.new(@options["server-version"], @options["image-name"], @options["environment"], @options["volumes"])
112
112
  docker.alerady_run? || docker.run
113
113
  end
114
114
 
@@ -123,11 +123,13 @@ module Pero
123
123
  mkdir -p `puppet config print ssldir` && mount --bind /tmp/puppet/#{tmpdir} `puppet config print ssldir` && \
124
124
  #{puppet_cmd}'"
125
125
  Pero.log.debug "run cmd:#{cmd}"
126
- ssh.exec!(specinfra.build_command(cmd)) do |channel, stream, data|
127
- Pero.log.info "#{host}:#{data.chomp}" if stream == :stdout && data.chomp != ""
128
- Pero.log.warn "#{host}:#{data.chomp}" if stream == :stderr && data.chomp != ""
129
- end
130
- ssh.exec!(specinfra.build_command("rm -rf /tmp/puppet/#{tmpdir}")) if @options["one-shot"]
126
+ ssh_exec(ssh, host, cmd)
127
+
128
+ if @options["one-shot"]
129
+ cmd = "/bin/rm -rf /tmp/puppet/#{tmpdir}"
130
+ ssh_exec(ssh, host, cmd)
131
+ end
132
+
131
133
  ssh.loop {true} if ENV['PERO_DEBUG']
132
134
  end
133
135
  rescue => e
@@ -138,17 +140,35 @@ module Pero
138
140
  Pero::History::Attribute.new(specinfra, @options).save
139
141
  end
140
142
 
143
+ def ssh_exec(ssh, host, cmd)
144
+ ssh.open_channel do |ch|
145
+ ch.request_pty
146
+ ch.on_data do |ch,data|
147
+ Pero.log.info "#{host}:#{data.chomp}"
148
+ end
149
+
150
+ ch.on_extended_data do |c,type,data|
151
+ Pero.log.error "#{host}:#{data.chomp}"
152
+ end
153
+
154
+ ch.exec specinfra.build_command(cmd) do |ch, success|
155
+ raise "could not execute #{cmd}" unless success
156
+ end
157
+ end
158
+ ssh.loop
159
+ end
160
+
141
161
  def puppet_cmd
142
162
  if Gem::Version.new("5.0.0") > Gem::Version.new(@options["agent-version"])
143
- "puppet agent --no-daemonize --onetime #{parse_puppet_option(@options)} --server localhost"
163
+ "puppet agent --no-daemonize --onetime #{parse_puppet_option(@options)} --ca_port 8140 --ca_server localhost --masterport 8140 --server localhost"
144
164
  else
145
- "/opt/puppetlabs/bin/puppet agent --no-daemonize --onetime #{parse_puppet_option(@options)} --server localhost"
165
+ "/opt/puppetlabs/bin/puppet agent --no-daemonize --onetime #{parse_puppet_option(@options)} --ca_server localhost --masterport 8140 --server localhost"
146
166
  end
147
167
  end
148
168
 
149
169
  def parse_puppet_option(options)
150
170
  ret = ""
151
- %w(noop verbose).each do |n|
171
+ %w(noop verbose test).each do |n|
152
172
  ret << " --#{n}" if options[n]
153
173
  end
154
174
  ret << " --tags #{options["tags"].join(",")}" if options["tags"]
@@ -1,3 +1,3 @@
1
1
  module Pero
2
- VERSION = "0.1.8"
2
+ VERSION = "0.4.1"
3
3
  end
@@ -0,0 +1,11 @@
1
+ FROM centos:6
2
+ RUN yum -y install curl epel-release
3
+ RUN rpm -ivh https://yum.puppetlabs.com/el/6/products/x86_64/puppetlabs-release-6-12.noarch.rpm
4
+ RUN curl -O http://software.exogeni.net/repo/puppet/6/products/x86_64/puppet-server-3.0.1-1.el6.noarch.rpm && \
5
+ curl -O http://software.exogeni.net/repo/puppet/6/products/x86_64/puppet-3.0.1-1.el6.noarch.rpm && \
6
+ yum -y install puppet-3.0.1-1.el6.noarch.rpm puppet-server-3.0.1-1.el6.noarch.rpm
7
+ RUN mkdir -p /etc/puppetlabs/code/environments/production
8
+
9
+ RUN echo -e "[master]\nvardir= /var/puppet\nmanifestdir = /var/puppet/data/manifests\n templatedir = /var/puppet/data/templates\n modulepath = /var/puppet/data/modules:/var/puppet/data/roles:/var/puppet/data/vendor/modules\nlogdir = /var/log/puppet\n rundir = /var/run/puppet\n ssldir = /var/puppet/ssl\n" > /etc/puppet/puppet.conf
10
+
11
+ CMD bash -c "rm -rf /etc/puppet/ssl/* && puppet cert generate `hostname` --dns_alt_names localhost,127.0.0.1 && echo '*' > /etc/puppet/autosign.conf && puppet master --no-daemonize --verbose"
@@ -30,7 +30,7 @@ Gem::Specification.new do |spec|
30
30
  spec.add_dependency 'retryable'
31
31
  spec.add_dependency 'specinfra'
32
32
  spec.add_dependency 'parallel'
33
- spec.add_development_dependency "bundler", "~> 1.17"
34
- spec.add_development_dependency "rake", "~> 10.0"
33
+ spec.add_development_dependency "bundler"
34
+ spec.add_development_dependency "rake"
35
35
  spec.add_development_dependency "rspec", "~> 3.0"
36
36
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pero
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.8
4
+ version: 0.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - pyama86
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-08-26 00:00:00.000000000 Z
11
+ date: 2021-01-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -112,30 +112,30 @@ dependencies:
112
112
  name: bundler
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
- - - "~>"
115
+ - - ">="
116
116
  - !ruby/object:Gem::Version
117
- version: '1.17'
117
+ version: '0'
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
- - - "~>"
122
+ - - ">="
123
123
  - !ruby/object:Gem::Version
124
- version: '1.17'
124
+ version: '0'
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: rake
127
127
  requirement: !ruby/object:Gem::Requirement
128
128
  requirements:
129
- - - "~>"
129
+ - - ">="
130
130
  - !ruby/object:Gem::Version
131
- version: '10.0'
131
+ version: '0'
132
132
  type: :development
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
- - - "~>"
136
+ - - ">="
137
137
  - !ruby/object:Gem::Version
138
- version: '10.0'
138
+ version: '0'
139
139
  - !ruby/object:Gem::Dependency
140
140
  name: rspec
141
141
  requirement: !ruby/object:Gem::Requirement
@@ -160,7 +160,6 @@ extra_rdoc_files: []
160
160
  files:
161
161
  - ".gitignore"
162
162
  - Gemfile
163
- - Gemfile.lock
164
163
  - LICENSE.txt
165
164
  - README.md
166
165
  - Rakefile
@@ -179,6 +178,7 @@ files:
179
178
  - lib/pero/puppet/redhat.rb
180
179
  - lib/pero/ssh_executable.rb
181
180
  - lib/pero/version.rb
181
+ - misc/Dockerfile
182
182
  - pero.gemspec
183
183
  homepage: https://github.com/pyama86/pero
184
184
  licenses:
@@ -199,7 +199,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
199
199
  - !ruby/object:Gem::Version
200
200
  version: '0'
201
201
  requirements: []
202
- rubygems_version: 3.0.6
202
+ rubygems_version: 3.1.2
203
203
  signing_key:
204
204
  specification_version: 4
205
205
  summary: tool for puppet apply from our desktop.
@@ -1,61 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- pero (0.1.6)
5
- docker-api
6
- logger
7
- net-ssh
8
- parallel
9
- retryable
10
- specinfra
11
- thor
12
-
13
- GEM
14
- remote: https://rubygems.org/
15
- specs:
16
- diff-lcs (1.4.4)
17
- docker-api (1.34.2)
18
- excon (>= 0.47.0)
19
- multi_json
20
- excon (0.76.0)
21
- logger (1.4.2)
22
- multi_json (1.15.0)
23
- net-scp (3.0.0)
24
- net-ssh (>= 2.6.5, < 7.0.0)
25
- net-ssh (6.1.0)
26
- net-telnet (0.1.1)
27
- parallel (1.19.2)
28
- rake (10.5.0)
29
- retryable (3.0.5)
30
- rspec (3.9.0)
31
- rspec-core (~> 3.9.0)
32
- rspec-expectations (~> 3.9.0)
33
- rspec-mocks (~> 3.9.0)
34
- rspec-core (3.9.2)
35
- rspec-support (~> 3.9.3)
36
- rspec-expectations (3.9.2)
37
- diff-lcs (>= 1.2.0, < 2.0)
38
- rspec-support (~> 3.9.0)
39
- rspec-mocks (3.9.1)
40
- diff-lcs (>= 1.2.0, < 2.0)
41
- rspec-support (~> 3.9.0)
42
- rspec-support (3.9.3)
43
- sfl (2.3)
44
- specinfra (2.82.19)
45
- net-scp
46
- net-ssh (>= 2.7)
47
- net-telnet (= 0.1.1)
48
- sfl
49
- thor (1.0.1)
50
-
51
- PLATFORMS
52
- ruby
53
-
54
- DEPENDENCIES
55
- bundler (~> 1.17)
56
- pero!
57
- rake (~> 10.0)
58
- rspec (~> 3.0)
59
-
60
- BUNDLED WITH
61
- 1.17.3