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 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: []