From 78524563b8c7d46aaa727871df989c9c8719d3d5 Mon Sep 17 00:00:00 2001 From: Georg Hopp Date: Sun, 7 May 2017 12:05:40 +0200 Subject: [PATCH] bootstrap containers from metadata info / added a sid example box --- gentoo.json | 2 +- gentoo_001_lxd.box | Bin 742 -> 802 bytes gentoo_box/metadata.json | 15 +++++++++-- lib/vagrant/lxd/action.rb | 9 ++++--- lib/vagrant/lxd/action/bootstrap.rb | 6 +++-- lib/vagrant/lxd/action/ensure_ssh.rb | 4 +-- lib/vagrant/lxd/driver.rb | 39 ++++++++++++++++----------- sid.json | 17 ++++++++++++ sid_001_lxd.box | Bin 0 -> 784 bytes sid_box/README.md | 16 +++++++++++ sid_box/metadata.json | 33 +++++++++++++++++++++++ sid_box/vagrant.pub | 1 + 12 files changed, 116 insertions(+), 26 deletions(-) create mode 100644 sid.json create mode 100644 sid_001_lxd.box create mode 100644 sid_box/README.md create mode 100644 sid_box/metadata.json create mode 100644 sid_box/vagrant.pub diff --git a/gentoo.json b/gentoo.json index f443ae4..48df0db 100644 --- a/gentoo.json +++ b/gentoo.json @@ -9,7 +9,7 @@ "name": "lxd", "url": "file:///data/ghopp/projects/vagrant/vagrant-lxd/gentoo_001_lxd.box", "checksum_type": "sha1", - "checksum": "9cf9ffd2c840680672a329a87abcd056b021d130" + "checksum": "303573ec033c0eb1939df486f444c5bcc3f82d1e" } ] } diff --git a/gentoo_001_lxd.box b/gentoo_001_lxd.box index a9d38b91dbdc670cf4a0f050a5b131123af2738f..336e0fe46591b5364ac8284dd4b9571876e64454 100644 GIT binary patch literal 802 zcmV+-1Ks=|iwFS6#tvBk1MQUkZ=*IC$NO{t3JdL|O}U2GlH|5dq6s84Bq47l^m;lu z#svZa3J#Yr-T!`&wz;lSulr%yw8S8A)MMdaJ0?<;59^;2Ix1r4Mg0D(#PtHUJ-)43`psIrFPB zW6#1Z0xVk@EGCHcBcIeA_8|7@{p(|mMf>wm8K~@U?=Ha82=MOr?`kNH?*6J;B~r!{ z=tnrMR9;m*f?URYdX##ozdk542}A*OarVZh;x$fPyr2GTlavp3-_ABp{EF_r>xY_$ zRuzpOj{V@Me)74^=Fm-HMA+r8Kf&AE+vw2-ieX&*To%88;mA~`Q>*i#^1T>c?LxI8 zoMz0SttXr1k>+?K|8ug)KjeR2l%w6D`zP)M^?*TxOESLk1Akv|Mc zSJiq&r&-H+U9hj@c!6_7cpFc-xYfJa4f%2F-fg?ZTqDk?Z{)I$og}=E%>b=64%(Oq zW}tRraS+ZfQJ^hMeWnZwt?67%buDgnn!P(`bj|6Cvz0~-llWV!AD!<6Z!qj~#n{}< zF-oMQXv=}0E4sJ4>-nKJk@-p2sCCW7SQuD0mS!)N?rP`TSCO)Ao8oXZbGX&uMvXeb za-MI!!TQpkI_fOo(}}yTO(bJfX!9=Y-S;|1-&oW%-RvW+C41=xEed4qjHSL*UA5I5 z^}^`dZWj}$-&}?F>n6e89JNr(^2Qez;3wX01kVeTL1t6 literal 742 zcmVYx@F0I67RSlcVEE3RjC!ihG}4${D11(9suPq3KGXe zQTZ5@y{%b3D2j_9z%h=DFs~M~@{%3I*f&<_v69!&7QuXcbw38+svM&{0+bJ(qK&CT zZwmoM6$1)kNIAZPt0wgr_T}K^waUEpbs+Rb>ht~ycvu1UPk*Grz`uTy_TgDfu{xiK z4aY}OvHZoj-@2=}#l__>_fdEK?Ok#?G@xr(D1PPNL@N|oXm|O;O_+bFyW@Cc1~269 zPQ8)|?Vw0W3@b8x3?sK^BQx~Yf$GAQL>oH7tm=yG zpw{=MXV8`Asyr3?nba`PC$bbY+l}tEIlQ1{!Q67gx{95x*7J{2*6t5FbT(4c8G<1f zW-Z=z5<#}p>#pNTW1bmzluAdPkJ!F;sY&`m=qyu5Klg=IORWutQs`sx0J%Xo=0nu/", "/etc/conf.d/hostname"], - ["sed", "-i", "s/<%= container %>/<%= hostname %>/", "/etc/hostname"], + ["sed", "-i", "s/<%= container %>/<%= hostname %>/", "/etc/hostname"], ["sed", "-i", "s/<%= container %>/<%= hostname %>/", "/etc/hosts"] ] }, @@ -16,7 +16,18 @@ }, "sudo": { "exec": [ - ["echo", "vagrant ALL=(ALL) NOPASSWD: ALL", ">>/etc/sudoers"] + [ + "sed", + "-i", + "/vagrant/b;$a\\\nvagrant ALL=(ALL) NOPASSWD: ALL", + "/etc/sudoers" + ] + ] + }, + "sshd_service": { + "exec": [ + ["rc-update", "add", "sshd", "default"], + ["/etc/init.d/sshd", "start"] ] } } diff --git a/lib/vagrant/lxd/action.rb b/lib/vagrant/lxd/action.rb index f1fba9e..6326c3c 100644 --- a/lib/vagrant/lxd/action.rb +++ b/lib/vagrant/lxd/action.rb @@ -28,17 +28,18 @@ module Vagrant b2.use EnsureImage b2.use Network b2.use Create + b2.use action_start + b2.use Bootstrap + b2.use EnsureSsh + else + b2.use action_start end end - b.use action_start - b.use EnsureSsh - b.use Bootstrap end end def self.action_start Vagrant::Action::Builder.new.tap do |b| - b.use Bootstrap b.use EnsureStarted end end diff --git a/lib/vagrant/lxd/action/bootstrap.rb b/lib/vagrant/lxd/action/bootstrap.rb index 51caa33..3020921 100644 --- a/lib/vagrant/lxd/action/bootstrap.rb +++ b/lib/vagrant/lxd/action/bootstrap.rb @@ -24,11 +24,13 @@ module Vagrant hostname = env[:machine].name data.each do |d| d.collect! { |element| ERB.new(element).result(binding) } - driver.exec(*d) - env[:ui].info "--- #{d.inspect} ---", :prefix => false + env[:ui].info "--- #{action}: #{d.inspect} ---", + :prefix => false + driver.exec(*d, :retryable => true) end end end + driver.restart @app.call(env) end diff --git a/lib/vagrant/lxd/action/ensure_ssh.rb b/lib/vagrant/lxd/action/ensure_ssh.rb index 2f88826..e0457c4 100644 --- a/lib/vagrant/lxd/action/ensure_ssh.rb +++ b/lib/vagrant/lxd/action/ensure_ssh.rb @@ -10,8 +10,8 @@ module Vagrant def call(env) driver = env[:machine].provider.driver - env[:ui].info "--- #{env[:machine].box.directory} ---", - :prefix => false + # Currently I suppose this is the same on all linux distributions + # so it is not configured in the metadata of the box. driver.vagrant_user driver.enable_ssh diff --git a/lib/vagrant/lxd/driver.rb b/lib/vagrant/lxd/driver.rb index 9e72c43..0dcdd7e 100644 --- a/lib/vagrant/lxd/driver.rb +++ b/lib/vagrant/lxd/driver.rb @@ -72,12 +72,12 @@ module Vagrant def initialize(machine) @machine = machine - @name = "vagrant-#{machine.name}" + @name = "vagrant-#{machine.config.vm.hostname}" + @name = "vagrant-#{machine.name}" unless @name @logger = Log4r::Logger.new("vagrant::provider::lxd::driver") # This flag is used to keep track of interrupted state (SIGINT) @interrupted = false - @image = machine.box.name.split("/")[1] if machine.box bridge end @@ -89,8 +89,12 @@ module Vagrant end.flatten(1)] end + def image + @machine.box.name.split("/")[1..-1].join("/") if @machine.box + end + def image? - images.key? @image + images.key? image end # Get infos about all existing containers @@ -130,7 +134,7 @@ module Vagrant args = [ "image", "copy", - "#{remote}:#{@image}", + "#{remote}:#{image}", "local:", "--copy-aliases" ] @@ -141,7 +145,7 @@ module Vagrant def create # network could be also attached right here if it turns out to be # a good idea. - execute("init", @image, @name, "-n", @bridge["name"]) + execute("init", image, @name, "-n", @bridge["name"]) end def start @@ -161,15 +165,18 @@ module Vagrant @bridge end + def restart + execute("stop", @name) + execute("start", @name) + end + def vagrant_user pwent = [] while pwent.empty? do begin - pwent = execute( - "exec", @name, "getent", "passwd", "vagrant" - ).split(":") + pwent = exec("getent", "passwd", "vagrant").split(":") rescue - execute("exec", @name, "--", "useradd", "-m", "vagrant") + exec("useradd", "-m", "-s", "/bin/bash", "vagrant") end end execute( @@ -178,17 +185,19 @@ module Vagrant "--uid=#{pwent[2]}", "--gid=#{pwent[3]}", "--mode=0400", + "-p", "#{@machine.box.directory}/vagrant.pub", - "#{@name}/#{pwent[5]}/.ssh/authorized_keys" + "#{@name}#{pwent[5]}/.ssh/authorized_keys" ) + exec("chmod", "700", "#{pwent[5]}/.ssh") end def enable_ssh - begin - execute("exec", @name, "--", "rc-update", "add", "sshd", "default") - execute("exec", @name, "--", "/etc/init.d/sshd", "start") - rescue - end + #begin + service = @machine.box.metadata["bootstrap"]["sshd_service"] + service["exec"].each { |command| exec(*command) } + #rescue + #end end def exec(*command) diff --git a/sid.json b/sid.json new file mode 100644 index 0000000..2c98206 --- /dev/null +++ b/sid.json @@ -0,0 +1,17 @@ +{ + "name": "lxd/debian/sid", + "description": "The latest debian/sid LXD image.", + "versions": [ + { + "version": "0.0.1", + "providers": [ + { + "name": "lxd", + "url": "file:///data/ghopp/projects/vagrant/vagrant-lxd/sid_001_lxd.box", + "checksum_type": "sha1", + "checksum": "a533654e7577931659c1cb457b13e6b184d4013d" + } + ] + } + ] +} diff --git a/sid_001_lxd.box b/sid_001_lxd.box new file mode 100644 index 0000000000000000000000000000000000000000..8e2e25d79c3f51b23b69025d78bbdea8b4a5ccc9 GIT binary patch literal 784 zcmV+r1MmDFiwFSU$PQTm1MQV$Md?M!a|$0DQg3Sl4M&a(Ig}^PvohDuG8cg z7YGC>I4m&jyAP*r)Ky!nN$aLb{z=%}aU6dR`#7qsF@Y8&@Mx8ULFqZ*3uH;6vrs$c z@6QyWDu|_G;H$@yR2AeBFNkujRs#I9sCmF9AutA@WIJILJreiS_5YNw2LNzU9Hy>? zW9}{B{H?{kq0VI(l7z%CD!eqRa5-T@0=UL|PvOH`j0*eXtqs6OF2O|#z#Y1DOe*hR zo&XdE1iAr^!OIUj$6YFF)36FAsIt%h>CK-?mvEnMQ{BwpZZdNbL>{zp^2Dpah#cCO z(3EaatQ6nhNy&CnHdgqf(#N912nR{x940tUi%S1o)h^|uiuPwT8sB`Xy@QtMzFkS7 z9m9ZBmhWD`%gf8))&@$yfAXprUW4ICSEf^=^_Kb`+)Zmp72!DH_7{F3JaMeg^wnJS ztsxUI-TweA+pEFGUm zqG+_dnU}>RjT+c6WTkGN$7L^O$9M${<(k z*4b23!$zy#y|PBlA^pRdv2;|PIlFGeRU!W zlTN?f(HCQJU|blgxl}r<%r(yfW!==P!_my*SA&ao(DIh^bn6V(r{>gZ&paWX*z58{ z>W^}D-htigZmZwxFUqQ>_mJ9/<%= hostname %>/", "/etc/hostname"], + ["sed", "-i", "s/<%= container %>/<%= hostname %>/", "/etc/hosts"] + ] + }, + "packages": { + "exec": [ + ["apt-get", "install", "-y", "sudo"], + ["apt-get", "install", "-y", "openssh-server"] + ] + }, + "sudo": { + "exec": [ + [ + "sed", + "-i", + "/vagrant/b;$a\\\nvagrant ALL=(ALL) NOPASSWD: ALL", + "/etc/sudoers" + ] + ] + }, + "sshd_service": { + "exec": [ + ["systemctl", "enable", "ssh"], + ["systemctl", "start", "ssh"] + ] + } + } +} diff --git a/sid_box/vagrant.pub b/sid_box/vagrant.pub new file mode 100644 index 0000000..18a9c00 --- /dev/null +++ b/sid_box/vagrant.pub @@ -0,0 +1 @@ +ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA6NF8iallvQVp22WDkTkyrtvp9eWW6A8YVr+kz4TjGYe7gHzIw+niNltGEFHzD8+v1I2YJ6oXevct1YeS0o9HZyN1Q9qgCgzUFtdOKLv6IedplqoPkcmF0aYet2PkEDo3MlTBckFXPITAMzF8dJSIFo9D8HfdOV0IAdx4O7PtixWKn5y2hMNG0zQPyUecp4pzC6kivAIhyfHilFR61RGL+GPXQ2MWZWFYbAGjyiYJnAmCP3NOTd0jMZEnDkbUvxhMmBYSdETk1rRgm+R4LOzFUGaHqHDLKLX+FIPKcF96hrucXzcWyLbIbEgE98OHlnVYCzRdK8jlqm8tehUc9c9WhQ== vagrant insecure public key