Commit 78524563b8c7d46aaa727871df989c9c8719d3d5

Authored by Georg Hopp
1 parent c60e1bf0

bootstrap containers from metadata info / added a sid example box

@@ -9,7 +9,7 @@ @@ -9,7 +9,7 @@
9 "name": "lxd", 9 "name": "lxd",
10 "url": "file:///data/ghopp/projects/vagrant/vagrant-lxd/gentoo_001_lxd.box", 10 "url": "file:///data/ghopp/projects/vagrant/vagrant-lxd/gentoo_001_lxd.box",
11 "checksum_type": "sha1", 11 "checksum_type": "sha1",
12 - "checksum": "9cf9ffd2c840680672a329a87abcd056b021d130" 12 + "checksum": "303573ec033c0eb1939df486f444c5bcc3f82d1e"
13 } 13 }
14 ] 14 ]
15 } 15 }
No preview for this file type
@@ -5,7 +5,7 @@ @@ -5,7 +5,7 @@
5 "exec": [ 5 "exec": [
6 ["sed", "-i", "s/-lxc //", "/etc/init.d/hostname"], 6 ["sed", "-i", "s/-lxc //", "/etc/init.d/hostname"],
7 ["sed", "-i", "s/LXC_NAME/<%= hostname %>/", "/etc/conf.d/hostname"], 7 ["sed", "-i", "s/LXC_NAME/<%= hostname %>/", "/etc/conf.d/hostname"],
8 - ["sed", "-i", "s/<%= container %>/<%= hostname %>/", "/etc/hostname"], 8 + ["sed", "-i", "s/<%= container %>/<%= hostname %>/", "/etc/hostname"],
9 ["sed", "-i", "s/<%= container %>/<%= hostname %>/", "/etc/hosts"] 9 ["sed", "-i", "s/<%= container %>/<%= hostname %>/", "/etc/hosts"]
10 ] 10 ]
11 }, 11 },
@@ -16,7 +16,18 @@ @@ -16,7 +16,18 @@
16 }, 16 },
17 "sudo": { 17 "sudo": {
18 "exec": [ 18 "exec": [
19 - ["echo", "vagrant ALL=(ALL) NOPASSWD: ALL", ">>/etc/sudoers"] 19 + [
  20 + "sed",
  21 + "-i",
  22 + "/vagrant/b;$a\\\nvagrant ALL=(ALL) NOPASSWD: ALL",
  23 + "/etc/sudoers"
  24 + ]
  25 + ]
  26 + },
  27 + "sshd_service": {
  28 + "exec": [
  29 + ["rc-update", "add", "sshd", "default"],
  30 + ["/etc/init.d/sshd", "start"]
20 ] 31 ]
21 } 32 }
22 } 33 }
@@ -28,17 +28,18 @@ module Vagrant @@ -28,17 +28,18 @@ module Vagrant
28 b2.use EnsureImage 28 b2.use EnsureImage
29 b2.use Network 29 b2.use Network
30 b2.use Create 30 b2.use Create
  31 + b2.use action_start
  32 + b2.use Bootstrap
  33 + b2.use EnsureSsh
  34 + else
  35 + b2.use action_start
31 end 36 end
32 end 37 end
33 - b.use action_start  
34 - b.use EnsureSsh  
35 - b.use Bootstrap  
36 end 38 end
37 end 39 end
38 40
39 def self.action_start 41 def self.action_start
40 Vagrant::Action::Builder.new.tap do |b| 42 Vagrant::Action::Builder.new.tap do |b|
41 - b.use Bootstrap  
42 b.use EnsureStarted 43 b.use EnsureStarted
43 end 44 end
44 end 45 end
@@ -24,11 +24,13 @@ module Vagrant @@ -24,11 +24,13 @@ module Vagrant
24 hostname = env[:machine].name 24 hostname = env[:machine].name
25 data.each do |d| 25 data.each do |d|
26 d.collect! { |element| ERB.new(element).result(binding) } 26 d.collect! { |element| ERB.new(element).result(binding) }
27 - driver.exec(*d)  
28 - env[:ui].info "--- #{d.inspect} ---", :prefix => false 27 + env[:ui].info "--- #{action}: #{d.inspect} ---",
  28 + :prefix => false
  29 + driver.exec(*d, :retryable => true)
29 end 30 end
30 end 31 end
31 end 32 end
  33 + driver.restart
32 34
33 @app.call(env) 35 @app.call(env)
34 end 36 end
@@ -10,8 +10,8 @@ module Vagrant @@ -10,8 +10,8 @@ module Vagrant
10 def call(env) 10 def call(env)
11 driver = env[:machine].provider.driver 11 driver = env[:machine].provider.driver
12 12
13 - env[:ui].info "--- #{env[:machine].box.directory} ---",  
14 - :prefix => false 13 + # Currently I suppose this is the same on all linux distributions
  14 + # so it is not configured in the metadata of the box.
15 driver.vagrant_user 15 driver.vagrant_user
16 driver.enable_ssh 16 driver.enable_ssh
17 17
@@ -72,12 +72,12 @@ module Vagrant @@ -72,12 +72,12 @@ module Vagrant
72 72
73 def initialize(machine) 73 def initialize(machine)
74 @machine = machine 74 @machine = machine
75 - @name = "vagrant-#{machine.name}" 75 + @name = "vagrant-#{machine.config.vm.hostname}"
  76 + @name = "vagrant-#{machine.name}" unless @name
76 @logger = Log4r::Logger.new("vagrant::provider::lxd::driver") 77 @logger = Log4r::Logger.new("vagrant::provider::lxd::driver")
77 78
78 # This flag is used to keep track of interrupted state (SIGINT) 79 # This flag is used to keep track of interrupted state (SIGINT)
79 @interrupted = false 80 @interrupted = false
80 - @image = machine.box.name.split("/")[1] if machine.box  
81 bridge 81 bridge
82 end 82 end
83 83
@@ -89,8 +89,12 @@ module Vagrant @@ -89,8 +89,12 @@ module Vagrant
89 end.flatten(1)] 89 end.flatten(1)]
90 end 90 end
91 91
  92 + def image
  93 + @machine.box.name.split("/")[1..-1].join("/") if @machine.box
  94 + end
  95 +
92 def image? 96 def image?
93 - images.key? @image 97 + images.key? image
94 end 98 end
95 99
96 # Get infos about all existing containers 100 # Get infos about all existing containers
@@ -130,7 +134,7 @@ module Vagrant @@ -130,7 +134,7 @@ module Vagrant
130 args = [ 134 args = [
131 "image", 135 "image",
132 "copy", 136 "copy",
133 - "#{remote}:#{@image}", 137 + "#{remote}:#{image}",
134 "local:", 138 "local:",
135 "--copy-aliases" 139 "--copy-aliases"
136 ] 140 ]
@@ -141,7 +145,7 @@ module Vagrant @@ -141,7 +145,7 @@ module Vagrant
141 def create 145 def create
142 # network could be also attached right here if it turns out to be 146 # network could be also attached right here if it turns out to be
143 # a good idea. 147 # a good idea.
144 - execute("init", @image, @name, "-n", @bridge["name"]) 148 + execute("init", image, @name, "-n", @bridge["name"])
145 end 149 end
146 150
147 def start 151 def start
@@ -161,15 +165,18 @@ module Vagrant @@ -161,15 +165,18 @@ module Vagrant
161 @bridge 165 @bridge
162 end 166 end
163 167
  168 + def restart
  169 + execute("stop", @name)
  170 + execute("start", @name)
  171 + end
  172 +
164 def vagrant_user 173 def vagrant_user
165 pwent = [] 174 pwent = []
166 while pwent.empty? do 175 while pwent.empty? do
167 begin 176 begin
168 - pwent = execute(  
169 - "exec", @name, "getent", "passwd", "vagrant"  
170 - ).split(":") 177 + pwent = exec("getent", "passwd", "vagrant").split(":")
171 rescue 178 rescue
172 - execute("exec", @name, "--", "useradd", "-m", "vagrant") 179 + exec("useradd", "-m", "-s", "/bin/bash", "vagrant")
173 end 180 end
174 end 181 end
175 execute( 182 execute(
@@ -178,17 +185,19 @@ module Vagrant @@ -178,17 +185,19 @@ module Vagrant
178 "--uid=#{pwent[2]}", 185 "--uid=#{pwent[2]}",
179 "--gid=#{pwent[3]}", 186 "--gid=#{pwent[3]}",
180 "--mode=0400", 187 "--mode=0400",
  188 + "-p",
181 "#{@machine.box.directory}/vagrant.pub", 189 "#{@machine.box.directory}/vagrant.pub",
182 - "#{@name}/#{pwent[5]}/.ssh/authorized_keys" 190 + "#{@name}#{pwent[5]}/.ssh/authorized_keys"
183 ) 191 )
  192 + exec("chmod", "700", "#{pwent[5]}/.ssh")
184 end 193 end
185 194
186 def enable_ssh 195 def enable_ssh
187 - begin  
188 - execute("exec", @name, "--", "rc-update", "add", "sshd", "default")  
189 - execute("exec", @name, "--", "/etc/init.d/sshd", "start")  
190 - rescue  
191 - end 196 + #begin
  197 + service = @machine.box.metadata["bootstrap"]["sshd_service"]
  198 + service["exec"].each { |command| exec(*command) }
  199 + #rescue
  200 + #end
192 end 201 end
193 202
194 def exec(*command) 203 def exec(*command)
  1 +{
  2 + "name": "lxd/debian/sid",
  3 + "description": "The latest debian/sid LXD image.",
  4 + "versions": [
  5 + {
  6 + "version": "0.0.1",
  7 + "providers": [
  8 + {
  9 + "name": "lxd",
  10 + "url": "file:///data/ghopp/projects/vagrant/vagrant-lxd/sid_001_lxd.box",
  11 + "checksum_type": "sha1",
  12 + "checksum": "a533654e7577931659c1cb457b13e6b184d4013d"
  13 + }
  14 + ]
  15 + }
  16 + ]
  17 +}
No preview for this file type
  1 +# Vagrant LXD Example Box
  2 +
  3 +Vagrant providers each require a custom provider-specific box format.
  4 +This folder shows the example contents of a box for the `lxd` provider.
  5 +To turn this into a box:
  6 +
  7 +```
  8 +$ tar cvzf lxd.box ./metadata.json ./vagrant.pub
  9 +```
  10 +
  11 +The `lxd` provider right now just uses the default lxd images provided
  12 +by the lxd images: remote. Upon start these will be provisioned with an
  13 +vagrant ssh user and and the unsafe common pubkey of vagrant and
  14 +sshd will be enabled.
  15 +
  16 +Well, at least thats the idea for now.
  1 +{
  2 + "provider": "lxd",
  3 + "bootstrap": {
  4 + "hostname": {
  5 + "exec": [
  6 + ["sed", "-i", "s/<%= container %>/<%= hostname %>/", "/etc/hostname"],
  7 + ["sed", "-i", "s/<%= container %>/<%= hostname %>/", "/etc/hosts"]
  8 + ]
  9 + },
  10 + "packages": {
  11 + "exec": [
  12 + ["apt-get", "install", "-y", "sudo"],
  13 + ["apt-get", "install", "-y", "openssh-server"]
  14 + ]
  15 + },
  16 + "sudo": {
  17 + "exec": [
  18 + [
  19 + "sed",
  20 + "-i",
  21 + "/vagrant/b;$a\\\nvagrant ALL=(ALL) NOPASSWD: ALL",
  22 + "/etc/sudoers"
  23 + ]
  24 + ]
  25 + },
  26 + "sshd_service": {
  27 + "exec": [
  28 + ["systemctl", "enable", "ssh"],
  29 + ["systemctl", "start", "ssh"]
  30 + ]
  31 + }
  32 + }
  33 +}
  1 +ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA6NF8iallvQVp22WDkTkyrtvp9eWW6A8YVr+kz4TjGYe7gHzIw+niNltGEFHzD8+v1I2YJ6oXevct1YeS0o9HZyN1Q9qgCgzUFtdOKLv6IedplqoPkcmF0aYet2PkEDo3MlTBckFXPITAMzF8dJSIFo9D8HfdOV0IAdx4O7PtixWKn5y2hMNG0zQPyUecp4pzC6kivAIhyfHilFR61RGL+GPXQ2MWZWFYbAGjyiYJnAmCP3NOTd0jMZEnDkbUvxhMmBYSdETk1rRgm+R4LOzFUGaHqHDLKLX+FIPKcF96hrucXzcWyLbIbEgE98OHlnVYCzRdK8jlqm8tehUc9c9WhQ== vagrant insecure public key
Please register or login to post a comment