central-cli 0.6.3

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.
Files changed (259) hide show
  1. checksums.yaml +7 -0
  2. data/.dockerignore +3 -0
  3. data/.gitignore +15 -0
  4. data/.rspec +6 -0
  5. data/.rubocop.yml +5 -0
  6. data/Dockerfile +15 -0
  7. data/Gemfile +10 -0
  8. data/LICENSE +191 -0
  9. data/README.md +39 -0
  10. data/Rakefile +9 -0
  11. data/VERSION +1 -0
  12. data/bin/cm +85 -0
  13. data/central-cli.gemspec +35 -0
  14. data/central-docker.sh +6 -0
  15. data/lib/central/cli/app_command.rb +29 -0
  16. data/lib/central/cli/apps/build_command.rb +24 -0
  17. data/lib/central/cli/apps/central_yml_generator.rb +88 -0
  18. data/lib/central/cli/apps/common.rb +166 -0
  19. data/lib/central/cli/apps/deploy_command.rb +191 -0
  20. data/lib/central/cli/apps/docker_compose_generator.rb +48 -0
  21. data/lib/central/cli/apps/docker_helper.rb +85 -0
  22. data/lib/central/cli/apps/dockerfile_generator.rb +15 -0
  23. data/lib/central/cli/apps/init_command.rb +91 -0
  24. data/lib/central/cli/apps/list_command.rb +68 -0
  25. data/lib/central/cli/apps/logs_command.rb +76 -0
  26. data/lib/central/cli/apps/monitor_command.rb +93 -0
  27. data/lib/central/cli/apps/remove_command.rb +80 -0
  28. data/lib/central/cli/apps/restart_command.rb +38 -0
  29. data/lib/central/cli/apps/scale_command.rb +31 -0
  30. data/lib/central/cli/apps/show_command.rb +23 -0
  31. data/lib/central/cli/apps/start_command.rb +39 -0
  32. data/lib/central/cli/apps/stop_command.rb +39 -0
  33. data/lib/central/cli/auth/aws/create_command.rb +34 -0
  34. data/lib/central/cli/auth/aws_command.rb +7 -0
  35. data/lib/central/cli/auth/list_command.rb +28 -0
  36. data/lib/central/cli/auth_command.rb +9 -0
  37. data/lib/central/cli/bytes_helper.rb +38 -0
  38. data/lib/central/cli/common.rb +148 -0
  39. data/lib/central/cli/container_command.rb +10 -0
  40. data/lib/central/cli/containers/exec_command.rb +21 -0
  41. data/lib/central/cli/containers/inspect_command.rb +22 -0
  42. data/lib/central/cli/etcd/common.rb +7 -0
  43. data/lib/central/cli/etcd/get_command.rb +26 -0
  44. data/lib/central/cli/etcd/list_command.rb +31 -0
  45. data/lib/central/cli/etcd/mkdir_command.rb +21 -0
  46. data/lib/central/cli/etcd/remove_command.rb +25 -0
  47. data/lib/central/cli/etcd/set_command.rb +22 -0
  48. data/lib/central/cli/etcd_command.rb +16 -0
  49. data/lib/central/cli/external_registries/add_command.rb +21 -0
  50. data/lib/central/cli/external_registries/delete_command.rb +15 -0
  51. data/lib/central/cli/external_registries/list_command.rb +27 -0
  52. data/lib/central/cli/external_registries/remove_command.rb +13 -0
  53. data/lib/central/cli/external_registry_command.rb +14 -0
  54. data/lib/central/cli/login_command.rb +121 -0
  55. data/lib/central/cli/logout_command.rb +7 -0
  56. data/lib/central/cli/master/aws/create_command.rb +41 -0
  57. data/lib/central/cli/master/aws_command.rb +7 -0
  58. data/lib/central/cli/master/azure/create_command.rb +39 -0
  59. data/lib/central/cli/master/azure_command.rb +11 -0
  60. data/lib/central/cli/master/digital_ocean/create_command.rb +35 -0
  61. data/lib/central/cli/master/digital_ocean_command.rb +11 -0
  62. data/lib/central/cli/master/list_command.rb +28 -0
  63. data/lib/central/cli/master/use_command.rb +34 -0
  64. data/lib/central/cli/master/users/add_role_command.rb +26 -0
  65. data/lib/central/cli/master/users/invite_command.rb +24 -0
  66. data/lib/central/cli/master/users/list_command.rb +18 -0
  67. data/lib/central/cli/master/users/remove_command.rb +22 -0
  68. data/lib/central/cli/master/users/remove_role_command.rb +25 -0
  69. data/lib/central/cli/master/users_command.rb +15 -0
  70. data/lib/central/cli/master/vagrant/create_command.rb +25 -0
  71. data/lib/central/cli/master/vagrant/restart_command.rb +20 -0
  72. data/lib/central/cli/master/vagrant/ssh_command.rb +15 -0
  73. data/lib/central/cli/master/vagrant/start_command.rb +20 -0
  74. data/lib/central/cli/master/vagrant/stop_command.rb +20 -0
  75. data/lib/central/cli/master/vagrant/terminate_command.rb +13 -0
  76. data/lib/central/cli/master/vagrant_command.rb +21 -0
  77. data/lib/central/cli/master_command.rb +19 -0
  78. data/lib/central/cli/node_command.rb +30 -0
  79. data/lib/central/cli/nodes/add_label_command.rb +19 -0
  80. data/lib/central/cli/nodes/aws/create_command.rb +40 -0
  81. data/lib/central/cli/nodes/aws/restart_command.rb +29 -0
  82. data/lib/central/cli/nodes/aws/terminate_command.rb +21 -0
  83. data/lib/central/cli/nodes/aws_command.rb +14 -0
  84. data/lib/central/cli/nodes/azure/create_command.rb +40 -0
  85. data/lib/central/cli/nodes/azure/restart_command.rb +31 -0
  86. data/lib/central/cli/nodes/azure/terminate_command.rb +21 -0
  87. data/lib/central/cli/nodes/azure_command.rb +14 -0
  88. data/lib/central/cli/nodes/digital_ocean/create_command.rb +32 -0
  89. data/lib/central/cli/nodes/digital_ocean/restart_command.rb +27 -0
  90. data/lib/central/cli/nodes/digital_ocean/terminate_command.rb +19 -0
  91. data/lib/central/cli/nodes/digital_ocean_command.rb +14 -0
  92. data/lib/central/cli/nodes/label_command.rb +12 -0
  93. data/lib/central/cli/nodes/labels/add_command.rb +19 -0
  94. data/lib/central/cli/nodes/labels/remove_command.rb +23 -0
  95. data/lib/central/cli/nodes/list_command.rb +62 -0
  96. data/lib/central/cli/nodes/remove_command.rb +16 -0
  97. data/lib/central/cli/nodes/remove_label_command.rb +23 -0
  98. data/lib/central/cli/nodes/show_command.rb +49 -0
  99. data/lib/central/cli/nodes/ssh_command.rb +31 -0
  100. data/lib/central/cli/nodes/update_command.rb +20 -0
  101. data/lib/central/cli/nodes/vagrant/create_command.rb +27 -0
  102. data/lib/central/cli/nodes/vagrant/restart_command.rb +26 -0
  103. data/lib/central/cli/nodes/vagrant/ssh_command.rb +21 -0
  104. data/lib/central/cli/nodes/vagrant/start_command.rb +26 -0
  105. data/lib/central/cli/nodes/vagrant/stop_command.rb +26 -0
  106. data/lib/central/cli/nodes/vagrant/terminate_command.rb +17 -0
  107. data/lib/central/cli/nodes/vagrant_command.rb +20 -0
  108. data/lib/central/cli/register_command.rb +21 -0
  109. data/lib/central/cli/registry/create_command.rb +144 -0
  110. data/lib/central/cli/registry/delete_command.rb +22 -0
  111. data/lib/central/cli/registry/remove_command.rb +19 -0
  112. data/lib/central/cli/registry_command.rb +11 -0
  113. data/lib/central/cli/service_command.rb +49 -0
  114. data/lib/central/cli/services/add_env_command.rb +19 -0
  115. data/lib/central/cli/services/add_secret_command.rb +24 -0
  116. data/lib/central/cli/services/container_command.rb +8 -0
  117. data/lib/central/cli/services/containers_command.rb +32 -0
  118. data/lib/central/cli/services/create_command.rb +90 -0
  119. data/lib/central/cli/services/delete_command.rb +19 -0
  120. data/lib/central/cli/services/deploy_command.rb +21 -0
  121. data/lib/central/cli/services/env_command.rb +11 -0
  122. data/lib/central/cli/services/envs/add_command.rb +19 -0
  123. data/lib/central/cli/services/envs/list_command.rb +20 -0
  124. data/lib/central/cli/services/envs/remove_command.rb +18 -0
  125. data/lib/central/cli/services/envs_command.rb +20 -0
  126. data/lib/central/cli/services/link_command.rb +26 -0
  127. data/lib/central/cli/services/list_command.rb +42 -0
  128. data/lib/central/cli/services/logs_command.rb +57 -0
  129. data/lib/central/cli/services/monitor_command.rb +58 -0
  130. data/lib/central/cli/services/remove_command.rb +17 -0
  131. data/lib/central/cli/services/remove_env_command.rb +18 -0
  132. data/lib/central/cli/services/remove_secret_command.rb +28 -0
  133. data/lib/central/cli/services/restart_command.rb +17 -0
  134. data/lib/central/cli/services/scale_command.rb +17 -0
  135. data/lib/central/cli/services/secret_command.rb +9 -0
  136. data/lib/central/cli/services/secrets/link_command.rb +24 -0
  137. data/lib/central/cli/services/secrets/unlink_command.rb +28 -0
  138. data/lib/central/cli/services/services_helper.rb +360 -0
  139. data/lib/central/cli/services/show_command.rb +18 -0
  140. data/lib/central/cli/services/start_command.rb +17 -0
  141. data/lib/central/cli/services/stats_command.rb +74 -0
  142. data/lib/central/cli/services/stop_command.rb +17 -0
  143. data/lib/central/cli/services/unlink_command.rb +25 -0
  144. data/lib/central/cli/services/update_command.rb +78 -0
  145. data/lib/central/cli/stack_command.rb +32 -0
  146. data/lib/central/cli/stack_options.rb +11 -0
  147. data/lib/central/cli/stacks/add_user_command.rb +18 -0
  148. data/lib/central/cli/stacks/audit_log_command.rb +21 -0
  149. data/lib/central/cli/stacks/cloud_config_command.rb +41 -0
  150. data/lib/central/cli/stacks/common.rb +95 -0
  151. data/lib/central/cli/stacks/create_command.rb +26 -0
  152. data/lib/central/cli/stacks/current_command.rb +25 -0
  153. data/lib/central/cli/stacks/env_command.rb +32 -0
  154. data/lib/central/cli/stacks/list_command.rb +35 -0
  155. data/lib/central/cli/stacks/list_users_command.rb +26 -0
  156. data/lib/central/cli/stacks/logs_command.rb +81 -0
  157. data/lib/central/cli/stacks/remove_command.rb +26 -0
  158. data/lib/central/cli/stacks/remove_user_command.rb +17 -0
  159. data/lib/central/cli/stacks/show_command.rb +19 -0
  160. data/lib/central/cli/stacks/trusted_subnets/add_command.rb +16 -0
  161. data/lib/central/cli/stacks/trusted_subnets/list_command.rb +17 -0
  162. data/lib/central/cli/stacks/trusted_subnets/remove_command.rb +20 -0
  163. data/lib/central/cli/stacks/update_command.rb +27 -0
  164. data/lib/central/cli/stacks/use_command.rb +21 -0
  165. data/lib/central/cli/stacks/user_command.rb +11 -0
  166. data/lib/central/cli/stacks/users/add_command.rb +18 -0
  167. data/lib/central/cli/stacks/users/list_command.rb +18 -0
  168. data/lib/central/cli/stacks/users/remove_command.rb +17 -0
  169. data/lib/central/cli/user/forgot_password_command.rb +16 -0
  170. data/lib/central/cli/user/reset_password_command.rb +21 -0
  171. data/lib/central/cli/user/verify_command.rb +22 -0
  172. data/lib/central/cli/user_command.rb +12 -0
  173. data/lib/central/cli/vault/list_command.rb +25 -0
  174. data/lib/central/cli/vault/read_command.rb +17 -0
  175. data/lib/central/cli/vault/remove_command.rb +14 -0
  176. data/lib/central/cli/vault/update_command.rb +18 -0
  177. data/lib/central/cli/vault/write_command.rb +22 -0
  178. data/lib/central/cli/vault_command.rb +16 -0
  179. data/lib/central/cli/version.rb +5 -0
  180. data/lib/central/cli/version_command.rb +22 -0
  181. data/lib/central/cli/vpn/config_command.rb +25 -0
  182. data/lib/central/cli/vpn/create_command.rb +71 -0
  183. data/lib/central/cli/vpn/delete_command.rb +21 -0
  184. data/lib/central/cli/vpn/remove_command.rb +19 -0
  185. data/lib/central/cli/vpn_command.rb +13 -0
  186. data/lib/central/cli/whoami_command.rb +20 -0
  187. data/lib/central/client.rb +208 -0
  188. data/lib/central/errors.rb +10 -0
  189. data/lib/central/machine/aws.rb +14 -0
  190. data/lib/central/machine/aws/auth_provisioner.rb +161 -0
  191. data/lib/central/machine/aws/cloudinit.yml +71 -0
  192. data/lib/central/machine/aws/cloudinit_master.yml +118 -0
  193. data/lib/central/machine/aws/cloudinit_oauth.yml +76 -0
  194. data/lib/central/machine/aws/common.rb +31 -0
  195. data/lib/central/machine/aws/master_provisioner.rb +171 -0
  196. data/lib/central/machine/aws/node_destroyer.rb +46 -0
  197. data/lib/central/machine/aws/node_provisioner.rb +214 -0
  198. data/lib/central/machine/azure.rb +13 -0
  199. data/lib/central/machine/azure/cloudinit.yml +64 -0
  200. data/lib/central/machine/azure/cloudinit_master.yml +106 -0
  201. data/lib/central/machine/azure/logger.rb +26 -0
  202. data/lib/central/machine/azure/master_provisioner.rb +125 -0
  203. data/lib/central/machine/azure/node_destroyer.rb +52 -0
  204. data/lib/central/machine/azure/node_provisioner.rb +126 -0
  205. data/lib/central/machine/cert_helper.rb +39 -0
  206. data/lib/central/machine/cloud_config/cloudinit.yml +70 -0
  207. data/lib/central/machine/cloud_config/node_generator.rb +27 -0
  208. data/lib/central/machine/common.rb +16 -0
  209. data/lib/central/machine/digital_ocean.rb +13 -0
  210. data/lib/central/machine/digital_ocean/cloudinit.yml +64 -0
  211. data/lib/central/machine/digital_ocean/cloudinit_master.yml +118 -0
  212. data/lib/central/machine/digital_ocean/master_provisioner.rb +99 -0
  213. data/lib/central/machine/digital_ocean/node_destroyer.rb +40 -0
  214. data/lib/central/machine/digital_ocean/node_provisioner.rb +81 -0
  215. data/lib/central/machine/random_name.rb +39 -0
  216. data/lib/central/machine/vagrant.rb +12 -0
  217. data/lib/central/machine/vagrant/Vagrantfile.master.rb.erb +116 -0
  218. data/lib/central/machine/vagrant/Vagrantfile.node.rb.erb +32 -0
  219. data/lib/central/machine/vagrant/cloudinit.yml +73 -0
  220. data/lib/central/machine/vagrant/master_destroyer.rb +34 -0
  221. data/lib/central/machine/vagrant/master_provisioner.rb +79 -0
  222. data/lib/central/machine/vagrant/node_destroyer.rb +38 -0
  223. data/lib/central/machine/vagrant/node_provisioner.rb +68 -0
  224. data/lib/central/scripts/completer +157 -0
  225. data/lib/central/scripts/init +11 -0
  226. data/spec/central/cli/app/common_spec.rb +150 -0
  227. data/spec/central/cli/app/deploy_command_spec.rb +598 -0
  228. data/spec/central/cli/app/docker_helper_spec.rb +102 -0
  229. data/spec/central/cli/app/scale_spec.rb +49 -0
  230. data/spec/central/cli/common_spec.rb +117 -0
  231. data/spec/central/cli/login_command_spec.rb +31 -0
  232. data/spec/central/cli/master/current_command_spec.rb +55 -0
  233. data/spec/central/cli/master/use_command_spec.rb +37 -0
  234. data/spec/central/cli/master/users/invite_command_spec.rb +34 -0
  235. data/spec/central/cli/master/users/remove_command_spec.rb +26 -0
  236. data/spec/central/cli/master/users/roles/add_command_spec.rb +34 -0
  237. data/spec/central/cli/master/users/roles/remove_command_spec.rb +34 -0
  238. data/spec/central/cli/register_command_spec.rb +56 -0
  239. data/spec/central/cli/services/containers_command_spec.rb +40 -0
  240. data/spec/central/cli/services/link_command_spec.rb +38 -0
  241. data/spec/central/cli/services/restart_command_spec.rb +27 -0
  242. data/spec/central/cli/services/secrets/link_command_spec.rb +59 -0
  243. data/spec/central/cli/services/secrets/unlink_command_spec.rb +48 -0
  244. data/spec/central/cli/services/services_helper_spec.rb +170 -0
  245. data/spec/central/cli/services/unlink_command_spec.rb +38 -0
  246. data/spec/central/cli/stacks/trusted_subnets/add_command_spec.rb +37 -0
  247. data/spec/central/cli/stacks/trusted_subnets/list_command_spec.rb +30 -0
  248. data/spec/central/cli/stacks/trusted_subnets/remove_command_spec.rb +37 -0
  249. data/spec/central/cli/version_command_spec.rb +16 -0
  250. data/spec/fixtures/central.yml +17 -0
  251. data/spec/fixtures/docker-compose.yml +8 -0
  252. data/spec/fixtures/mysql.yml +3 -0
  253. data/spec/fixtures/wordpress-scaled.yml +3 -0
  254. data/spec/fixtures/wordpress.yml +2 -0
  255. data/spec/spec_helper.rb +27 -0
  256. data/spec/support/client_helpers.rb +30 -0
  257. data/spec/support/fixtures_helpers.rb +7 -0
  258. data/tasks/rspec.rake +5 -0
  259. metadata +463 -0
@@ -0,0 +1,39 @@
1
+ require 'openssl'
2
+
3
+ module Central
4
+ module Machine
5
+ module CertHelper
6
+ def generate_self_signed_cert
7
+ key = OpenSSL::PKey::RSA.new(2048)
8
+ public_key = key.public_key
9
+
10
+ # subject = '/C=FI/O=Test/OU=Test/CN=Test'
11
+ subject = '/CN=api.bluebeluga.io/O=The BlueBeluga Company/C=US'
12
+
13
+ cert = OpenSSL::X509::Certificate.new
14
+ cert.subject = cert.issuer = OpenSSL::X509::Name.parse(subject)
15
+ cert.not_before = Time.now
16
+ cert.not_after = Time.now + (10 * 365 * 24 * 60 * 60)
17
+ cert.public_key = public_key
18
+ cert.serial = 0x0
19
+ cert.version = 2
20
+
21
+ ef = OpenSSL::X509::ExtensionFactory.new
22
+ ef.subject_certificate = cert
23
+ ef.issuer_certificate = cert
24
+ cert.extensions = [
25
+ ef.create_extension('basicConstraints', 'CA:TRUE', true),
26
+ ef.create_extension('subjectKeyIdentifier', 'hash')
27
+ ]
28
+ cert.add_extension ef.create_extension('authorityKeyIdentifier',
29
+ 'keyid:always,issuer:always')
30
+
31
+ cert.sign key, OpenSSL::Digest::SHA1.new
32
+
33
+ pem = cert.to_pem
34
+ pem << key.to_s
35
+ pem
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,70 @@
1
+ #cloud-config
2
+ write_files:
3
+ - path: /etc/central-agent.env
4
+ permissions: 0600
5
+ owner: root
6
+ content: |
7
+ CENTRAL_URI="<%= master_uri %>"
8
+ CENTRAL_TOKEN="<%= stack_token %>"
9
+ CENTRAL_PEER_INTERFACE=<%= peer_interface %>
10
+ CENTRAL_VERSION=<%= version %>
11
+ - path: /etc/systemd/system/docker.service.d/50-central.conf
12
+ content: |
13
+ [Service]
14
+ Environment='DOCKER_OPTS=--insecure-registry="10.81.0.0/19" --bip="<%= docker_bip %>"'
15
+ - path: /etc/sysctl.d/99-inotify.conf
16
+ owner: root
17
+ permissions: 0644
18
+ content: |
19
+ fs.inotify.max_user_instances = 8192
20
+ coreos:
21
+ units:
22
+ - name: 00-eth.network
23
+ runtime: true
24
+ content: |
25
+ [Match]
26
+ Name=eth*
27
+ [Network]
28
+ DHCP=yes
29
+ <% dns_servers.each do |dns| %>DNS=<%= dns %>
30
+ <% end %>
31
+ DOMAINS=central.local
32
+ [DHCP]
33
+ UseDNS=false
34
+
35
+ - name: 10-weave.network
36
+ runtime: false
37
+ content: |
38
+ [Match]
39
+ Type=bridge
40
+ Name=weave*
41
+
42
+ [Network]
43
+ - name: central-agent.service
44
+ command: start
45
+ enable: true
46
+ content: |
47
+ [Unit]
48
+ Description=central-agent
49
+ After=network-online.target
50
+ After=docker.service
51
+ Description=Central Agent
52
+ Documentation=http://www.central.io/
53
+ Requires=network-online.target
54
+ Requires=docker.service
55
+
56
+ [Service]
57
+ Restart=always
58
+ RestartSec=5
59
+ EnvironmentFile=/etc/central-agent.env
60
+ ExecStartPre=-/usr/bin/docker stop central-agent
61
+ ExecStartPre=-/usr/bin/docker rm central-agent
62
+ ExecStartPre=/usr/bin/docker pull fishyard/agent:${CENTRAL_VERSION}
63
+ ExecStart=/usr/bin/docker run --name central-agent \
64
+ -e CENTRAL_URI=${CENTRAL_URI} \
65
+ -e CENTRAL_TOKEN=${CENTRAL_TOKEN} \
66
+ -e CENTRAL_PEER_INTERFACE=${CENTRAL_PEER_INTERFACE} \
67
+ -v=/var/run/docker.sock:/var/run/docker.sock \
68
+ -v=/etc/central-agent.env:/etc/central.env \
69
+ --net=host \
70
+ fishyard/agent:${CENTRAL_VERSION}
@@ -0,0 +1,27 @@
1
+ require 'fileutils'
2
+ require 'erb'
3
+
4
+ module Central
5
+ module Machine
6
+ module CloudConfig
7
+ class NodeGenerator
8
+ # @param [Hash] opts
9
+ def generate(opts)
10
+ user_data(opts)
11
+ end
12
+
13
+ # @param [Hash] vars
14
+ def user_data(vars)
15
+ cloudinit_template = File.join(__dir__, '/cloudinit.yml')
16
+ erb(File.read(cloudinit_template), vars)
17
+ end
18
+
19
+ # @param [String] template
20
+ # @param [Hash] vars
21
+ def erb(template, vars)
22
+ ERB.new(template).result(OpenStruct.new(vars).instance_eval { binding })
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,16 @@
1
+ module Central
2
+ module Machine
3
+ module Common
4
+ def which(cmd)
5
+ exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
6
+ ENV['PATH'].split(File::PATH_SEPARATOR).each do |path|
7
+ exts.each do |ext|
8
+ exe = File.join(path, "#{cmd}#{ext}")
9
+ return exe if File.executable?(exe) && !File.directory?(exe)
10
+ end
11
+ end
12
+ nil
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,13 @@
1
+ begin
2
+ require 'droplet_kit'
3
+ rescue LoadError
4
+ puts "It seems that you don't have Digital Ocean API installed."
5
+ puts 'Install it using: gem install droplet_kit'
6
+ exit 1
7
+ end
8
+
9
+ require_relative 'random_name'
10
+ require_relative 'cert_helper'
11
+ require_relative 'digital_ocean/node_provisioner'
12
+ require_relative 'digital_ocean/node_destroyer'
13
+ require_relative 'digital_ocean/master_provisioner'
@@ -0,0 +1,64 @@
1
+ #cloud-config
2
+ write_files:
3
+ - path: /etc/central-agent.env
4
+ permissions: 0600
5
+ owner: root
6
+ content: |
7
+ CENTRAL_URI="<%= master_uri %>"
8
+ CENTRAL_TOKEN="<%= stack_token %>"
9
+ CENTRAL_PEER_INTERFACE=eth1
10
+ CENTRAL_VERSION=<%= version %>
11
+ - path: /etc/systemd/system/docker.service.d/50-central.conf
12
+ content: |
13
+ [Service]
14
+ Environment='DOCKER_OPTS=--insecure-registry="10.81.0.0/19" --bip="172.17.43.1/16"'
15
+ - path: /etc/sysctl.d/99-inotify.conf
16
+ owner: root
17
+ permissions: 0644
18
+ content: |
19
+ fs.inotify.max_user_instances = 8192
20
+ - path: /etc/resolv.conf
21
+ permissions: 0644
22
+ owner: root
23
+ content: |
24
+ nameserver 172.17.43.1
25
+ nameserver 8.8.8.8
26
+ nameserver 8.8.4.4
27
+ coreos:
28
+ units:
29
+ - name: 10-weave.network
30
+ runtime: false
31
+ content: |
32
+ [Match]
33
+ Type=bridge
34
+ Name=weave*
35
+
36
+ [Network]
37
+ - name: central-agent.service
38
+ command: start
39
+ enable: true
40
+ content: |
41
+ [Unit]
42
+ Description=central-agent
43
+ After=network-online.target
44
+ After=docker.service
45
+ Description=Central Agent
46
+ Documentation=http://www.central.io/
47
+ Requires=network-online.target
48
+ Requires=docker.service
49
+
50
+ [Service]
51
+ Restart=always
52
+ RestartSec=5
53
+ EnvironmentFile=/etc/central-agent.env
54
+ ExecStartPre=-/usr/bin/docker stop central-agent
55
+ ExecStartPre=-/usr/bin/docker rm central-agent
56
+ ExecStartPre=/usr/bin/docker pull fishyard/agent:${CENTRAL_VERSION}
57
+ ExecStart=/usr/bin/docker run --name central-agent \
58
+ -e CENTRAL_URI=${CENTRAL_URI} \
59
+ -e CENTRAL_TOKEN=${CENTRAL_TOKEN} \
60
+ -e CENTRAL_PEER_INTERFACE=${CENTRAL_PEER_INTERFACE} \
61
+ -v=/var/run/docker.sock:/var/run/docker.sock \
62
+ -v=/etc/central-agent.env:/etc/central.env \
63
+ --net=host \
64
+ fishyard/agent:${CENTRAL_VERSION}
@@ -0,0 +1,118 @@
1
+ #cloud-config
2
+ write_files:
3
+ - path: /etc/central-server.env
4
+ permissions: 0600
5
+ owner: root
6
+ content: |
7
+ CENTRAL_VERSION=<%= version %>
8
+ CENTRAL_VAULT_KEY=<%= vault_secret %>
9
+ CENTRAL_VAULT_IV=<%= vault_iv %>
10
+ <% if ssl_cert %>SSL_CERT="/etc/central-server.pem"
11
+
12
+ - path: /etc/central-server.pem
13
+ permissions: 0600
14
+ owner: root
15
+ content: | <% ssl_cert.split(/\n/).each do |row| %>
16
+ <%= row %><% end %><% end %>
17
+ - path: /opt/bin/central-haproxy.sh
18
+ permissions: 0755
19
+ owner: root
20
+ content: |
21
+ #!/bin/sh
22
+ if [ -n "$SSL_CERT" ]; then
23
+ SSL_CERT=$(awk 1 ORS='\\n' $SSL_CERT)
24
+ else
25
+ SSL_CERT="**None**"
26
+ fi
27
+ /usr/bin/docker run --name=central-server-haproxy \
28
+ --link central-server-api:central-server-api \
29
+ -e SSL_CERT="$SSL_CERT" \
30
+ -p 80:80 -p 443:443 fishyard/haproxy:latest
31
+ coreos:
32
+ units:
33
+ <% unless mongodb_uri -%>
34
+ - name: central-server-mongo.service
35
+ command: start
36
+ enable: true
37
+ content: |
38
+ [Unit]
39
+ Description=central-server-mongo
40
+ After=network-online.target
41
+ After=docker.service
42
+ Description=Central Server MongoDB
43
+ Documentation=http://www.mongodb.org/
44
+ Requires=network-online.target
45
+ Requires=docker.service
46
+
47
+ [Service]
48
+ Restart=always
49
+ RestartSec=5
50
+ ExecStartPre=/usr/bin/docker pull mongo:3.0
51
+ ExecStartPre=-/usr/bin/docker create --name=central-server-mongo-data mongo:3.0
52
+ ExecStartPre=-/usr/bin/docker stop central-server-mongo
53
+ ExecStartPre=-/usr/bin/docker rm central-server-mongo
54
+ ExecStart=/usr/bin/docker run --name=central-server-mongo \
55
+ --volumes-from=central-server-mongo-data \
56
+ mongo:3.0 mongod --smallfiles
57
+ <% end -%>
58
+ - name: central-server-api.service
59
+ command: start
60
+ enable: true
61
+ content: |
62
+ [Unit]
63
+ Description=central-server-api
64
+ After=network-online.target
65
+ After=docker.service
66
+ After=central-server-mongo.service
67
+ Description=Central Machine
68
+ Documentation=http://www.central.io/
69
+ Before=central-server-haproxy.service
70
+ Wants=central-server-haproxy.service
71
+ Requires=network-online.target
72
+ Requires=docker.service
73
+ <% unless mongodb_uri -%>
74
+ Requires=central-server-mongo.service
75
+ <% end %>
76
+
77
+ [Service]
78
+ Restart=always
79
+ RestartSec=5
80
+ EnvironmentFile=/etc/central-server.env
81
+ ExecStartPre=-/usr/bin/docker stop central-server-api
82
+ ExecStartPre=-/usr/bin/docker rm central-server-api
83
+ ExecStartPre=/usr/bin/docker pull fishyard/server:${CENTRAL_VERSION}
84
+ ExecStart=/usr/bin/docker run --name central-server-api \
85
+ <% if mongodb_uri -%>
86
+ -e MONGODB_URI=<%= mongodb_uri %> \
87
+ <% else -%>
88
+ --link central-server-mongo:mongodb \
89
+ -e MONGODB_URI=mongodb://mongodb:27017/central_server \
90
+ <% end -%>
91
+ <% if auth_server %>
92
+ -e AUTH_API_URL=<%= auth_server %> \
93
+ <% end -%>
94
+ -e VAULT_KEY=${CENTRAL_VAULT_KEY} -e VAULT_IV=${CENTRAL_VAULT_IV} \
95
+ fishyard/server:${CENTRAL_VERSION}
96
+
97
+ - name: central-server-haproxy.service
98
+ command: start
99
+ enable: true
100
+ content: |
101
+ [Unit]
102
+ Description=central-server-haproxy
103
+ After=network-online.target
104
+ After=docker.service
105
+ Description=Central Server HAProxy
106
+ Documentation=http://www.central.io/
107
+ Requires=network-online.target
108
+ Requires=docker.service
109
+ Requires=central-server-api.service
110
+
111
+ [Service]
112
+ Restart=always
113
+ RestartSec=5
114
+ EnvironmentFile=/etc/central-server.env
115
+ ExecStartPre=-/usr/bin/docker stop central-server-haproxy
116
+ ExecStartPre=-/usr/bin/docker rm central-server-haproxy
117
+ ExecStartPre=/usr/bin/docker pull fishyard/haproxy:latest
118
+ ExecStart=/opt/bin/central-haproxy.sh
@@ -0,0 +1,99 @@
1
+ require 'fileutils'
2
+ require 'erb'
3
+ require 'open3'
4
+ require 'shell-spinner'
5
+
6
+ module Central
7
+ module Machine
8
+ module DigitalOcean
9
+ class MasterProvisioner
10
+ include RandomName
11
+ include Machine::CertHelper
12
+
13
+ attr_reader :client, :http_client
14
+
15
+ # @param [String] token Digital Ocean token
16
+ def initialize(token)
17
+ @client = DropletKit::Client.new(access_token: token)
18
+ end
19
+
20
+ def run!(opts)
21
+ abort('Invalid ssh key') unless File.exist?(File.expand_path(opts[:ssh_key]))
22
+
23
+ ssh_key = ssh_key(File.read(File.expand_path(opts[:ssh_key])).strip)
24
+ abort('Ssh key does not exist in Digital Ocean') unless ssh_key
25
+
26
+ if opts[:ssl_cert]
27
+ abort('Invalid ssl cert') unless File.exist?(File.expand_path(opts[:ssl_cert]))
28
+ ssl_cert = File.read(File.expand_path(opts[:ssl_cert]))
29
+ else
30
+ ShellSpinner 'Generating self-signed SSL certificate' do
31
+ ssl_cert = generate_self_signed_cert
32
+ end
33
+ end
34
+
35
+ userdata_vars = {
36
+ ssl_cert: ssl_cert,
37
+ auth_server: opts[:auth_server],
38
+ version: opts[:version],
39
+ vault_secret: opts[:vault_secret],
40
+ vault_iv: opts[:vault_iv],
41
+ mongodb_uri: opts[:mongodb_uri]
42
+ }
43
+
44
+ droplet = DropletKit::Droplet.new(
45
+ name: generate_name,
46
+ region: opts[:region],
47
+ image: 'coreos-stable',
48
+ size: opts[:size],
49
+ private_networking: true,
50
+ user_data: user_data(userdata_vars),
51
+ ssh_keys: [ssh_key.id]
52
+ )
53
+
54
+ ShellSpinner "Creating DigitalOcean droplet #{droplet.name.colorize(:cyan)} " do
55
+ droplet = client.droplets.create(droplet)
56
+ until droplet.status == 'active'
57
+ droplet = client.droplets.find(id: droplet.id)
58
+ sleep 5
59
+ end
60
+ end
61
+
62
+ master_url = "https://#{droplet.public_ip}"
63
+ Excon.defaults[:ssl_verify_peer] = false
64
+ @http_client = Excon.new(master_url.to_s, connect_timeout: 10)
65
+
66
+ ShellSpinner "Waiting for #{droplet.name.colorize(:cyan)} to start" do
67
+ sleep 5 until master_running?
68
+ end
69
+
70
+ puts "Central Machine is now running at #{master_url}"
71
+ puts "Use #{"cm login --name=#{droplet.name.sub('central-machine-', '')} #{master_url}".colorize(:light_black)} to complete Central Machine setup"
72
+ end
73
+
74
+ def user_data(vars)
75
+ cloudinit_template = File.join(__dir__, '/cloudinit_master.yml')
76
+ erb(File.read(cloudinit_template), vars)
77
+ end
78
+
79
+ def generate_name
80
+ "central-machine-#{super}-#{rand(1..9)}"
81
+ end
82
+
83
+ def ssh_key(public_key)
84
+ client.ssh_keys.all.find { |key| key.public_key == public_key }
85
+ end
86
+
87
+ def master_running?
88
+ http_client.get(path: '/').status == 200
89
+ rescue
90
+ false
91
+ end
92
+
93
+ def erb(template, vars)
94
+ ERB.new(template, nil, '%<>-').result(OpenStruct.new(vars).instance_eval { binding })
95
+ end
96
+ end
97
+ end
98
+ end
99
+ end