teamd-installer 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Dockerfile +2 -2
- data/lib/teamd/installer/cli.rb +24 -8
- data/lib/teamd/installer/cloud_config.rb +13 -0
- data/lib/teamd/installer/disk.rb +20 -0
- data/lib/teamd/installer/etcd_token_provider.rb +13 -0
- data/lib/teamd/installer/interfaces.rb +30 -0
- data/lib/teamd/installer/script.rb +21 -0
- data/lib/teamd/installer/teamd_token_provider.rb +12 -0
- data/lib/teamd/installer/template_config.rb +73 -0
- data/lib/teamd/installer/token_provider.rb +9 -0
- data/lib/teamd/installer/version.rb +1 -1
- data/lib/teamd/installer.rb +12 -1
- data/shared/teamd-discover.service +15 -0
- data/teamd-installer.gemspec +2 -1
- metadata +24 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4a0925b14a343babe5247c94f20f1ef10d0f7cdc
|
4
|
+
data.tar.gz: cfa144c5c85af5357ac99186455de196d6bf96a0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f85d8990388f0ce4ced77b928d65d96afd6a8025ec83ddc17e5d0c095717205fe120fc0c95215c17f607f44f7f272c4a53c34111e48d93bb37a2291d093b10e7
|
7
|
+
data.tar.gz: df382fde23f3f7f12ca4c86419d43a01def194a0b8a5fddc688b68cc1cd5d1c89fd0d74c5c2ad2353effc423cb09b92edc2fa10cf601bc2d61d7d1946315ede6
|
data/Dockerfile
CHANGED
@@ -2,8 +2,8 @@ FROM alpine:3.1
|
|
2
2
|
MAINTAINER Mathias Kaufmann <me@stei.gr>
|
3
3
|
|
4
4
|
RUN apk update && \
|
5
|
-
apk add ruby ca-certificates && \
|
5
|
+
apk add ruby ruby-dev ca-certificates bash wget gnupg && \
|
6
6
|
gem update --system --no-ri --no-rdoc && \
|
7
7
|
gem install --no-ri --no-rdoc teamd-installer
|
8
8
|
|
9
|
-
ENTRYPOINT ["/usr/
|
9
|
+
ENTRYPOINT ["/usr/bin/teamd-installer"]
|
data/lib/teamd/installer/cli.rb
CHANGED
@@ -4,20 +4,36 @@ require "teamd/installer"
|
|
4
4
|
module Teamd
|
5
5
|
module Installer
|
6
6
|
class Cli < Thor
|
7
|
-
|
8
|
-
|
9
|
-
def discover
|
10
|
-
@peer = Teamd::Discover::Peer.new
|
11
|
-
@peer.discover
|
12
|
-
end
|
13
|
-
|
14
|
-
desc "install","Run CoreOS installer"
|
7
|
+
default_task :install
|
8
|
+
desc "install","Install CoreOS"
|
15
9
|
method_option :etcd_discovery_id, type: :string
|
16
10
|
method_option :private_interface, type: :string, default: "eth0"
|
17
11
|
method_option :public_interface, type: :string, default: "eth1"
|
18
12
|
method_option :etcd_initialize_cluster, type: :boolean, default: :false
|
19
13
|
method_option :etcd_cluster_size, type: :numeric, default: 3
|
14
|
+
method_option :installer_url, type: :string, default: "https://raw.githubusercontent.com/coreos/init/master/bin/coreos-install"
|
15
|
+
method_option :cloud_config, type: :string, default: "/tmp/user_data"
|
16
|
+
method_option :installer_script, type: :string, default: "/tmp/installer"
|
20
17
|
def install
|
18
|
+
@token ||= options[:etcd_discovery_id]
|
19
|
+
@token ||= TeamdTokenProvider.token
|
20
|
+
@token ||= EtcdTokenProvider.token
|
21
|
+
@public_ipv4 ||= Interfaces.default_ipv4
|
22
|
+
@private_ipv4 ||= Interfaces.internal_ipv4 except: ["127.0.0.1",@public_ipv4]
|
23
|
+
@config = TemplateConfig.new
|
24
|
+
@config.etcd_discovery_id = @token
|
25
|
+
@config.public_ipv4 = @public_ipv4
|
26
|
+
@config.private_ipv4 = @private_ipv4
|
27
|
+
@config.use_flannel = true
|
28
|
+
@config.docker_tcp = true
|
29
|
+
@config.sshd_port = 2220
|
30
|
+
@config = CloudConfig.new @config.to_h
|
31
|
+
File.write(options[:cloud_config],@config.to_yaml)
|
32
|
+
@installer = Script.download options[:installer_url]
|
33
|
+
@disk,@major,@minor = Disk.default
|
34
|
+
Disk.create @disk, @major, @minor
|
35
|
+
Script.store options[:installer_script],@installer
|
36
|
+
Script.run options[:installer_script],"-d",@disk,"-C",(ENV["GROUP"] || "stable"),"-c",options[:cloud_config]
|
21
37
|
end
|
22
38
|
end
|
23
39
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Teamd
|
2
|
+
module Installer
|
3
|
+
class Disk
|
4
|
+
class << self
|
5
|
+
def default
|
6
|
+
disk_description = `lsblk -n -r -e 1,7`.split("\n").map{|l|l.split(" ")}.select{|e|e.last == "disk"}.first
|
7
|
+
disk = disk_description[0]
|
8
|
+
major = disk_description[1].split(":")[0]
|
9
|
+
minor = disk_description[1].split(":")[1]
|
10
|
+
return disk,major,minor
|
11
|
+
end
|
12
|
+
def create device="/dev/sda", major=8, minor=0
|
13
|
+
cmd = "mknod -m 0600 #{device} b #{major} #{minor}"
|
14
|
+
puts cmd
|
15
|
+
`#{cmd}`
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require "teamd/installer/token_provider"
|
2
|
+
require "open-uri"
|
3
|
+
|
4
|
+
module Teamd
|
5
|
+
module Installer
|
6
|
+
class EtcdTokenProvider < TokenProvider
|
7
|
+
PROVIDER_URL = "https://discovery.etcd.io/new?size=1"
|
8
|
+
def self.token
|
9
|
+
URI(open(PROVIDER_URL).read).path[1..-1]
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require "socket"
|
2
|
+
|
3
|
+
module Teamd
|
4
|
+
module Installer
|
5
|
+
class Interfaces
|
6
|
+
class << self
|
7
|
+
def default_ipv4
|
8
|
+
begin
|
9
|
+
orig, Socket.do_not_reverse_lookup = Socket.do_not_reverse_lookup, true
|
10
|
+
UDPSocket.open do |s|
|
11
|
+
s.connect '8.8.8.8',1
|
12
|
+
s.addr.last
|
13
|
+
end
|
14
|
+
ensure
|
15
|
+
Socket.do_not_reverse_lookup = orig
|
16
|
+
end
|
17
|
+
end
|
18
|
+
def internal_ipv4 except:[]
|
19
|
+
Socket.getifaddrs.select do |ia|
|
20
|
+
ia.addr.pfamily == Socket::AF_INET
|
21
|
+
end.collect do |ia|
|
22
|
+
ia.addr.ip_address
|
23
|
+
end.reject do |ip|
|
24
|
+
except.include? ip
|
25
|
+
end.first
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require "open-uri"
|
2
|
+
require "fileutils"
|
3
|
+
|
4
|
+
module Teamd
|
5
|
+
module Installer
|
6
|
+
module Script
|
7
|
+
class << self
|
8
|
+
def download url
|
9
|
+
open(url).read
|
10
|
+
end
|
11
|
+
def store path, content
|
12
|
+
File.write path,content
|
13
|
+
FileUtils.chmod 0755,path
|
14
|
+
end
|
15
|
+
def run *args
|
16
|
+
puts args.join(" ")
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
require "securerandom"
|
2
|
+
|
3
|
+
module Teamd
|
4
|
+
module Installer
|
5
|
+
class TemplateConfig
|
6
|
+
attr_accessor :etcd_discovery_id, :public_ipv4, :private_ipv4, :public_ipv6, :private_ipv6, :use_flannel, :docker_tcp, :sshd_port
|
7
|
+
def to_h
|
8
|
+
output = {
|
9
|
+
"coreos" => {
|
10
|
+
"etcd" => {
|
11
|
+
"discovery" => @etcd_discovery_id,
|
12
|
+
},
|
13
|
+
"units" => [],
|
14
|
+
},
|
15
|
+
"write_files" => [],
|
16
|
+
"hostname" => SecureRandom.hex(8),
|
17
|
+
"manage_etc_hosts" => "localhost",
|
18
|
+
}
|
19
|
+
output["write_files"] << {
|
20
|
+
"path" => "/run/teamd/etcd.env",
|
21
|
+
"permissions" => "0444",
|
22
|
+
"owner" => "root",
|
23
|
+
"content" => "ETCD_DISCOVERY=https://discovery.etcd.io/#{@etcd_discovery_id}\n"
|
24
|
+
}
|
25
|
+
output["coreos"]["units"] << {
|
26
|
+
"name" => "teamd-zookeeper.service",
|
27
|
+
"command" => "start",
|
28
|
+
"content" => "[Unit]\nDescription=Teamd Local Discover Publisher\nDocumentation=https://teamd.stei.gr/discover\nConditionPathExists=/run/teamd/etcd.env\nRequires=early-docker.service\nAfter=etcd.service etcd2.service early-docker.service\nBefore=early-docker.target\n\n[Service]\nRestart=always\nRestartSec=5\nEnvironment=\"DOCKER_HOST=unix:///var/run/early-docker.sock\"\nExecStart=/usr/bin/docker run --net=host --privileged=true --rm \\\n --env-file=/run/teamd/etcd.env \\\n registry.hub.docker.com/steigr/teamd-discover",
|
29
|
+
}
|
30
|
+
output["coreos"]["units"] << {
|
31
|
+
"name" => "docker.service",
|
32
|
+
"command" => "start"
|
33
|
+
}
|
34
|
+
output["ssh_authorized_keys"] = [
|
35
|
+
File.read("/proc/cmdline").scan(/sshkey="([^"]+)"/).first.first
|
36
|
+
]
|
37
|
+
if @sshd_port
|
38
|
+
output["coreos"]["units"] << {
|
39
|
+
"name" => "sshd.socket",
|
40
|
+
"command" => "restart",
|
41
|
+
"content" => "[Socket]\nListenStream=#{@sshd_port}\nAccept=yes",
|
42
|
+
}
|
43
|
+
end
|
44
|
+
if @public_ipv4 or @private_ipv4
|
45
|
+
content = ""
|
46
|
+
content << "COREOS_PUBLIC_IPV4=#{@public_ipv4}\n" if @public_ipv4
|
47
|
+
content << "COREOS_PRIVATE_IPV4=#{@private_ipv4}\n" if @private_ipv4
|
48
|
+
output["write_files"] << {
|
49
|
+
"path" => "/etc/environment",
|
50
|
+
"permissions" => "0444",
|
51
|
+
"owner" => "root",
|
52
|
+
"content" => content
|
53
|
+
}
|
54
|
+
end
|
55
|
+
if @use_flannel
|
56
|
+
output["coreos"]["units"] << {
|
57
|
+
"name" => "flanneld.service",
|
58
|
+
"command" => "start"
|
59
|
+
}
|
60
|
+
end
|
61
|
+
if @docker_tcp
|
62
|
+
output["coreos"]["units"] << {
|
63
|
+
"name" => "docker-tcp.socket",
|
64
|
+
"command" => "start",
|
65
|
+
"enable" => true,
|
66
|
+
"content" => "[Unit]\nDescription=Docker Socket for the API\n[Socket]\nListenStream=2375\nBindIPv6Only=both\nService=docker.service\n\n[Install]\nWantedBy=sockets.target"
|
67
|
+
}
|
68
|
+
end
|
69
|
+
output
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
data/lib/teamd/installer.rb
CHANGED
@@ -1,2 +1,13 @@
|
|
1
1
|
require "teamd/installer/version"
|
2
|
-
|
2
|
+
|
3
|
+
require "teamd/installer/teamd_token_provider"
|
4
|
+
require "teamd/installer/etcd_token_provider"
|
5
|
+
|
6
|
+
require "teamd/installer/interfaces"
|
7
|
+
|
8
|
+
require "teamd/installer/script"
|
9
|
+
|
10
|
+
require "teamd/installer/disk"
|
11
|
+
|
12
|
+
require "teamd/installer/template_config"
|
13
|
+
require "teamd/installer/cloud_config"
|
@@ -0,0 +1,15 @@
|
|
1
|
+
[Unit]
|
2
|
+
Description=Teamd Local Discover Publisher
|
3
|
+
Documentation=https://teamd.stei.gr/discover
|
4
|
+
ConditionPathExists=/run/teamd/etcd.env
|
5
|
+
Requires=early-docker.service
|
6
|
+
After=etcd.service etcd2.service early-docker.service
|
7
|
+
Before=early-docker.target
|
8
|
+
|
9
|
+
[Service]
|
10
|
+
Restart=always
|
11
|
+
RestartSec=5
|
12
|
+
Environment="DOCKER_HOST=unix:///var/run/early-docker.sock"
|
13
|
+
ExecStart=/usr/bin/docker run --net=host --privileged=true --rm \
|
14
|
+
--env-file=/run/teamd/etcd.env \
|
15
|
+
registry.hub.docker.com/steigr/teamd-discover
|
data/teamd-installer.gemspec
CHANGED
@@ -20,7 +20,8 @@ Gem::Specification.new do |spec|
|
|
20
20
|
|
21
21
|
spec.add_dependency "thor"
|
22
22
|
spec.add_dependency "bundler", "~> 1.9"
|
23
|
-
spec.add_dependency "teamd-discover"
|
23
|
+
spec.add_dependency "teamd-discover", "~> 0.3"
|
24
|
+
spec.add_dependency "recursive-open-struct"
|
24
25
|
|
25
26
|
spec.add_development_dependency "pry"
|
26
27
|
spec.add_development_dependency "rake", "~> 10.0"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: teamd-installer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mathias Kaufmann
|
@@ -40,6 +40,20 @@ dependencies:
|
|
40
40
|
version: '1.9'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: teamd-discover
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0.3'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0.3'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: recursive-open-struct
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
44
58
|
requirements:
|
45
59
|
- - ">="
|
@@ -100,7 +114,16 @@ files:
|
|
100
114
|
- exe/teamd-installer
|
101
115
|
- lib/teamd/installer.rb
|
102
116
|
- lib/teamd/installer/cli.rb
|
117
|
+
- lib/teamd/installer/cloud_config.rb
|
118
|
+
- lib/teamd/installer/disk.rb
|
119
|
+
- lib/teamd/installer/etcd_token_provider.rb
|
120
|
+
- lib/teamd/installer/interfaces.rb
|
121
|
+
- lib/teamd/installer/script.rb
|
122
|
+
- lib/teamd/installer/teamd_token_provider.rb
|
123
|
+
- lib/teamd/installer/template_config.rb
|
124
|
+
- lib/teamd/installer/token_provider.rb
|
103
125
|
- lib/teamd/installer/version.rb
|
126
|
+
- shared/teamd-discover.service
|
104
127
|
- teamd-installer.gemspec
|
105
128
|
homepage: https://teamd.stei.gr/installer
|
106
129
|
licenses: []
|