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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c73f05b9b5a61ff235488e23fa220891fd2281e4
4
- data.tar.gz: 70cf0fe1b126624c83593ff67cfbb92c65be25e4
3
+ metadata.gz: 4a0925b14a343babe5247c94f20f1ef10d0f7cdc
4
+ data.tar.gz: cfa144c5c85af5357ac99186455de196d6bf96a0
5
5
  SHA512:
6
- metadata.gz: 840eec430dfb549a6c08cb748fd5206020175f393e0cf65433da6605696fa687429f97963bb952e100a536e70b2847f83838a1c80949da87f538bfdc4791de94
7
- data.tar.gz: 638eb666e85c9728080285400417fdbc7467b79aca15bbd7f057b92225de425d718980426c809e9180f3a438bf9fcf0bfb552b95de75642bffc7d56834ac3023
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/local/bin/teamd-installer"]
9
+ ENTRYPOINT ["/usr/bin/teamd-installer"]
@@ -4,20 +4,36 @@ require "teamd/installer"
4
4
  module Teamd
5
5
  module Installer
6
6
  class Cli < Thor
7
- desc "discover","Gather local cluster/etcd information"
8
- method_option :interface, type: :string, default: "eth0"
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,13 @@
1
+ require "recursive-open-struct"
2
+ require "yaml"
3
+ module Teamd
4
+
5
+ module Installer
6
+ class CloudConfig < RecursiveOpenStruct
7
+ def to_yaml
8
+ "#cloud-config\n" + \
9
+ @table.to_yaml
10
+ end
11
+ end
12
+ end
13
+ 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,12 @@
1
+ require "teamd/installer/token_provider"
2
+ require "teamd/discover"
3
+
4
+ module Teamd
5
+ module Installer
6
+ class TeamdTokenProvider < TokenProvider
7
+ def self.token
8
+ Teamd::Discover.discover
9
+ end
10
+ end
11
+ end
12
+ 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
@@ -0,0 +1,9 @@
1
+ module Teamd
2
+ module Installer
3
+ class TokenProvider
4
+ def self.token
5
+ raise NotImplementedError.new
6
+ end
7
+ end
8
+ end
9
+ end
@@ -1,5 +1,5 @@
1
1
  module Teamd
2
2
  module Installer
3
- VERSION = "0.0.1"
3
+ VERSION = "0.0.2"
4
4
  end
5
5
  end
@@ -1,2 +1,13 @@
1
1
  require "teamd/installer/version"
2
- require "teamd/discover"
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
@@ -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.1
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: []