teamd-installer 0.0.1 → 0.0.2
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/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: []
|