pero 0.1.9 → 0.2.0
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 +4 -4
- data/Gemfile.lock +1 -1
- data/Rakefile +5 -0
- data/lib/pero/cli.rb +20 -3
- data/lib/pero/docker.rb +14 -8
- data/lib/pero/history.rb +1 -0
- data/lib/pero/puppet.rb +30 -10
- data/lib/pero/version.rb +1 -1
- data/misc/Dockerfile +11 -0
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d2cd510f50571a49f36a9d83b33b6ec102c2ec31dce18ee08223b96d9767a867
|
4
|
+
data.tar.gz: a576229ec962f9359956f787591b3c14b7d6a779fae2224d06181f4508adb573
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: de370da8d84760e9c441630e123ecce5af27fb52af670b9edc16ba62b14b4bdc4b156b343c0ba8f764dc3203cfa3eb5b6ffc9a0d6b17efaa5982e31f68e42e22
|
7
|
+
data.tar.gz: 743fc365959f454d404d11faf1dda6d4c89242e2e4b054d137c5887befc7fb027c5c56345f6bfc164db4c19e8081d27563e8b19bdcd117d6e1a0ea070940da88
|
data/Gemfile.lock
CHANGED
data/Rakefile
CHANGED
data/lib/pero/cli.rb
CHANGED
@@ -20,8 +20,9 @@ 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
|
-
option :environment, type: :string, desc: "puppet environment"
|
25
|
+
option :environment, type: :string, desc: "puppet environment", default: "production"
|
25
26
|
option :ask_password, type: :boolean, default: false, desc: "ask ssh or sudo password"
|
26
27
|
option :vagrant, type: :boolean, default: false, desc: "use vagrarant"
|
27
28
|
option :sudo, type: :boolean, default: true, desc: "use sudo"
|
@@ -39,18 +40,32 @@ module Pero
|
|
39
40
|
|
40
41
|
desc "apply", "puppet apply"
|
41
42
|
shared_options
|
42
|
-
option "server-version", type: :string
|
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
|
+
if options["image-name"]
|
65
|
+
opt.delete("server-version")
|
66
|
+
else
|
67
|
+
opt.delete("image-name")
|
68
|
+
end
|
54
69
|
puppet = Pero::Puppet.new(opt["host"], opt)
|
55
70
|
puppet.apply
|
56
71
|
end
|
@@ -66,8 +81,10 @@ module Pero
|
|
66
81
|
def bootstrap(*hosts)
|
67
82
|
begin
|
68
83
|
Parallel.each(hosts, in_process: options["concurrent"]) do |host|
|
69
|
-
|
84
|
+
raise "unknown option #{host}" if host =~ /^-/
|
70
85
|
puppet = Pero::Puppet.new(host, options)
|
86
|
+
|
87
|
+
Pero.log.info "bootstrap pero #{host}"
|
71
88
|
puppet.install
|
72
89
|
end
|
73
90
|
rescue => e
|
data/lib/pero/docker.rb
CHANGED
@@ -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 =
|
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-#{
|
33
|
+
"pero-#{Digest::MD5.hexdigest(Dir.pwd)[0..5]}-#{@environment}"
|
28
34
|
end
|
29
35
|
|
30
36
|
def find
|
@@ -51,11 +57,11 @@ module Pero
|
|
51
57
|
})
|
52
58
|
|
53
59
|
Pero.log.info "start puppet master container"
|
60
|
+
vols = volumes || []
|
61
|
+
vols << "#{Dir.pwd}:/etc/puppetlabs/code/environments/#{@environment}"
|
62
|
+
vols << "#{Dir.pwd}/keys:/etc/puppetlabs/puppet/eyaml/"
|
54
63
|
container.start(
|
55
|
-
'Binds' =>
|
56
|
-
"#{Dir.pwd}:/etc/puppetlabs/code/environments/#{@environment}",
|
57
|
-
"#{Dir.pwd}/keys:/etc/puppetlabs/puppet/eyaml/",
|
58
|
-
],
|
64
|
+
'Binds' => vols,
|
59
65
|
'PortBindings' => {
|
60
66
|
'8140/tcp' => [{ 'HostPort' => "0" }],
|
61
67
|
},
|
data/lib/pero/history.rb
CHANGED
data/lib/pero/puppet.rb
CHANGED
@@ -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
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
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"]
|
data/lib/pero/version.rb
CHANGED
data/misc/Dockerfile
ADDED
@@ -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"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pero
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- pyama86
|
@@ -179,6 +179,7 @@ files:
|
|
179
179
|
- lib/pero/puppet/redhat.rb
|
180
180
|
- lib/pero/ssh_executable.rb
|
181
181
|
- lib/pero/version.rb
|
182
|
+
- misc/Dockerfile
|
182
183
|
- pero.gemspec
|
183
184
|
homepage: https://github.com/pyama86/pero
|
184
185
|
licenses:
|