website: add docs back to the main Vagrant repo
|
@ -35,3 +35,8 @@ doc/
|
||||||
.ruby-gemset
|
.ruby-gemset
|
||||||
.ruby-version
|
.ruby-version
|
||||||
.rvmrc
|
.rvmrc
|
||||||
|
|
||||||
|
# Website: docs
|
||||||
|
website/docs/.sass-cache
|
||||||
|
website/docs/build
|
||||||
|
website/docs/Rakefile
|
||||||
|
|
|
@ -0,0 +1,13 @@
|
||||||
|
source "https://rubygems.org"
|
||||||
|
|
||||||
|
gem "less", "~> 2.2.2"
|
||||||
|
gem "middleman", "~> 3.0.6"
|
||||||
|
gem "middleman-minify-html", "~> 3.0.0"
|
||||||
|
gem "rack-contrib", "~> 1.1.0"
|
||||||
|
gem "redcarpet", "~> 2.2.2"
|
||||||
|
gem "therubyracer", "~> 0.10.2"
|
||||||
|
gem "thin", "~> 1.5.0"
|
||||||
|
|
||||||
|
group :development do
|
||||||
|
gem "highline", "~> 1.6.15"
|
||||||
|
end
|
|
@ -0,0 +1 @@
|
||||||
|
web: bundle exec thin start -p $PORT
|
|
@ -0,0 +1,26 @@
|
||||||
|
# Vagrant Documentation
|
||||||
|
|
||||||
|
This is the repository for the [Vagrant Documentation website](http://docs.vagrantup.com).
|
||||||
|
|
||||||
|
This is a [Middleman](http://middlemanapp.com) project, which builds a static
|
||||||
|
site from these source files. The site is hosted on [Heroku](http://heroku.com)
|
||||||
|
and then fronted by [Fastly](http://fastly.com).
|
||||||
|
|
||||||
|
## Contributions Welcome!
|
||||||
|
|
||||||
|
If you find a typo or you feel like you can improve the HTML, CSS, or
|
||||||
|
JavaScript, we welcome contributions. Feel free to open issues or pull
|
||||||
|
requests like any normal GitHub project, and we'll merge it in.
|
||||||
|
|
||||||
|
## Running the Site Locally
|
||||||
|
|
||||||
|
Running the site locally is simple. Clone this repo and run the following
|
||||||
|
commands:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ bundle
|
||||||
|
$ bundle exec middleman server
|
||||||
|
```
|
||||||
|
|
||||||
|
Then open up `localhost:4567`. Note that some URLs you may need to append
|
||||||
|
".html" to make them work (in the navigation and such).
|
|
@ -0,0 +1,78 @@
|
||||||
|
###
|
||||||
|
# Compass
|
||||||
|
###
|
||||||
|
|
||||||
|
# Susy grids in Compass
|
||||||
|
# First: gem install susy --pre
|
||||||
|
# require 'susy'
|
||||||
|
|
||||||
|
# Change Compass configuration
|
||||||
|
# compass_config do |config|
|
||||||
|
# config.output_style = :compact
|
||||||
|
# end
|
||||||
|
|
||||||
|
###
|
||||||
|
# Page options, layouts, aliases and proxies
|
||||||
|
###
|
||||||
|
|
||||||
|
# Per-page layout changes:
|
||||||
|
#
|
||||||
|
# With no layout
|
||||||
|
# page "/path/to/file.html", :layout => false
|
||||||
|
#
|
||||||
|
# With alternative layout
|
||||||
|
# page "/path/to/file.html", :layout => :otherlayout
|
||||||
|
#
|
||||||
|
# A path which all have the same layout
|
||||||
|
# with_layout :admin do
|
||||||
|
# page "/admin/*"
|
||||||
|
# end
|
||||||
|
|
||||||
|
# Proxy (fake) files
|
||||||
|
# page "/this-page-has-no-template.html", :proxy => "/template-file.html" do
|
||||||
|
# @which_fake_page = "Rendering a fake page with a variable"
|
||||||
|
# end
|
||||||
|
|
||||||
|
###
|
||||||
|
# Helpers
|
||||||
|
###
|
||||||
|
|
||||||
|
# Automatic image dimensions on image_tag helper
|
||||||
|
# activate :automatic_image_sizes
|
||||||
|
|
||||||
|
# Methods defined in the helpers block are available in templates
|
||||||
|
# helpers do
|
||||||
|
# def some_helper
|
||||||
|
# "Helping"
|
||||||
|
# end
|
||||||
|
# end
|
||||||
|
|
||||||
|
set :css_dir, 'stylesheets'
|
||||||
|
set :js_dir, 'javascripts'
|
||||||
|
set :images_dir, 'images'
|
||||||
|
|
||||||
|
# Use the RedCarpet Markdown engine
|
||||||
|
set :markdown_engine, :redcarpet
|
||||||
|
set :markdown, :fenced_code_blocks => true
|
||||||
|
|
||||||
|
# Build-specific configuration
|
||||||
|
configure :build do
|
||||||
|
activate :asset_hash
|
||||||
|
activate :minify_css
|
||||||
|
activate :minify_html
|
||||||
|
activate :minify_javascript
|
||||||
|
|
||||||
|
# Enable cache buster
|
||||||
|
# activate :cache_buster
|
||||||
|
|
||||||
|
# Use relative URLs
|
||||||
|
# activate :relative_assets
|
||||||
|
|
||||||
|
# Compress PNGs after build
|
||||||
|
# First: gem install middleman-smusher
|
||||||
|
# require "middleman-smusher"
|
||||||
|
# activate :smusher
|
||||||
|
|
||||||
|
# Or use a different image path
|
||||||
|
# set :http_path, "/Content/images/"
|
||||||
|
end
|
|
@ -0,0 +1,44 @@
|
||||||
|
require "rack"
|
||||||
|
require "rack/auth/basic"
|
||||||
|
require "rack/contrib/not_found"
|
||||||
|
require "rack/contrib/response_headers"
|
||||||
|
require "rack/contrib/static_cache"
|
||||||
|
require "rack/contrib/try_static"
|
||||||
|
|
||||||
|
require File.expand_path("../lib/redirect_to_latest", __FILE__)
|
||||||
|
require File.expand_path("../lib/redirect_v1_docs", __FILE__)
|
||||||
|
|
||||||
|
# Properly compress the output if the client can handle it.
|
||||||
|
use Rack::Deflater
|
||||||
|
|
||||||
|
# Redirect the homepage to the latest documentation
|
||||||
|
use HashiCorp::Rack::RedirectToLatest
|
||||||
|
|
||||||
|
# Redirect the V1 documentation to the GitHub pages hosted version
|
||||||
|
use HashiCorp::Rack::RedirectV1Docs
|
||||||
|
|
||||||
|
# Set the "forever expire" cache headers for these static assets. Since
|
||||||
|
# we hash the contents of the assets to determine filenames, this is safe
|
||||||
|
# to do.
|
||||||
|
use Rack::StaticCache,
|
||||||
|
:root => "build",
|
||||||
|
:urls => ["/images", "/javascripts", "/stylesheets"],
|
||||||
|
:duration => 2,
|
||||||
|
:versioning => false
|
||||||
|
|
||||||
|
# For anything that matches below this point, we set the surrogate key
|
||||||
|
# for Fastly so that we can quickly purge all the pages without touching
|
||||||
|
# the static assets.
|
||||||
|
use Rack::ResponseHeaders do |headers|
|
||||||
|
headers["Surrogate-Key"] = "page"
|
||||||
|
end
|
||||||
|
|
||||||
|
# Try to find a static file that matches our request, since Middleman
|
||||||
|
# statically generates everything.
|
||||||
|
use Rack::TryStatic,
|
||||||
|
:root => "build",
|
||||||
|
:urls => ["/"],
|
||||||
|
:try => [".html", "index.html", "/index.html"]
|
||||||
|
|
||||||
|
# 404 if we reached this point. Sad times.
|
||||||
|
run Rack::NotFound.new(File.expand_path("../build/404.html", __FILE__))
|
|
@ -0,0 +1,19 @@
|
||||||
|
module SidebarHelpers
|
||||||
|
# This helps by setting the "current" class for sidebar nav elements
|
||||||
|
# if the YAML frontmatter matches the expected value.
|
||||||
|
def sidebar_current(expected)
|
||||||
|
current = current_page.data.sidebar_current
|
||||||
|
if current == expected || sidebar_section == expected
|
||||||
|
return " class=\"current\""
|
||||||
|
else
|
||||||
|
return ""
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# This returns the overall section of the documentation we're on.
|
||||||
|
def sidebar_section
|
||||||
|
current = current_page.data.sidebar_current
|
||||||
|
return "" if !current
|
||||||
|
current.split("-")[0]
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,25 @@
|
||||||
|
module HashiCorp
|
||||||
|
module Rack
|
||||||
|
# This redirects to the latest version of the docs.
|
||||||
|
class RedirectToLatest
|
||||||
|
def initialize(app)
|
||||||
|
@app = app
|
||||||
|
end
|
||||||
|
|
||||||
|
def call(env)
|
||||||
|
if env["PATH_INFO"] =~ /^\/$/
|
||||||
|
headers = {
|
||||||
|
"Content-Type" => "text/html",
|
||||||
|
"Location" => "/v2/",
|
||||||
|
"Surrogate-Key" => "page"
|
||||||
|
}
|
||||||
|
message = "Redirecting to new URL..."
|
||||||
|
|
||||||
|
return [301, headers, [message]]
|
||||||
|
end
|
||||||
|
|
||||||
|
@app.call(env)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,26 @@
|
||||||
|
module HashiCorp
|
||||||
|
module Rack
|
||||||
|
# This redirects the V1 docs to the GitHub pages hosted version.
|
||||||
|
class RedirectV1Docs
|
||||||
|
def initialize(app)
|
||||||
|
@app = app
|
||||||
|
end
|
||||||
|
|
||||||
|
def call(env)
|
||||||
|
if env["PATH_INFO"] =~ /^\/v1/
|
||||||
|
headers = {
|
||||||
|
"Content-Type" => "text/html",
|
||||||
|
"Location" => "http://docs-v1.vagrantup.com#{env["PATH_INFO"]}",
|
||||||
|
"Surrogate-Key" => "page"
|
||||||
|
}
|
||||||
|
|
||||||
|
message = "Redirecting to old documentation URL..."
|
||||||
|
|
||||||
|
return [301, headers, [message]]
|
||||||
|
end
|
||||||
|
|
||||||
|
@app.call(env)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,7 @@
|
||||||
|
<h2>Page Not Found</h4>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Sorry, the page you tried to visit doesn't exist. This could be our fault,
|
||||||
|
and if so we'll fix that up right away. Please go back, or go back
|
||||||
|
<a href="/">home</a> to get back on track.
|
||||||
|
</p>
|
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 1.8 KiB |
After Width: | Height: | Size: 1.9 KiB |
After Width: | Height: | Size: 16 KiB |
After Width: | Height: | Size: 11 KiB |
After Width: | Height: | Size: 69 KiB |
After Width: | Height: | Size: 888 B |
After Width: | Height: | Size: 2.2 KiB |
After Width: | Height: | Size: 12 KiB |
After Width: | Height: | Size: 909 B |
After Width: | Height: | Size: 5.6 KiB |
After Width: | Height: | Size: 3.6 KiB |
After Width: | Height: | Size: 2.6 KiB |
After Width: | Height: | Size: 4.6 KiB |
After Width: | Height: | Size: 122 B |
After Width: | Height: | Size: 557 B |
After Width: | Height: | Size: 166 KiB |
After Width: | Height: | Size: 190 KiB |
After Width: | Height: | Size: 176 KiB |
After Width: | Height: | Size: 104 KiB |
|
@ -0,0 +1,4 @@
|
||||||
|
/*! Backstretch - v2.0.1 - 2012-10-01
|
||||||
|
* http://srobbin.com/jquery-plugins/backstretch/
|
||||||
|
* Copyright (c) 2012 Scott Robbin; Licensed MIT */
|
||||||
|
(function(e,t,n){"use strict";e.fn.backstretch=function(r,s){return(r===n||r.length===0)&&e.error("No images were supplied for Backstretch"),e(t).scrollTop()===0&&t.scrollTo(0,0),this.each(function(){var t=e(this),n=t.data("backstretch");n&&(s=e.extend(n.options,s),n.destroy(!0)),n=new i(this,r,s),t.data("backstretch",n)})},e.backstretch=function(t,n){return e("body").backstretch(t,n).data("backstretch")},e.expr[":"].backstretch=function(t){return e(t).data("backstretch")!==n},e.fn.backstretch.defaults={centeredX:!0,centeredY:!0,duration:5e3,fade:0};var r={wrap:{left:0,top:0,overflow:"hidden",margin:0,padding:0,height:"100%",width:"100%",zIndex:-999999},img:{position:"absolute",display:"none",margin:0,padding:0,border:"none",width:"auto",height:"auto",maxWidth:"none",zIndex:-999999}},i=function(n,i,o){this.options=e.extend({},e.fn.backstretch.defaults,o||{}),this.images=e.isArray(i)?i:[i],e.each(this.images,function(){e("<img />")[0].src=this}),this.isBody=n===document.body,this.$container=e(n),this.$wrap=e('<div class="backstretch"></div>').css(r.wrap).appendTo(this.$container),this.$root=this.isBody?s?e(t):e(document):this.$container;if(!this.isBody){var u=this.$container.css("position"),a=this.$container.css("zIndex");this.$container.css({position:u==="static"?"relative":u,zIndex:a==="auto"?0:a,background:"none"}),this.$wrap.css({zIndex:-999998})}this.$wrap.css({position:this.isBody&&s?"fixed":"absolute"}),this.index=0,this.show(this.index),e(t).on("resize.backstretch",e.proxy(this.resize,this)).on("orientationchange.backstretch",e.proxy(function(){this.isBody&&t.pageYOffset===0&&(t.scrollTo(0,1),this.resize())},this))};i.prototype={resize:function(){try{var e={left:0,top:0},n=this.isBody?this.$root.width():this.$root.innerWidth(),r=n,i=this.isBody?t.innerHeight?t.innerHeight:this.$root.height():this.$root.innerHeight(),s=r/this.$img.data("ratio"),o;s>=i?(o=(s-i)/2,this.options.centeredY&&(e.top="-"+o+"px")):(s=i,r=s*this.$img.data("ratio"),o=(r-n)/2,this.options.centeredX&&(e.left="-"+o+"px")),this.$wrap.css({width:n,height:i}).find("img:not(.deleteable)").css({width:r,height:s}).css(e)}catch(u){}return this},show:function(t){if(Math.abs(t)>this.images.length-1)return;this.index=t;var n=this,i=n.$wrap.find("img").addClass("deleteable"),s=e.Event("backstretch.show",{relatedTarget:n.$container[0]});return clearInterval(n.interval),n.$img=e("<img />").css(r.img).bind("load",function(t){var r=this.width||e(t.target).width(),o=this.height||e(t.target).height();e(this).data("ratio",r/o),n.resize(),e(this).fadeIn(n.options.speed||n.options.fade,function(){i.remove(),n.paused||n.cycle(),n.$container.trigger(s)})}).appendTo(n.$wrap),n.$img.attr("src",n.images[t]),n},next:function(){return this.show(this.index<this.images.length-1?this.index+1:0)},prev:function(){return this.show(this.index===0?this.images.length-1:this.index-1)},pause:function(){return this.paused=!0,this},resume:function(){return this.paused=!1,this.next(),this},cycle:function(){return this.images.length>1&&(clearInterval(this.interval),this.interval=setInterval(e.proxy(function(){this.paused||this.next()},this),this.options.duration)),this},destroy:function(n){e(t).off("resize.backstretch orientationchange.backstretch"),clearInterval(this.interval),n||this.$wrap.remove(),this.$container.removeData("backstretch")}};var s=function(){var e=navigator.userAgent,n=navigator.platform,r=e.match(/AppleWebKit\/([0-9]+)/),i=!!r&&r[1],s=e.match(/Fennec\/([0-9]+)/),o=!!s&&s[1],u=e.match(/Opera Mobi\/([0-9]+)/),a=!!u&&u[1],f=e.match(/MSIE ([0-9]+)/),l=!!f&&f[1];return!((n.indexOf("iPhone")>-1||n.indexOf("iPad")>-1||n.indexOf("iPod")>-1)&&i&&i<534||t.operamini&&{}.toString.call(t.operamini)==="[object OperaMini]"||u&&a<7458||e.indexOf("Android")>-1&&i&&i<533||o&&o<6||"palmGetResource"in t&&i&&i<534||e.indexOf("MeeGo")>-1&&e.indexOf("NokiaBrowser/8.5.0")>-1||l&&l<=6)}()})(jQuery,window);
|
|
@ -0,0 +1,43 @@
|
||||||
|
/*global jQuery */
|
||||||
|
/*!
|
||||||
|
* FitText.js 1.1
|
||||||
|
*
|
||||||
|
* Copyright 2011, Dave Rupert http://daverupert.com
|
||||||
|
* Released under the WTFPL license
|
||||||
|
* http://sam.zoy.org/wtfpl/
|
||||||
|
*
|
||||||
|
* Date: Thu May 05 14:23:00 2011 -0600
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function( $ ){
|
||||||
|
|
||||||
|
$.fn.fitText = function( kompressor, options ) {
|
||||||
|
|
||||||
|
// Setup options
|
||||||
|
var compressor = kompressor || 1,
|
||||||
|
settings = $.extend({
|
||||||
|
'minFontSize' : Number.NEGATIVE_INFINITY,
|
||||||
|
'maxFontSize' : Number.POSITIVE_INFINITY
|
||||||
|
}, options);
|
||||||
|
|
||||||
|
return this.each(function(){
|
||||||
|
|
||||||
|
// Store the object
|
||||||
|
var $this = $(this);
|
||||||
|
|
||||||
|
// Resizer() resizes items based on the object width divided by the compressor * 10
|
||||||
|
var resizer = function () {
|
||||||
|
$this.css('font-size', Math.max(Math.min($this.width() / (compressor*10), parseFloat(settings.maxFontSize)), parseFloat(settings.minFontSize)));
|
||||||
|
};
|
||||||
|
|
||||||
|
// Call once to set.
|
||||||
|
resizer();
|
||||||
|
|
||||||
|
// Call on resize. Opera debounces their resize by default.
|
||||||
|
$(window).on('resize', resizer);
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
})( jQuery );
|
|
@ -0,0 +1,161 @@
|
||||||
|
/*
|
||||||
|
* Heads-Up Grid
|
||||||
|
* Simple HTML + CSS grid overlay for web design and development.
|
||||||
|
*
|
||||||
|
* Files: hugrid.css, hugrid.js, example.html
|
||||||
|
*
|
||||||
|
* Example and documentation at: http://bohemianalps.com/tools/grid
|
||||||
|
*
|
||||||
|
* Shurane, thanks for your help! https://github.com/shurane
|
||||||
|
*
|
||||||
|
* Copyright (c) 2011 Jason Simanek
|
||||||
|
*
|
||||||
|
* Version: 1.5 (09/03/2011)
|
||||||
|
* Requires: jQuery v1.6+
|
||||||
|
*
|
||||||
|
* Licensed under the GPL license:
|
||||||
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
|
*/
|
||||||
|
|
||||||
|
;(function ($) {
|
||||||
|
// "use strict";
|
||||||
|
|
||||||
|
window.hugrid = {
|
||||||
|
toggleState : function() {
|
||||||
|
// change our indicators of state
|
||||||
|
if (window.hugrid.state == 'on') {
|
||||||
|
window.hugrid.state = 'off' ;
|
||||||
|
}
|
||||||
|
else if( window.hugrid.state == 'off'){
|
||||||
|
window.hugrid.state = 'on' ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} ;
|
||||||
|
|
||||||
|
makehugrid = function () {
|
||||||
|
|
||||||
|
// called at startup. Remove grids, clear state.
|
||||||
|
initialCleanUp() ;
|
||||||
|
|
||||||
|
/* Column Container */
|
||||||
|
var hugridDiv = document.createElement("div");
|
||||||
|
hugridDiv.id = "hugrid";
|
||||||
|
|
||||||
|
/* Left Margin Column */
|
||||||
|
leftDiv = document.createElement("div");
|
||||||
|
leftDiv.className = "mline mlineL";
|
||||||
|
hugridDiv.appendChild(leftDiv);
|
||||||
|
|
||||||
|
/* Create Columns */
|
||||||
|
for (var i = 0; i < (columns - 1); i++) {
|
||||||
|
colDiv = document.createElement("div");
|
||||||
|
colDiv.className = "hugcol";
|
||||||
|
hugridDiv.appendChild(colDiv);
|
||||||
|
lineLDiv = document.createElement("div");
|
||||||
|
lineLDiv.className = "lineL";
|
||||||
|
colDiv.appendChild(lineLDiv);
|
||||||
|
lineRDiv = document.createElement("div");
|
||||||
|
lineRDiv.className = "lineR";
|
||||||
|
colDiv.appendChild(lineRDiv);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Right Margin Column */
|
||||||
|
rightDiv = document.createElement("div");
|
||||||
|
rightDiv.className = "mline mlineR";
|
||||||
|
hugridDiv.appendChild(rightDiv);
|
||||||
|
|
||||||
|
document.body.appendChild(hugridDiv);
|
||||||
|
|
||||||
|
/* If Rows */
|
||||||
|
if (rowheight !== 0) {
|
||||||
|
/* Row Container */
|
||||||
|
pageheight = $(document.body).height();
|
||||||
|
var hugridRows = document.createElement("div") ;
|
||||||
|
hugridRows.id = "hugridRows";
|
||||||
|
/* Create Rows */
|
||||||
|
for (var i = 0; i < (pageheight / rowheight); i++) {
|
||||||
|
rowDiv = document.createElement("div");
|
||||||
|
rowDiv.className = "hugrow";
|
||||||
|
hugridRows.appendChild(rowDiv);
|
||||||
|
lineB = document.createElement("div");
|
||||||
|
lineB.className = "lineB";
|
||||||
|
rowDiv.appendChild(lineB);
|
||||||
|
}
|
||||||
|
|
||||||
|
document.body.appendChild(hugridRows);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Apply CSS Properties */
|
||||||
|
$('#hugrid').css('width', pagewidth + pageUnits);
|
||||||
|
|
||||||
|
if (typeof window.pageleftmargin === 'number') {
|
||||||
|
$('#hugrid').css('left', pageleftmargin + pageUnits);
|
||||||
|
$('#hugrid').css('margin', '0');
|
||||||
|
} else if (typeof window.pagerightmargin === 'number') {
|
||||||
|
$('#hugrid').css('right', pagerightmargin + pageUnits);
|
||||||
|
$('#hugrid').css('left', 'auto');
|
||||||
|
$('#hugrid').css('margin', '0');
|
||||||
|
} else {
|
||||||
|
if (pageUnits === '%') {
|
||||||
|
$('#hugrid').css('left', ((100 - pagewidth) / 2) + pageUnits);
|
||||||
|
$('#hugrid').css('margin-left', 'auto');
|
||||||
|
} else {
|
||||||
|
$('#hugrid').css('margin-left', '-' + (pagewidth / 2) + pageUnits);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$('#hugrid div.hugcol').css('margin-left', columnwidth + colUnits);
|
||||||
|
$('#hugrid div.hugcol').css('width', gutterwidth + colUnits);
|
||||||
|
$('#hugridRows').css('margin-top', pagetopmargin + 'px');
|
||||||
|
$('#hugridRows div.hugrow').css('margin-top', (rowheight - 1) + 'px');
|
||||||
|
|
||||||
|
/* Create hugridUX and button */
|
||||||
|
var hugridUX = document.createElement("div");
|
||||||
|
hugridUX.id = "hugridUX";
|
||||||
|
document.body.appendChild(hugridUX);
|
||||||
|
$('#hugridUX').append('<div id="hugridButtonBkgd"></div><button id="hugridButton"></button>');
|
||||||
|
$('#hugridButton').append('<span id="hugbuttonON">ON</span>');
|
||||||
|
$('#hugridButton').append('<span id="hugbuttonOFF" style="display:none;">OFF</span>');
|
||||||
|
|
||||||
|
/* On/Off Button - click functionality */
|
||||||
|
$('#hugridButton').click(function () {
|
||||||
|
$('#hugridButton').toggleClass('buttonisoff') ;
|
||||||
|
$('#hugrid').toggle();
|
||||||
|
$('#hugridRows').toggle();
|
||||||
|
$("#hugridButton span").toggle();
|
||||||
|
window.hugrid.toggleState() ;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
function initialCleanUp() {
|
||||||
|
/* Remove Previously Existing Grid Elements */
|
||||||
|
$('#hugrid').remove();
|
||||||
|
$('#hugridRows').remove();
|
||||||
|
$('#hugridUX').remove();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
setgridonload = function () {
|
||||||
|
if ( gridonload === 'off') {
|
||||||
|
$('#hugridButton').toggleClass('buttonisoff') ;
|
||||||
|
$('#hugrid').toggle();
|
||||||
|
$('#hugridRows').toggle();
|
||||||
|
$("#hugridButton span").toggle();
|
||||||
|
window.hugrid.state = 'off'
|
||||||
|
} else {
|
||||||
|
window.hugrid.state = 'on'
|
||||||
|
}
|
||||||
|
} ;
|
||||||
|
|
||||||
|
|
||||||
|
setgridonresize = function () {
|
||||||
|
if ( window.hugrid.state === 'off') {
|
||||||
|
$('#hugridButton').toggleClass('buttonisoff') ;
|
||||||
|
$('#hugrid').toggle();
|
||||||
|
$('#hugridRows').toggle();
|
||||||
|
$("#hugridButton span").toggle();
|
||||||
|
}
|
||||||
|
} ;
|
||||||
|
|
||||||
|
})(jQuery);
|
|
@ -0,0 +1,15 @@
|
||||||
|
// add dropshadow to nav on scroll
|
||||||
|
$(document).ready(function(){
|
||||||
|
$(document).scroll(function() {
|
||||||
|
var top = $(document).scrollTop();
|
||||||
|
if (top > 0) $('nav').addClass("drop-shadow");
|
||||||
|
if (top === 0) $('nav').removeClass("drop-shadow");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// open/close documentation side nav on small screens
|
||||||
|
$(document).ready(function(){
|
||||||
|
$(".toggle").click(function() {
|
||||||
|
$(".sidebar-nav ul").slideToggle('slow');
|
||||||
|
});
|
||||||
|
});
|
|
@ -0,0 +1,265 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Vagrant Documentation</title>
|
||||||
|
|
||||||
|
<!-- meta -->
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
|
||||||
|
|
||||||
|
<!-- lib styles -->
|
||||||
|
<%= stylesheet_link_tag "bootstrap", "vagrantup" %>
|
||||||
|
|
||||||
|
<!-- lib js -->
|
||||||
|
<%= javascript_include_tag "jquery" %>
|
||||||
|
<%= javascript_include_tag "modernizr" %>
|
||||||
|
<%= javascript_include_tag "bootstrap.min" %>
|
||||||
|
<%= javascript_include_tag "backstretch" %>
|
||||||
|
<%= javascript_include_tag "vagrantup" %>
|
||||||
|
|
||||||
|
<!-- fonts -->
|
||||||
|
<link href='http://fonts.googleapis.com/css?family=Inconsolata' rel='stylesheet' type='text/css'>
|
||||||
|
<script type="text/javascript" src="http://use.typekit.net/xfs6zus.js"></script>
|
||||||
|
<script type="text/javascript">try{Typekit.load();}catch(e){}</script>
|
||||||
|
|
||||||
|
<!-- Google analytics -->
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<!-- wrap everything -->
|
||||||
|
<div class="wrapper">
|
||||||
|
|
||||||
|
<!-- nav -->
|
||||||
|
|
||||||
|
<nav class="docs">
|
||||||
|
<!-- vagrant logo -->
|
||||||
|
<a class="vagrant-docs-logo" href="/">Vagrant Documentation</a>
|
||||||
|
<!-- nav -->
|
||||||
|
<ul class="pull-right unstyled">
|
||||||
|
<li><a href="http://www.vagrantup.com/">Home</a></li>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<div class="page docs docs-home">
|
||||||
|
<div class="container">
|
||||||
|
<div class="row">
|
||||||
|
|
||||||
|
<div class="sidebar span3">
|
||||||
|
<!-- get the sidebar nav -->
|
||||||
|
<!-- side nav docs -->
|
||||||
|
<aside class="sidebar-nav">
|
||||||
|
|
||||||
|
<div class="toggle hidden-desktop">
|
||||||
|
<div class="open-close open"></div>
|
||||||
|
<a href="#">Contents</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<ul class="unstyled">
|
||||||
|
<li<%= sidebar_current("overview") %>><a href="/v2/">Overview</a></li>
|
||||||
|
|
||||||
|
<li<%= sidebar_current("why") %>><a href="/v2/why-vagrant/index.html">Why Vagrant?</a></li>
|
||||||
|
|
||||||
|
<li<%= sidebar_current("installation") %>><a href="/v2/installation/index.html">Installation</a></li>
|
||||||
|
<% if sidebar_section == "installation" %>
|
||||||
|
<ul class="sub unstyled">
|
||||||
|
<li<%= sidebar_current("installation-backwards-compatibility") %>><a href="/v2/installation/backwards-compatibility.html">Backwards Compatibility</a></li>
|
||||||
|
<li<%= sidebar_current("installation-upgrading") %>><a href="/v2/installation/upgrading.html">Upgrading</a></li>
|
||||||
|
<li<%= sidebar_current("installation-upgrading-1-0") %>><a href="/v2/installation/upgrading-from-1-0.html">Upgrading from 1.0.x</a></li>
|
||||||
|
<li<%= sidebar_current("installation-uninstallation") %>><a href="/v2/installation/uninstallation.html">Uninstallation</a></li>
|
||||||
|
</ul>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<li<%= sidebar_current("gettingstarted") %>><a href="/v2/getting-started/index.html">Getting Started</a></li>
|
||||||
|
<% if sidebar_section == "gettingstarted" %>
|
||||||
|
<ul class="sub unstyled">
|
||||||
|
<li<%= sidebar_current("gettingstarted-projectsetup") %>><a href="/v2/getting-started/project_setup.html">Project Setup</a></li>
|
||||||
|
<li<%= sidebar_current("gettingstarted-boxes") %>><a href="/v2/getting-started/boxes.html">Boxes</a></li>
|
||||||
|
<li<%= sidebar_current("gettingstarted-up") %>><a href="/v2/getting-started/up.html">Up and SSH</a></li>
|
||||||
|
<li<%= sidebar_current("gettingstarted-syncedfolders") %>><a href="/v2/getting-started/synced_folders.html">Synced Folders</a></li>
|
||||||
|
<li<%= sidebar_current("gettingstarted-provisioning") %>><a href="/v2/getting-started/provisioning.html">Provisioning</a></li>
|
||||||
|
<li<%= sidebar_current("gettingstarted-networking") %>><a href="/v2/getting-started/networking.html">Networking</a></li>
|
||||||
|
<li<%= sidebar_current("gettingstarted-teardown") %>><a href="/v2/getting-started/teardown.html">Teardown</a></li>
|
||||||
|
<li<%= sidebar_current("gettingstarted-rebuild") %>><a href="/v2/getting-started/rebuild.html">Rebuild</a></li>
|
||||||
|
<li<%= sidebar_current("gettingstarted-providers") %>><a href="/v2/getting-started/providers.html">Providers</a></li>
|
||||||
|
</ul>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<li<%= sidebar_current("cli") %>><a href="/v2/cli/index.html">Command-Line Interface</a></li>
|
||||||
|
<% if sidebar_section == "cli" %>
|
||||||
|
<ul class="sub unstyled">
|
||||||
|
<li<%= sidebar_current("cli-box") %>><a href="/v2/cli/box.html">box</a></li>
|
||||||
|
<li<%= sidebar_current("cli-destroy") %>><a href="/v2/cli/destroy.html">destroy</a></li>
|
||||||
|
<li<%= sidebar_current("cli-halt") %>><a href="/v2/cli/halt.html">halt</a></li>
|
||||||
|
<li<%= sidebar_current("cli-init") %>><a href="/v2/cli/init.html">init</a></li>
|
||||||
|
<li<%= sidebar_current("cli-package") %>><a href="/v2/cli/package.html">package</a></li>
|
||||||
|
<li<%= sidebar_current("cli-plugin") %>><a href="/v2/cli/plugin.html">plugin</a></li>
|
||||||
|
<li<%= sidebar_current("cli-provision") %>><a href="/v2/cli/provision.html">provision</a></li>
|
||||||
|
<li<%= sidebar_current("cli-reload") %>><a href="/v2/cli/reload.html">reload</a></li>
|
||||||
|
<li<%= sidebar_current("cli-resume") %>><a href="/v2/cli/resume.html">resume</a></li>
|
||||||
|
<li<%= sidebar_current("cli-ssh") %>><a href="/v2/cli/ssh.html">ssh</a></li>
|
||||||
|
<li<%= sidebar_current("cli-ssh_config") %>><a href="/v2/cli/ssh_config.html">ssh-config</a></li>
|
||||||
|
<li<%= sidebar_current("cli-status") %>><a href="/v2/cli/status.html">status</a></li>
|
||||||
|
<li<%= sidebar_current("cli-suspend") %>><a href="/v2/cli/suspend.html">suspend</a></li>
|
||||||
|
<li<%= sidebar_current("cli-up") %>><a href="/v2/cli/up.html">up</a></li>
|
||||||
|
</ul>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<li <%= sidebar_current("vagrantfile") %>><a href="/v2/vagrantfile/index.html">Vagrantfile</a></li>
|
||||||
|
<% if sidebar_section == "vagrantfile" %>
|
||||||
|
<ul class="sub unstyled">
|
||||||
|
<li<%= sidebar_current("vagrantfile-version") %>><a href="/v2/vagrantfile/version.html">Configuration Version</a></li>
|
||||||
|
<li<%= sidebar_current("vagrantfile-machine") %>><a href="/v2/vagrantfile/machine_settings.html">Machine Settings</a></li>
|
||||||
|
<li<%= sidebar_current("vagrantfile-ssh") %>><a href="/v2/vagrantfile/ssh_settings.html">SSH Settings</a></li>
|
||||||
|
<li<%= sidebar_current("vagrantfile-vagrant") %>><a href="/v2/vagrantfile/vagrant_settings.html">Vagrant Settings</a></li>
|
||||||
|
</ul>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<li<%= sidebar_current("boxes") %>><a href="/v2/boxes.html">Boxes</a></li>
|
||||||
|
<% if sidebar_section == "boxes" %>
|
||||||
|
<ul class="sub unstyled">
|
||||||
|
<li<%= sidebar_current("boxes-format") %>><a href="/v2/boxes/format.html">Box File Format</a></li>
|
||||||
|
</ul>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<li<%= sidebar_current("provisioning") %>><a href="/v2/provisioning/index.html">Provisioning</a></li>
|
||||||
|
<% if sidebar_section == "provisioning" %>
|
||||||
|
<ul class="sub unstyled">
|
||||||
|
<li<%= sidebar_current("provisioning-basic") %>><a href="/v2/provisioning/basic_usage.html">Basic Usage</a></li>
|
||||||
|
<li<%= sidebar_current("provisioning-shell") %>><a href="/v2/provisioning/shell.html">Shell</a></li>
|
||||||
|
<li<%= sidebar_current("provisioning-ansible") %>><a href="/v2/provisioning/ansible.html">Ansible</a></li>
|
||||||
|
<li<%= sidebar_current("provisioning-chefsolo") %>><a href="/v2/provisioning/chef_solo.html">Chef Solo</a></li>
|
||||||
|
<li<%= sidebar_current("provisioning-chefclient") %>><a href="/v2/provisioning/chef_client.html">Chef Client</a></li>
|
||||||
|
<li<%= sidebar_current("provisioning-puppetapply") %>><a href="/v2/provisioning/puppet_apply.html">Puppet Apply</a></li>
|
||||||
|
<li<%= sidebar_current("provisioning-puppetagent") %>><a href="/v2/provisioning/puppet_agent.html">Puppet Agent</a></li>
|
||||||
|
</ul>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<li<%= sidebar_current("networking") %>><a href="/v2/networking/index.html">Networking</a></li>
|
||||||
|
<% if sidebar_section == "networking" %>
|
||||||
|
<ul class="sub unstyled">
|
||||||
|
<li<%= sidebar_current("networking-basic") %>><a href="/v2/networking/basic_usage.html">Basic Usage</a></li>
|
||||||
|
<li<%= sidebar_current("networking-fp") %>><a href="/v2/networking/forwarded_ports.html">Forwarded Ports</a></li>
|
||||||
|
<li<%= sidebar_current("networking-private") %>><a href="/v2/networking/private_network.html">Private Network</a></li>
|
||||||
|
<li<%= sidebar_current("networking-public") %>><a href="/v2/networking/public_network.html">Public Network</a></li>
|
||||||
|
</ul>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<li<%= sidebar_current("syncedfolder") %>><a href="/v2/synced-folders/index.html">Synced Folders</a></li>
|
||||||
|
<% if sidebar_section == "syncedfolder" %>
|
||||||
|
<ul class="sub unstyled">
|
||||||
|
<li<%= sidebar_current("syncedfolder-basic") %>><a href="/v2/synced-folders/basic_usage.html">Basic Usage</a></li>
|
||||||
|
<li<%= sidebar_current("syncedfolder-nfs") %>><a href="/v2/synced-folders/nfs.html">NFS</a></li>
|
||||||
|
</ul>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<li<%= sidebar_current("multimachine") %>><a href="/v2/multi-machine/index.html">Multi-Machine</a></li>
|
||||||
|
|
||||||
|
<li<%= sidebar_current("providers") %>><a href="/v2/providers/index.html">Providers</a></li>
|
||||||
|
<% if sidebar_section == "providers" %>
|
||||||
|
<ul class="sub unstyled">
|
||||||
|
<li<%= sidebar_current("providers-installation") %>><a href="/v2/providers/installation.html">Installation</a></li>
|
||||||
|
<li<%= sidebar_current("providers-basic-usage") %>><a href="/v2/providers/basic_usage.html">Basic Usage</a></li>
|
||||||
|
<li<%= sidebar_current("providers-configuration") %>><a href="/v2/providers/configuration.html">Configuration</a></li>
|
||||||
|
<li<%= sidebar_current("providers-custom") %>><a href="/v2/providers/custom.html">Custom Provider</a></li>
|
||||||
|
</ul> <!-- /.sub -->
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<li<%= sidebar_current("virtualbox") %>><a href="/v2/virtualbox/index.html">VirtualBox</a></li>
|
||||||
|
<% if sidebar_section == "virtualbox" %>
|
||||||
|
<ul class="sub unstyled">
|
||||||
|
<li<%= sidebar_current("virtualbox-usage") %>><a href="/v2/virtualbox/usage.html">Usage</a></li>
|
||||||
|
<li<%= sidebar_current("virtualbox-boxes") %>><a href="/v2/virtualbox/boxes.html">Boxes</a></li>
|
||||||
|
<li<%= sidebar_current("virtualbox-configuration") %>><a href="/v2/virtualbox/configuration.html">Configuration</a></li>
|
||||||
|
</ul>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<li<%= sidebar_current("vmware") %>><a href="/v2/vmware/index.html">VMware</a></li>
|
||||||
|
<% if sidebar_section == "vmware" %>
|
||||||
|
<ul class="sub unstyled">
|
||||||
|
<li<%= sidebar_current("vmware-installation") %>><a href="/v2/vmware/installation.html">Installation</a></li>
|
||||||
|
<li<%= sidebar_current("vmware-usage") %>><a href="/v2/vmware/usage.html">Usage</a></li>
|
||||||
|
<li<%= sidebar_current("vmware-boxes") %>><a href="/v2/vmware/boxes.html">Boxes</a></li>
|
||||||
|
<li<%= sidebar_current("vmware-configuration") %>><a href="/v2/vmware/configuration.html">Configuration</a></li>
|
||||||
|
<li<%= sidebar_current("vmware-known-issues") %>><a href="/v2/vmware/known-issues.html">Known Issues</a></li>
|
||||||
|
</ul>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<li<%= sidebar_current("plugins") %>><a href="/v2/plugins/index.html">Plugins</a></li>
|
||||||
|
<% if sidebar_section == "plugins" %>
|
||||||
|
<ul class="sub unstyled">
|
||||||
|
<li<%= sidebar_current("plugins-usage") %>><a href="/v2/plugins/usage.html">Usage</a></li>
|
||||||
|
<li<%= sidebar_current("plugins-development-basics") %>><a href="/v2/plugins/development-basics.html">Plugin Development Basics</a></li>
|
||||||
|
<li<%= sidebar_current("plugins-commands") %>><a href="/v2/plugins/commands.html">Commands</a></li>
|
||||||
|
<li<%= sidebar_current("plugins-configuration") %>><a href="/v2/plugins/configuration.html">Configuration</a></li>
|
||||||
|
<li<%= sidebar_current("plugins-guests") %>><a href="/v2/plugins/guests.html">Guests</a></li>
|
||||||
|
<li<%= sidebar_current("plugins-guestcapabilities") %>><a href="/v2/plugins/guest-capabilities.html">Guest Capabilities</a></li>
|
||||||
|
<li<%= sidebar_current("plugins-hosts") %>><a href="/v2/plugins/hosts.html">Hosts</a></li>
|
||||||
|
<li<%= sidebar_current("plugins-providers") %>><a href="/v2/plugins/providers.html">Providers</a></li>
|
||||||
|
<li<%= sidebar_current("plugins-provisioners") %>><a href="/v2/plugins/provisioners.html">Provisioners</a></li>
|
||||||
|
<li<%= sidebar_current("plugins-packaging") %>><a href="/v2/plugins/packaging.html">Packaging & Distribution</a></li>
|
||||||
|
</ul>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<li<%= sidebar_current("debugging") %>><a href="/v2/debugging.html">Debugging</a></li>
|
||||||
|
</ul>
|
||||||
|
</aside> <!-- /.sidebar -->
|
||||||
|
</div> <!-- /.sidebar -->
|
||||||
|
|
||||||
|
<div class="page-contents span9">
|
||||||
|
<div class="page-background"></div>
|
||||||
|
|
||||||
|
<!-- start page content -->
|
||||||
|
<div class="row">
|
||||||
|
<div class="span8 offset1">
|
||||||
|
<%= yield %>
|
||||||
|
</div> <!-- /.span8 -->
|
||||||
|
</div> <!-- /.row -->
|
||||||
|
</div> <!-- /.page-contents -->
|
||||||
|
</div> <!-- /.row -->
|
||||||
|
</div> <!-- /.container -->
|
||||||
|
</div> <!-- /.page -->
|
||||||
|
|
||||||
|
<!-- footer -->
|
||||||
|
<footer>
|
||||||
|
<div class="container">
|
||||||
|
<div class="row">
|
||||||
|
<div class="span12">
|
||||||
|
|
||||||
|
<ul class="unstyled footer-nav">
|
||||||
|
<li><a href="http://docs.vagrantup.com/">Documentation</a></li>
|
||||||
|
<li><a href="http://www.vagrantup.com/about">About</a></li>
|
||||||
|
<li><a href="http://www.vagrantup.com/support">Support</a></li>
|
||||||
|
<a href="http://downloads.vagrantup.com/">
|
||||||
|
<li class="button inline-button">Download</li>
|
||||||
|
</a>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<ul class="unstyled logos">
|
||||||
|
<a href="http://www.vagrantup.com">
|
||||||
|
<li class="vagrant-logo-monochrome"></li>
|
||||||
|
</a>
|
||||||
|
<li><span>by</span></li>
|
||||||
|
<a href="http://www.hashicorp.com">
|
||||||
|
<li class="hashi-logo-monochrome "></li>
|
||||||
|
</a>
|
||||||
|
</ul> <!-- /span -->
|
||||||
|
|
||||||
|
</div> <!-- /span -->
|
||||||
|
</div> <!-- /row -->
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<h6 class="legal">
|
||||||
|
© 2013 HashiCorp
|
||||||
|
</h6>
|
||||||
|
</div> <!-- row -->
|
||||||
|
</div> <!-- container -->
|
||||||
|
</footer>
|
||||||
|
|
||||||
|
<!-- close .wrapper -->
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- load scripts -->
|
||||||
|
<!-- load full-width image into any div with class="big-background -->
|
||||||
|
<script>
|
||||||
|
$(".big-background").backstretch("assets/photos/full_width.jpg");
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,321 @@
|
||||||
|
html {
|
||||||
|
font-size: 100%;
|
||||||
|
-webkit-text-size-adjust: 100%;
|
||||||
|
-ms-text-size-adjust: 100%;
|
||||||
|
text-rendering: optimizeLegibility;
|
||||||
|
-webkit-tap-highlight-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
font-family: @sans-serif-stack;
|
||||||
|
font-size: @base-font-size;
|
||||||
|
line-height: @base-line-height;
|
||||||
|
color: @black;
|
||||||
|
background-color: @white;
|
||||||
|
letter-spacing: 2px;
|
||||||
|
.museo-sans-regular;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wrapper {
|
||||||
|
margin-top: 80px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.container {
|
||||||
|
z-index: 999; //keep content on top
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1,
|
||||||
|
h2,
|
||||||
|
h3,
|
||||||
|
h4,
|
||||||
|
h5,
|
||||||
|
h6 {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
color: inherit;
|
||||||
|
text-rendering: optimizelegibility;
|
||||||
|
.museo-sans-bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
@font-size: 70px;
|
||||||
|
font-size: @font-size;
|
||||||
|
line-height: 80px;
|
||||||
|
letter-spacing: 3px;
|
||||||
|
|
||||||
|
span {
|
||||||
|
font-size: @headline-span-size;
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.all-caps {
|
||||||
|
text-transform: uppercase;
|
||||||
|
text-align: center;
|
||||||
|
font-size: 40px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
@font-size: 30px;
|
||||||
|
font-size: @font-size;
|
||||||
|
line-height: 35px;
|
||||||
|
}
|
||||||
|
|
||||||
|
h3 {
|
||||||
|
@font-size: 30px;
|
||||||
|
font-size: @font-size;
|
||||||
|
line-height: @font-size;
|
||||||
|
}
|
||||||
|
|
||||||
|
h4 {
|
||||||
|
@font-size: 24px;
|
||||||
|
font-size: @font-size;
|
||||||
|
line-height: @font-size;
|
||||||
|
}
|
||||||
|
|
||||||
|
h5 {
|
||||||
|
@font-size: 20px;
|
||||||
|
font-size: @font-size;
|
||||||
|
line-height: @font-size;
|
||||||
|
}
|
||||||
|
|
||||||
|
h6 {
|
||||||
|
@font-size: 12px;
|
||||||
|
font-size: @font-size;
|
||||||
|
line-height: @font-size;
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
letter-spacing: 1px;
|
||||||
|
line-height: 32px;
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: @docs-blue;
|
||||||
|
text-decoration: none;
|
||||||
|
border-bottom: 1px solid @docs-blue;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
text-decoration: none;
|
||||||
|
color: darken(@blue, 10%);
|
||||||
|
border-bottom: 1px solid darken(@blue, 10%);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: inherit;
|
||||||
|
text-decoration: none;
|
||||||
|
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
text-decoration: none;
|
||||||
|
color: @purple;
|
||||||
|
.animate-text-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:active {
|
||||||
|
color: @blue;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:visited {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ul {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
li {
|
||||||
|
line-height: @base-line-height;
|
||||||
|
}
|
||||||
|
|
||||||
|
blockquote {
|
||||||
|
border: none;
|
||||||
|
margin: 60px;
|
||||||
|
|
||||||
|
p { // blockquote p
|
||||||
|
font-size: @base-font-size * 2;
|
||||||
|
line-height: @base-line-height * 2;
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
strong {
|
||||||
|
.museo-sans-bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
em {
|
||||||
|
.museo-sans-regular-italic;
|
||||||
|
}
|
||||||
|
|
||||||
|
br {
|
||||||
|
display:block;
|
||||||
|
line-height: (@baseline * 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
pre,
|
||||||
|
code {
|
||||||
|
font-family: @mono-stack;
|
||||||
|
}
|
||||||
|
|
||||||
|
code {
|
||||||
|
font-size: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
pre {
|
||||||
|
border: none;
|
||||||
|
font-size: @base-font-size;
|
||||||
|
background: @black;
|
||||||
|
color: @white;
|
||||||
|
padding: 20px;
|
||||||
|
line-height: @base-line-height;
|
||||||
|
margin-top: 20px;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
|
||||||
|
span {
|
||||||
|
color: @code-highlight-text;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
hr {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.vr {
|
||||||
|
width: 2px;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
form {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
input {
|
||||||
|
letter-spacing: 3px;
|
||||||
|
|
||||||
|
&:focus {
|
||||||
|
outline: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
::-webkit-input-placeholder {
|
||||||
|
overflow: visible;
|
||||||
|
padding-top: 3px;
|
||||||
|
color: @light-gray-text;
|
||||||
|
}
|
||||||
|
|
||||||
|
input:-moz-placeholder {
|
||||||
|
overflow: visible;
|
||||||
|
padding-top: 3px;
|
||||||
|
color: @light-gray-text;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* type and styles */
|
||||||
|
::selection, ::-moz-selection {
|
||||||
|
background: ; /* highlight color */
|
||||||
|
}
|
||||||
|
|
||||||
|
.meta,
|
||||||
|
.legal,
|
||||||
|
.date {
|
||||||
|
color: @medium-gray-text;
|
||||||
|
line-height: @base-line-height;
|
||||||
|
.museo-sans-regular;
|
||||||
|
}
|
||||||
|
|
||||||
|
.date {
|
||||||
|
text-transform: uppercase;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button {
|
||||||
|
color: @white;
|
||||||
|
text-align: center;
|
||||||
|
background-color: @primary-button-color;
|
||||||
|
display: block;
|
||||||
|
padding: 15px 0;
|
||||||
|
margin-top: 20px !important;
|
||||||
|
text-transform: uppercase;
|
||||||
|
font-size: 25px;
|
||||||
|
letter-spacing: 5px;
|
||||||
|
.museo-sans-light;
|
||||||
|
.rounded;
|
||||||
|
.hover;
|
||||||
|
|
||||||
|
&.inline-button {
|
||||||
|
background-color: @vagrant-blue;
|
||||||
|
padding: 5px 20px;
|
||||||
|
color: @white !important;
|
||||||
|
font-size: 15px;
|
||||||
|
letter-spacing: 1px;
|
||||||
|
.rounded;
|
||||||
|
|
||||||
|
a,
|
||||||
|
a:hover {
|
||||||
|
color: @white;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&.white-button {
|
||||||
|
background: fade(@white, 20%);
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background: fade(@white, 30%);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&.secondary-button {
|
||||||
|
background: @light-gray;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background: @purple;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&.with-carat span {
|
||||||
|
margin-right: -10px; //recenter text if there's a carat after text
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
span {
|
||||||
|
// button text styles can go here
|
||||||
|
}
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background-color: @purple;
|
||||||
|
.animate-background-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:active {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
&.disabled {
|
||||||
|
background-color: @light-gray-background;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
a.read-more {
|
||||||
|
color: @blue;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
color: darken(@blue, 10%);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// misc. styles
|
||||||
|
.loading {
|
||||||
|
text-align: center;
|
||||||
|
font-size: @base-font-size;
|
||||||
|
text-transform: uppercase;
|
||||||
|
letter-spacing: 5px;
|
||||||
|
color: @medium-gray-text;
|
||||||
|
padding: 30px 0 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pinned {
|
||||||
|
position:fixed;
|
||||||
|
}
|
|
@ -0,0 +1,74 @@
|
||||||
|
/* compontents */
|
||||||
|
|
||||||
|
//search
|
||||||
|
.search-bar {
|
||||||
|
border-bottom: 1px solid fade(@black, 10%);
|
||||||
|
position: relative;
|
||||||
|
z-index: 99999; //keep search above content
|
||||||
|
margin-bottom: -1px;
|
||||||
|
|
||||||
|
.search-icon {
|
||||||
|
height: 60px;
|
||||||
|
width: 40px;
|
||||||
|
background: url(/images/search_icon.png) no-repeat 0 center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.search {
|
||||||
|
//.debug;
|
||||||
|
background: @white;
|
||||||
|
height: 60px;
|
||||||
|
|
||||||
|
input,
|
||||||
|
button,
|
||||||
|
form {
|
||||||
|
.kill-effects;
|
||||||
|
border: none;
|
||||||
|
height: 60px;
|
||||||
|
font-size: 20px;
|
||||||
|
.museo-sans-light-italic;
|
||||||
|
}
|
||||||
|
|
||||||
|
input {
|
||||||
|
margin:0;
|
||||||
|
padding: 0 0 0 0;
|
||||||
|
font-size: 20px;
|
||||||
|
|
||||||
|
&:focus {
|
||||||
|
|
||||||
|
} //focus
|
||||||
|
}
|
||||||
|
|
||||||
|
button {
|
||||||
|
padding: 0 20px;
|
||||||
|
text-transform: uppercase;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} //search
|
||||||
|
} //search bar
|
||||||
|
|
||||||
|
//pagination
|
||||||
|
.pagination {
|
||||||
|
height: 80px;
|
||||||
|
background: @gray-background;
|
||||||
|
padding: 0;
|
||||||
|
margin:0 auto;
|
||||||
|
text-transform: uppercase;
|
||||||
|
color: @blue-text;
|
||||||
|
z-index: 999;
|
||||||
|
position:relative;
|
||||||
|
|
||||||
|
a.previous,
|
||||||
|
a.next {
|
||||||
|
padding: 25px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
a.previous {
|
||||||
|
margin-left: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
a.next {
|
||||||
|
margin-right: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,101 @@
|
||||||
|
// footer
|
||||||
|
|
||||||
|
footer {
|
||||||
|
padding: 80px 0;
|
||||||
|
background: @black url(/images/footer_background.png) center center;
|
||||||
|
text-align: center;
|
||||||
|
color: @white;
|
||||||
|
z-index: 999;
|
||||||
|
position: relative; //z-index needs position!
|
||||||
|
|
||||||
|
ul.footer-nav {
|
||||||
|
color: @blue;
|
||||||
|
text-transform: uppercase;
|
||||||
|
font-size: 15px;
|
||||||
|
.museo-sans-light;
|
||||||
|
|
||||||
|
li {
|
||||||
|
display: inline-block;
|
||||||
|
margin: 0 10px;
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: @blue;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
color: @purple;
|
||||||
|
} //li a:hover
|
||||||
|
} // li a
|
||||||
|
} //li
|
||||||
|
|
||||||
|
} //ul
|
||||||
|
|
||||||
|
|
||||||
|
ul.logos {
|
||||||
|
margin: (@baseline * 2) 0;
|
||||||
|
|
||||||
|
|
||||||
|
li {
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
span {
|
||||||
|
color: @dark-gray-text;
|
||||||
|
.museo-sans-light;
|
||||||
|
text-transform: uppercase;
|
||||||
|
font-size: 40px;
|
||||||
|
margin: 0 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.vagrant-logo-monochrome,
|
||||||
|
.hashi-logo-monochrome {
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
-khtml-opacity: .85;
|
||||||
|
-moz-opacity: .85;
|
||||||
|
opacity: .85;
|
||||||
|
filter: alpha(opacity=85);
|
||||||
|
.animate-opacity;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.vagrant-logo-monochrome {
|
||||||
|
height: 80px;
|
||||||
|
width: 80px;
|
||||||
|
background: url(/images/footer_vagrant_logo.png) no-repeat center center;
|
||||||
|
margin-bottom: -25px;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.hashi-logo-monochrome {
|
||||||
|
height: 80px;
|
||||||
|
width: 80px;
|
||||||
|
background: url(/images/footer_hashi_logo.png) no-repeat center center;
|
||||||
|
margin-bottom: -25px;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
a.contact-link {
|
||||||
|
color: @dark-gray-text;
|
||||||
|
line-height: @base-line-height * 2;
|
||||||
|
font-size: 30px;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
color: @white;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:visited {
|
||||||
|
color: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:active {
|
||||||
|
color: @blue;
|
||||||
|
}
|
||||||
|
} //contact link
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} //footer
|
|
@ -0,0 +1,452 @@
|
||||||
|
@media (max-width: 480px) {
|
||||||
|
|
||||||
|
nav {
|
||||||
|
position: absolute !important;
|
||||||
|
height: auto;
|
||||||
|
font-size: 13px;
|
||||||
|
padding: 10px 0;
|
||||||
|
.drop-shadow;
|
||||||
|
|
||||||
|
a.vagrant-docs-logo {
|
||||||
|
background: url(/images/logo_docs_small.png) no-repeat center center !important;
|
||||||
|
display: inline-block !important;
|
||||||
|
float: none !important;
|
||||||
|
position: relative;
|
||||||
|
width: 200px !important;
|
||||||
|
left: 50%;
|
||||||
|
padding: 10px 0;
|
||||||
|
.reset;
|
||||||
|
margin-left: -100px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
a.vagrant-logo {
|
||||||
|
background: url(/images/logo_vagrant.png) no-repeat center center !important;
|
||||||
|
display: inline-block !important;
|
||||||
|
float: none !important;
|
||||||
|
position: relative;
|
||||||
|
width: 80% !important;
|
||||||
|
left: 50%;
|
||||||
|
padding: 10px 0;
|
||||||
|
.reset;
|
||||||
|
margin-left: -130px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul {
|
||||||
|
position: relative;
|
||||||
|
margin: 0 auto;
|
||||||
|
width: 100%;
|
||||||
|
text-align: center;
|
||||||
|
padding: 10px 0 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
a.brand {
|
||||||
|
display: none !important;
|
||||||
|
position: static !important;
|
||||||
|
width: 200px !important;
|
||||||
|
margin: 0 0 0 0 !important;
|
||||||
|
background-position: center center !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.search {
|
||||||
|
input {
|
||||||
|
font-size: 20px !important;
|
||||||
|
padding: 0 !important;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
::-webkit-input-placeholder {
|
||||||
|
overflow: visible;
|
||||||
|
padding-top: 3px;
|
||||||
|
font-size: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
input:-moz-placeholder {
|
||||||
|
overflow: visible;
|
||||||
|
padding-top: 3px;
|
||||||
|
font-size: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.page {
|
||||||
|
|
||||||
|
.page-contents {
|
||||||
|
|
||||||
|
} //page contents
|
||||||
|
|
||||||
|
&.home {
|
||||||
|
.hero {
|
||||||
|
background-size: 300%;
|
||||||
|
background-position: center 0;
|
||||||
|
height: 400px;
|
||||||
|
|
||||||
|
.hero-content {
|
||||||
|
margin-top: 80px;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
font-size: 40px !important;
|
||||||
|
line-height: 40px !important;
|
||||||
|
margin-bottom: 30px !important;
|
||||||
|
letter-spacing: 1px;
|
||||||
|
margin-bottom: ;
|
||||||
|
} //h1
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
font-size: 20px !important;
|
||||||
|
line-height: 25px;
|
||||||
|
} //h2
|
||||||
|
} //hero
|
||||||
|
} //home
|
||||||
|
|
||||||
|
.why-vagrant {
|
||||||
|
padding: 40px 0 !important;
|
||||||
|
|
||||||
|
hgroup {
|
||||||
|
margin: 40px 0 !important;
|
||||||
|
|
||||||
|
:last-child {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
} //hgroup
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
font-size: 30px !important;
|
||||||
|
line-height: 30px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
h3 {
|
||||||
|
font-size: 40px !important;
|
||||||
|
line-height: 40px !important;
|
||||||
|
margin-bottom: 20px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
h4 {
|
||||||
|
.hyphenate;
|
||||||
|
}
|
||||||
|
} //why-vagrant
|
||||||
|
|
||||||
|
.get-started {
|
||||||
|
padding: 40px 0 !important;
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
width: 60%;
|
||||||
|
font-size: 30px !important;
|
||||||
|
line-height: 30px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
pre {
|
||||||
|
margin: 30px auto 30px !important;
|
||||||
|
}
|
||||||
|
} //get-started
|
||||||
|
|
||||||
|
.customers {
|
||||||
|
padding: 40px 0 !important;
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
font-size: 30px !important;
|
||||||
|
line-height: 30px !important;
|
||||||
|
}
|
||||||
|
} //customers
|
||||||
|
|
||||||
|
&.inner {
|
||||||
|
padding-top: 30px;
|
||||||
|
|
||||||
|
.page-contents {
|
||||||
|
padding: 40px 0;
|
||||||
|
}
|
||||||
|
} //inner
|
||||||
|
|
||||||
|
&.docs {
|
||||||
|
|
||||||
|
.page-contents {
|
||||||
|
padding: 40px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
font-size: 40px;
|
||||||
|
line-height: 40px;
|
||||||
|
}
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
font-size: 25px;
|
||||||
|
line-height: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
h2.steps img {
|
||||||
|
display: block;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
} //docs
|
||||||
|
|
||||||
|
} //page
|
||||||
|
|
||||||
|
footer {
|
||||||
|
padding: 40px 0 !important;
|
||||||
|
background-size: 300%;
|
||||||
|
background-position: center bottom;
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
|
||||||
|
ul.footer-nav {
|
||||||
|
font-size: 13px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.button {
|
||||||
|
padding: 6px 0;
|
||||||
|
font-size: 20px;
|
||||||
|
letter-spacing: 3px;
|
||||||
|
.museo-sans-regular;
|
||||||
|
}
|
||||||
|
|
||||||
|
.search-bar {
|
||||||
|
margin-top: 160px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pagination {
|
||||||
|
font-size: 15px;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
footer {
|
||||||
|
|
||||||
|
a.contact-link {
|
||||||
|
font-size: 20px;
|
||||||
|
} // contact link
|
||||||
|
}
|
||||||
|
|
||||||
|
} //mobile
|
||||||
|
|
||||||
|
@media (min-width: 768px) and (max-width: 979px) {
|
||||||
|
|
||||||
|
nav {
|
||||||
|
|
||||||
|
a.vagrant-logo {
|
||||||
|
background: url(/images/logo_small.png) no-repeat 0 0 !important;
|
||||||
|
width: 80px;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul {
|
||||||
|
margin: 25px 20px;
|
||||||
|
}
|
||||||
|
} // nav
|
||||||
|
|
||||||
|
.toggle {
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sidebar-nav ul {
|
||||||
|
display: block !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // 768 < x < 979
|
||||||
|
|
||||||
|
@media (min-width: 1200px) {
|
||||||
|
|
||||||
|
} // > 1200
|
||||||
|
|
||||||
|
@media (max-width: 979px) {
|
||||||
|
|
||||||
|
.vagrant-docs-logo {
|
||||||
|
background: url(/images/logo_docs_small.png) no-repeat 0 0 !important;
|
||||||
|
width: 165px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // < 979
|
||||||
|
|
||||||
|
|
||||||
|
@media (min-width: 980px) {
|
||||||
|
|
||||||
|
} // > 980
|
||||||
|
|
||||||
|
|
||||||
|
@media (max-width: 767px) {
|
||||||
|
|
||||||
|
// these modules go full-width at smaller sizes
|
||||||
|
.pagination,
|
||||||
|
.hero,
|
||||||
|
.why-vagrant,
|
||||||
|
.get-started,
|
||||||
|
.customers,
|
||||||
|
footer {
|
||||||
|
.full-width;
|
||||||
|
}
|
||||||
|
|
||||||
|
nav {
|
||||||
|
height: auto;
|
||||||
|
font-size: 13px;
|
||||||
|
padding: 10px 0;
|
||||||
|
//.drop-shadow;
|
||||||
|
|
||||||
|
.vagrant-logo {
|
||||||
|
display: inline-block !important;
|
||||||
|
background-position: center center;
|
||||||
|
float: none !important;
|
||||||
|
position: relative;
|
||||||
|
width: 350px !important;
|
||||||
|
left: 50%;
|
||||||
|
padding: 10px 0;
|
||||||
|
.reset;
|
||||||
|
margin-left: -175px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.vagrant-docs-logo {
|
||||||
|
background: url(/images/logo_docs.png) no-repeat 0 0 !important;
|
||||||
|
display: inline-block !important;
|
||||||
|
background-position: center center;
|
||||||
|
float: none !important;
|
||||||
|
position: relative;
|
||||||
|
width: 350px !important;
|
||||||
|
left: 50%;
|
||||||
|
padding: 10px 0;
|
||||||
|
.reset;
|
||||||
|
margin-left: -175px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul {
|
||||||
|
position: relative;
|
||||||
|
margin: 0 auto;
|
||||||
|
width: 100%;
|
||||||
|
text-align: center;
|
||||||
|
padding: 10px 0 0;
|
||||||
|
|
||||||
|
li:first-child {
|
||||||
|
margin-left: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
a.brand {
|
||||||
|
display: none !important;
|
||||||
|
position: static !important;
|
||||||
|
width: 200px !important;
|
||||||
|
margin: 0 0 0 0 !important;
|
||||||
|
background-position: center center !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wrapper {
|
||||||
|
margin-top: 128px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sidebar {
|
||||||
|
|
||||||
|
ul {
|
||||||
|
margin-top: 0 !important;
|
||||||
|
|
||||||
|
li {
|
||||||
|
display: block;
|
||||||
|
text-indent: 20px;
|
||||||
|
|
||||||
|
&:hover,
|
||||||
|
&:active {
|
||||||
|
background-color: fade(@black, 5%);
|
||||||
|
.animate-background-color;
|
||||||
|
}
|
||||||
|
} //li
|
||||||
|
|
||||||
|
ul.sub {
|
||||||
|
|
||||||
|
li {
|
||||||
|
|
||||||
|
}
|
||||||
|
} //ul.sub
|
||||||
|
} //ul
|
||||||
|
|
||||||
|
.docs & {
|
||||||
|
.docs-bg-small;
|
||||||
|
|
||||||
|
ul {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sidebar-nav {
|
||||||
|
margin-right: -20px;
|
||||||
|
margin-left: -20px;
|
||||||
|
.docs-bg-small;
|
||||||
|
} //docs sidebar-nav
|
||||||
|
} // docs sidebar
|
||||||
|
} //sidebar
|
||||||
|
|
||||||
|
.page {
|
||||||
|
|
||||||
|
.page-background {
|
||||||
|
left: 0; //make it full-width to cover the gutters on small screens
|
||||||
|
}
|
||||||
|
|
||||||
|
.page-contents {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
&.home {
|
||||||
|
|
||||||
|
.hero {
|
||||||
|
padding: 40px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1,
|
||||||
|
h4,
|
||||||
|
pre,
|
||||||
|
.customers-content, {
|
||||||
|
max-width: 80% !important;
|
||||||
|
margin: 0 auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
pre {
|
||||||
|
padding: 20px 20px 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.customer-logos {
|
||||||
|
margin-top: @baseline !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
} //home
|
||||||
|
|
||||||
|
&.inner {
|
||||||
|
|
||||||
|
.page-contents {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.sidebar {
|
||||||
|
padding: 0;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sidebar-nav {
|
||||||
|
.inner-bg-small;
|
||||||
|
margin-right: -20px;
|
||||||
|
margin-left: -20px;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
padding: 15px 0 15px;
|
||||||
|
margin: 0 0 0 20px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button {
|
||||||
|
width: 80%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&.docs {
|
||||||
|
background: transparent;
|
||||||
|
} //docs
|
||||||
|
} //page
|
||||||
|
|
||||||
|
.button {
|
||||||
|
max-width: 300px;
|
||||||
|
position: relative;
|
||||||
|
//margin: 20px 0 20px 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.full-width {
|
||||||
|
margin-right: -20px !important;
|
||||||
|
margin-left: -20px ;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // < 767
|
|
@ -0,0 +1,174 @@
|
||||||
|
// styles and effects
|
||||||
|
.round-corners {
|
||||||
|
-moz-border-radius: 3px;
|
||||||
|
-webkit-border-radius: 3px;
|
||||||
|
-khtml-border-radius: 3px;
|
||||||
|
border-radius: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rounded {
|
||||||
|
-moz-border-radius: 50px;
|
||||||
|
-webkit-border-radius: 50px;
|
||||||
|
-khtml-border-radius: 50px;
|
||||||
|
border-radius: 50px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.animate-background-color {
|
||||||
|
transition: background-color .3s ease-in-out;
|
||||||
|
-moz-transition: background-color .3s ease-in-out;
|
||||||
|
-webkit-transition: background-color .3s ease-in-out;
|
||||||
|
-o-transition: background-color .3s ease-in-out;
|
||||||
|
}
|
||||||
|
|
||||||
|
.animate-text-color {
|
||||||
|
transition: color .2s ease-in-out;
|
||||||
|
-moz-transition: color .2s ease-in-out;
|
||||||
|
-webkit-transition: color .2s ease-in-out;
|
||||||
|
-o-transition: color .2s ease-in-out;
|
||||||
|
}
|
||||||
|
|
||||||
|
.animate-opacity {
|
||||||
|
transition: opacity .2s ease-in-out;
|
||||||
|
-moz-transition: opacity .2s ease-in-out;
|
||||||
|
-webkit-transition: opacity .2s ease-in-out;
|
||||||
|
-o-transition: opacity .2s ease-in-out;
|
||||||
|
}
|
||||||
|
|
||||||
|
.drop-shadow {
|
||||||
|
-webkit-box-shadow: 0 1px 5px rgba(0, 0, 0, 0.1) !important;
|
||||||
|
-moz-box-shadow: 0 1px 5px rgba(0, 0, 0, 0.1) !important;
|
||||||
|
box-shadow: 0 1px 5px rgba(0, 0, 0, 0.1) !important;
|
||||||
|
.animate-opacity;
|
||||||
|
}
|
||||||
|
|
||||||
|
.hyphenate {
|
||||||
|
-webkit-hyphens: auto;
|
||||||
|
-moz-hyphens: auto;
|
||||||
|
hyphens: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.uppercase {
|
||||||
|
text-transform: uppercase;
|
||||||
|
}
|
||||||
|
|
||||||
|
.padded {
|
||||||
|
padding: (@baseline * 3) 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.padded-medium {
|
||||||
|
padding: (@baseline * 2) 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.padded-small{
|
||||||
|
padding: @baseline 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.inner-bg-large {
|
||||||
|
background-image: #c1b4d5; /* Old browsers */
|
||||||
|
background-image: url(/images/sidebar_background_inner.png), -moz-linear-gradient(45deg, #c1b4d5 0%, #98d3f8 100%); /* FF3.6+ */
|
||||||
|
background-image: url(/images/sidebar_background_inner.png), -webkit-gradient(linear, left bottom, right top, color-stop(0%,#c1b4d5), color-stop(100%,#98d3f8)); /* Chrome,Safari4+ */
|
||||||
|
background-image: url(/images/sidebar_background_inner.png), -webkit-linear-gradient(45deg, #c1b4d5 0%,#98d3f8 100%); /* Chrome10+,Safari5.1+ */
|
||||||
|
background-image: url(/images/sidebar_background_inner.png), -o-linear-gradient(45deg, #c1b4d5 0%,#98d3f8 100%); /* Opera 11.10+ */
|
||||||
|
background-image: url(/images/sidebar_background_inner.png), -ms-linear-gradient(45deg, #c1b4d5 0%,#98d3f8 100%); /* IE10+ */
|
||||||
|
background-image: url(/images/sidebar_background_inner.png), linear-gradient(45deg, #c1b4d5 0%,#98d3f8 100%); /* W3C */
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#c1b4d5', endColorstr='#98d3f8',GradientType=1 ); /* IE6-8 fallback on horizontal gradient */
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
background-position: 0 0;
|
||||||
|
background-attachment:fixed;
|
||||||
|
}
|
||||||
|
|
||||||
|
.inner-bg-small {
|
||||||
|
background: #c1b4d5; /* Old browsers */
|
||||||
|
background: -moz-linear-gradient(45deg, #c1b4d5 0%, #98d3f8 100%); /* FF3.6+ */
|
||||||
|
background: -webkit-gradient(linear, left bottom, right top, color-stop(0%,#c1b4d5), color-stop(100%,#98d3f8)); /* Chrome,Safari4+ */
|
||||||
|
background: -webkit-linear-gradient(45deg, #c1b4d5 0%,#98d3f8 100%); /* Chrome10+,Safari5.1+ */
|
||||||
|
background: -o-linear-gradient(45deg, #c1b4d5 0%,#98d3f8 100%); /* Opera 11.10+ */
|
||||||
|
background: -ms-linear-gradient(45deg, #c1b4d5 0%,#98d3f8 100%); /* IE10+ */
|
||||||
|
background: linear-gradient(45deg, #c1b4d5 0%,#98d3f8 100%); /* W3C */
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#c1b4d5', endColorstr='#98d3f8',GradientType=1 ); /* IE6-8 fallback on horizontal gradient */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.docs-bg-large {
|
||||||
|
background-image: url(/images/sidebar_background_docs.png), #362d6c; /* Old browsers */
|
||||||
|
background-image: url(/images/sidebar_background_docs.png), -moz-linear-gradient(45deg, #362d6c 0%, #0c5593 100%); /* FF3.6+ */
|
||||||
|
background-image: url(/images/sidebar_background_docs.png), -webkit-gradient(linear, left bottom, right top, color-stop(0%,#362d6c), color-stop(100%,#0c5593)); /* Chrome,Safari4+ */
|
||||||
|
background-image: url(/images/sidebar_background_docs.png), -webkit-linear-gradient(45deg, #362d6c 0%,#0c5593 100%); /* Chrome10+,Safari5.1+ */
|
||||||
|
background-image: url(/images/sidebar_background_docs.png), -o-linear-gradient(45deg, #362d6c 0%,#0c5593 100%); /* Opera 11.10+ */
|
||||||
|
background-image: url(/images/sidebar_background_docs.png), -ms-linear-gradient(45deg, #362d6c 0%,#0c5593 100%); /* IE10+ */
|
||||||
|
background-image: url(/images/sidebar_background_docs.png), linear-gradient(45deg, #362d6c 0%,#0c5593 100%); /* W3C */
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#362d6c', endColorstr='#0c5593',GradientType=1 ); /* IE6-8 fallback on horizontal gradient */
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
background-attachment:fixed;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.docs-bg-small {
|
||||||
|
background: #362d6c; /* Old browsers */
|
||||||
|
background: -moz-linear-gradient(45deg, #362d6c 0%, #0c5593 100%); /* FF3.6+ */
|
||||||
|
background: -webkit-gradient(linear, left bottom, right top, color-stop(0%,#362d6c), color-stop(100%,#0c5593)); /* Chrome,Safari4+ */
|
||||||
|
background: -webkit-linear-gradient(45deg, #362d6c 0%,#0c5593 100%); /* Chrome10+,Safari5.1+ */
|
||||||
|
background: -o-linear-gradient(45deg, #362d6c 0%,#0c5593 100%); /* Opera 11.10+ */
|
||||||
|
background: -ms-linear-gradient(45deg, #362d6c 0%,#0c5593 100%); /* IE10+ */
|
||||||
|
background: linear-gradient(45deg, #362d6c 0%,#0c5593 100%); /* W3C */
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#362d6c', endColorstr='#0c5593',GradientType=1 ); /* IE6-8 fallback on horizontal gradient */
|
||||||
|
}
|
||||||
|
|
||||||
|
.get-started-bg {
|
||||||
|
background-image: #362d6c; /* Old browsers */
|
||||||
|
background-image: -moz-linear-gradient(45deg, #362d6c 0%, #0c5593 100%); /* FF3.6+ */
|
||||||
|
background-image: -webkit-gradient(linear, left bottom, right top, color-stop(0%,#362d6c), color-stop(100%,#0c5593)); /* Chrome,Safari4+ */
|
||||||
|
background-image: -webkit-linear-gradient(45deg, #362d6c 0%,#0c5593 100%); /* Chrome10+,Safari5.1+ */
|
||||||
|
background-image: -o-linear-gradient(45deg, #362d6c 0%,#0c5593 100%); /* Opera 11.10+ */
|
||||||
|
background-image: -ms-linear-gradient(45deg, #362d6c 0%,#0c5593 100%); /* IE10+ */
|
||||||
|
background-image: linear-gradient(45deg, #362d6c 0%,#0c5593 100%); /* W3C */
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#362d6c', endColorstr='#0c5593',GradientType=1 ); /* IE6-8 fallback on horizontal gradient */
|
||||||
|
background-position: center 0;
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
.sidebar-nav-selected {
|
||||||
|
background: -moz-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(71,101,118,1) 100%);
|
||||||
|
background: -webkit-gradient(linear, left top, right top, color-stop(0%,rgba(255,255,255,0)), color-stop(100%,rgba(71,101,118,1)));
|
||||||
|
background: -webkit-linear-gradient(left, rgba(255,255,255,0) 0%,rgba(71,101,118,1) 100%);
|
||||||
|
background: -o-linear-gradient(left, rgba(255,255,255,0) 0%,rgba(71,101,118,1) 100%);
|
||||||
|
background: -ms-linear-gradient(left, rgba(255,255,255,0) 0%,rgba(71,101,118,1) 100%);
|
||||||
|
background: linear-gradient(to right, rgba(255,255,255,0) 0%,rgba(71,101,118,1) 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#00ffffff', endColorstr='#476576',GradientType=1 );
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
// helpers
|
||||||
|
.reset {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.kill-effects {
|
||||||
|
-webkit-box-shadow: 0 0;
|
||||||
|
-moz-box-shadow: 0 0;
|
||||||
|
box-shadow: 0 0;
|
||||||
|
-webkit-border-radius: 0px;
|
||||||
|
-moz-border-radius: 0px;
|
||||||
|
border-radius: 0px;
|
||||||
|
font-family: inherit;
|
||||||
|
color: inherit;
|
||||||
|
background-color: transparent;
|
||||||
|
background-image: none;
|
||||||
|
border: 0;
|
||||||
|
text-shadow: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.debug {
|
||||||
|
border: 1px solid #ff0000;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.hover {
|
||||||
|
&:hover {
|
||||||
|
cursor: pointer;
|
||||||
|
.animate-text-color;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,71 @@
|
||||||
|
// roll your own nav
|
||||||
|
|
||||||
|
nav {
|
||||||
|
width: 100%;
|
||||||
|
font-size: 15px;
|
||||||
|
text-transform: uppercase;
|
||||||
|
.museo-sans-light;
|
||||||
|
color: @medium-gray-text;
|
||||||
|
height: 80px;
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
background-color: @white;
|
||||||
|
z-index: 9999999999;
|
||||||
|
|
||||||
|
&.docs {
|
||||||
|
background: @gray-background;
|
||||||
|
}
|
||||||
|
|
||||||
|
.vagrant-logo {
|
||||||
|
display: block;
|
||||||
|
text-indent: -999999px;
|
||||||
|
background: url(/images/logo_vagrant.png) no-repeat 0 0;
|
||||||
|
height: 70px;
|
||||||
|
width: 275px;
|
||||||
|
float: left;
|
||||||
|
margin: 10px 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.vagrant-docs-logo {
|
||||||
|
display: block;
|
||||||
|
text-indent: -999999px;
|
||||||
|
background: url(/images/logo_docs.png) no-repeat 0 0;
|
||||||
|
height: 70px;
|
||||||
|
width: 350px;
|
||||||
|
float: left;
|
||||||
|
margin: 10px 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul {
|
||||||
|
margin: 25px 20px;
|
||||||
|
|
||||||
|
li {
|
||||||
|
display: inline;
|
||||||
|
margin-left: 15px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.active-nav {
|
||||||
|
color: @blue;
|
||||||
|
}
|
||||||
|
|
||||||
|
.contact {
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background-color: @light-gray-background;
|
||||||
|
padding: 10px;
|
||||||
|
margin-right: -10px;
|
||||||
|
margin-left: 5px;
|
||||||
|
.rounded;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:active {
|
||||||
|
background-color: darken(@light-gray-background, 5%);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,276 @@
|
||||||
|
/* page */
|
||||||
|
.page { //style all pages
|
||||||
|
|
||||||
|
.page-background { //page background color
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
top: 0;
|
||||||
|
position: fixed;
|
||||||
|
z-index: -5; //keep it in the back
|
||||||
|
} //.background
|
||||||
|
|
||||||
|
.page-contents {
|
||||||
|
|
||||||
|
h1,
|
||||||
|
h2 {
|
||||||
|
text-transform: uppercase;
|
||||||
|
text-align: left;
|
||||||
|
.museo-sans-light;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
font-size: 60px;
|
||||||
|
line-height: 70px;
|
||||||
|
margin: (@baseline * 2) 0 @baseline;
|
||||||
|
|
||||||
|
&:first-child {
|
||||||
|
margin-top: 0;
|
||||||
|
} //h1 first child
|
||||||
|
}
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
font-size: 40px;
|
||||||
|
line-height: 45px;
|
||||||
|
margin: (@baseline * 2) 0 @baseline;
|
||||||
|
|
||||||
|
&:first-child {
|
||||||
|
margin-top: @baseline * .5;
|
||||||
|
} //h2 first child
|
||||||
|
} //h2
|
||||||
|
} //page-contents
|
||||||
|
|
||||||
|
/* home */
|
||||||
|
&.home { //style homepage
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.hero {
|
||||||
|
.padded;
|
||||||
|
background: @gray-background url(/images/vagrant_header_background.png) no-repeat center -80px;
|
||||||
|
text-align: center;
|
||||||
|
border-bottom: 1px solid #c6e0f0;
|
||||||
|
|
||||||
|
.hero-content {
|
||||||
|
top: 50%;
|
||||||
|
|
||||||
|
hgroup {
|
||||||
|
margin: (@baseline * 4) 0 20px 0;
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
color: @purple-text;
|
||||||
|
margin-bottom: (@baseline * 4);
|
||||||
|
font-size: 60px;
|
||||||
|
line-height: 60px;
|
||||||
|
}
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
.museo-sans-light;
|
||||||
|
color: @blue-text;
|
||||||
|
font-size: 30px;
|
||||||
|
line-height: 40px;
|
||||||
|
}
|
||||||
|
|
||||||
|
} //hero hgroup
|
||||||
|
|
||||||
|
} //hero-content
|
||||||
|
|
||||||
|
} //homepage hero
|
||||||
|
|
||||||
|
.why-vagrant {
|
||||||
|
.padded;
|
||||||
|
background: @light-blue-background url(/images/steps_background.png) center -120px;
|
||||||
|
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
color: @blue-text;
|
||||||
|
text-transform: uppercase;
|
||||||
|
text-align: center;
|
||||||
|
font-size: 40px;
|
||||||
|
line-height: 40px;
|
||||||
|
} //h1
|
||||||
|
|
||||||
|
hgroup {
|
||||||
|
margin: (@baseline * 3) 0;
|
||||||
|
|
||||||
|
|
||||||
|
h3 {
|
||||||
|
text-align: center;
|
||||||
|
text-transform: uppercase;
|
||||||
|
font-size: 40px;
|
||||||
|
margin-bottom: @baseline;
|
||||||
|
color: @purple-text;
|
||||||
|
.museo-sans-light;
|
||||||
|
} //h3
|
||||||
|
|
||||||
|
h4 {
|
||||||
|
font-size: 20px;
|
||||||
|
line-height: @baseline * 1.5;
|
||||||
|
.museo-sans-light;
|
||||||
|
} //h4
|
||||||
|
} //hgroup
|
||||||
|
} //why-vagrant
|
||||||
|
|
||||||
|
.get-started {
|
||||||
|
.padded;
|
||||||
|
.get-started-bg;
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
color: @white;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
pre {
|
||||||
|
padding: 60px 80px 40px;
|
||||||
|
margin: 40px auto;
|
||||||
|
background: fade(@black, 60%);
|
||||||
|
}
|
||||||
|
|
||||||
|
.button {
|
||||||
|
//background: fade(@white, 20%);
|
||||||
|
}
|
||||||
|
|
||||||
|
} //get-started
|
||||||
|
|
||||||
|
.customers {
|
||||||
|
.padded;
|
||||||
|
background-color: @black;
|
||||||
|
border-bottom: 1px solid #333;
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
color: @dark-gray-text;
|
||||||
|
.museo-sans-light
|
||||||
|
}
|
||||||
|
|
||||||
|
.customer-logos {
|
||||||
|
margin-top: @baseline * 3;
|
||||||
|
|
||||||
|
img {
|
||||||
|
width:100%;
|
||||||
|
height: auto;
|
||||||
|
-khtml-opacity: .5;
|
||||||
|
-moz-opacity: .5;
|
||||||
|
opacity: .5;
|
||||||
|
filter: alpha(opacity=50);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ul.customer-logos {
|
||||||
|
|
||||||
|
li {
|
||||||
|
|
||||||
|
img {
|
||||||
|
|
||||||
|
} //img
|
||||||
|
|
||||||
|
} //li
|
||||||
|
} //ul.cusotmer-logos
|
||||||
|
}
|
||||||
|
|
||||||
|
} //home
|
||||||
|
|
||||||
|
/* inner */
|
||||||
|
&.inner { //style inner pages
|
||||||
|
.inner-bg-large; //sidebar background
|
||||||
|
|
||||||
|
.page-background { //change inner background color!
|
||||||
|
background-color: @gray-background; //page background
|
||||||
|
}
|
||||||
|
|
||||||
|
.page-contents {
|
||||||
|
background-color: @gray-background;
|
||||||
|
.padded;
|
||||||
|
}
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
color: @dark-blue-text;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
} //inner
|
||||||
|
|
||||||
|
/* docs */
|
||||||
|
&.docs { //style all docs
|
||||||
|
.docs-bg-large; //sidebar background
|
||||||
|
|
||||||
|
.page-background { //change the sidebar background color!
|
||||||
|
background: @white; //page background
|
||||||
|
}
|
||||||
|
|
||||||
|
.page-contents {
|
||||||
|
padding-top: 30px;
|
||||||
|
background-color: @white;
|
||||||
|
padding-bottom: 40px;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1,
|
||||||
|
h2 {
|
||||||
|
color: @docs-blue;
|
||||||
|
}
|
||||||
|
|
||||||
|
h2.steps img {
|
||||||
|
margin-top: -7px;
|
||||||
|
}
|
||||||
|
|
||||||
|
li {
|
||||||
|
letter-spacing: 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.alert {
|
||||||
|
margin-top: 20px;
|
||||||
|
|
||||||
|
h3 {
|
||||||
|
font-size: 22px;
|
||||||
|
letter-spacing: 1px;
|
||||||
|
margin-bottom: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
line-height: 26px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&.docs-home { //style docs-home
|
||||||
|
|
||||||
|
|
||||||
|
} //documentation-home
|
||||||
|
|
||||||
|
&.docs-inner { //style docs-inner
|
||||||
|
|
||||||
|
h3 {
|
||||||
|
color: @docs-blue;
|
||||||
|
text-transform: uppercase;
|
||||||
|
margin: @baseline 0;
|
||||||
|
.museo-sans-light;
|
||||||
|
}
|
||||||
|
|
||||||
|
h4 {
|
||||||
|
line-height: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
h5.subhead {
|
||||||
|
.museo-sans-light;
|
||||||
|
color: @purple-text;
|
||||||
|
line-height: @baseline;
|
||||||
|
margin: -10px 0 @baseline;
|
||||||
|
}
|
||||||
|
|
||||||
|
h6.subhead {
|
||||||
|
.museo-sans-regular-italic;
|
||||||
|
color: @dark-gray-text;
|
||||||
|
line-height: @baseline;
|
||||||
|
margin: -10px 0 @baseline;
|
||||||
|
font-size: 15px;
|
||||||
|
//text-transform: uppercase;
|
||||||
|
}
|
||||||
|
|
||||||
|
} //documentation-inner
|
||||||
|
|
||||||
|
} //documentation
|
||||||
|
|
||||||
|
} //page
|
|
@ -0,0 +1,136 @@
|
||||||
|
.sidebar { //general styles for the sidebar
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
text-align: left;
|
||||||
|
color: @white;
|
||||||
|
line-height: 60px;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button {
|
||||||
|
font-size: 15px;
|
||||||
|
color: @dark-blue-text;
|
||||||
|
letter-spacing: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.toggle {
|
||||||
|
font-size: 20px;
|
||||||
|
.museo-sans-light;
|
||||||
|
color: @white;
|
||||||
|
margin-left: 20px;
|
||||||
|
padding: 20px 0;
|
||||||
|
|
||||||
|
a {
|
||||||
|
display: block;
|
||||||
|
color: @white;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
color: @white;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.open-close {
|
||||||
|
background: url(/images/open_close.png) no-repeat 0 0;
|
||||||
|
height: 20px;
|
||||||
|
width: 20px;
|
||||||
|
position: absolute;
|
||||||
|
right: 0;
|
||||||
|
top: 25px;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.sidebar-nav { //style all sidebar-navs
|
||||||
|
//position:fixed;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul { //general sidebar list styles
|
||||||
|
|
||||||
|
li { //general sidebar list item styles
|
||||||
|
font-size: 20px;
|
||||||
|
.museo-sans-light;
|
||||||
|
|
||||||
|
a {
|
||||||
|
display: block;
|
||||||
|
} //li a
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
}
|
||||||
|
} //li
|
||||||
|
|
||||||
|
ul.sub { //subnav list styles
|
||||||
|
border-top: none;
|
||||||
|
list-style-type: none;
|
||||||
|
margin:0 0 5px 0;
|
||||||
|
|
||||||
|
li {
|
||||||
|
padding: 5px 0 5px 20px;
|
||||||
|
font-size: 15px;
|
||||||
|
border: none;
|
||||||
|
border-bottom: none !important;
|
||||||
|
} //ul.sub li
|
||||||
|
} //ul.sub
|
||||||
|
|
||||||
|
@media screen and (min-width: 768px) {
|
||||||
|
display: block !important;
|
||||||
|
} //@media 768px
|
||||||
|
|
||||||
|
} //ul
|
||||||
|
|
||||||
|
|
||||||
|
.inner & { //styles for the inner-page sidebar
|
||||||
|
.padded;
|
||||||
|
position:fixed;
|
||||||
|
|
||||||
|
li.current a {
|
||||||
|
color: @purple;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul { //style inner list
|
||||||
|
|
||||||
|
|
||||||
|
li { //style inner list item
|
||||||
|
color: @dark-blue-text;
|
||||||
|
padding: 20px 0;
|
||||||
|
border-top: 1px solid fade(@white, 40%);
|
||||||
|
|
||||||
|
&:last-child {
|
||||||
|
border-bottom: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.current { //style the current selected list item
|
||||||
|
|
||||||
|
} //current
|
||||||
|
} //li
|
||||||
|
} //ul
|
||||||
|
} //.inner .sidebar
|
||||||
|
|
||||||
|
.docs & { //styles for the documentation sidebar
|
||||||
|
|
||||||
|
li.current a {
|
||||||
|
color: @blue;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul { //style documentation list
|
||||||
|
|
||||||
|
li { //style documentation list items
|
||||||
|
text-transform: capitalize;
|
||||||
|
color: @white;
|
||||||
|
padding: 12px 0;
|
||||||
|
border-top: 1px solid fade(@white, 20%);
|
||||||
|
|
||||||
|
&:first-child {
|
||||||
|
border-top: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:last-child {
|
||||||
|
border-bottom: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.current { //style the current selected list item
|
||||||
|
|
||||||
|
} //current
|
||||||
|
} //li
|
||||||
|
} //ul
|
||||||
|
} //.documentation .sidebar
|
||||||
|
} //sidebar
|
|
@ -0,0 +1,36 @@
|
||||||
|
//typogrpahy
|
||||||
|
.museo-sans-light {
|
||||||
|
font-family: "museo-sans", helvetica, arial, sans-serif;
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 100;
|
||||||
|
}
|
||||||
|
|
||||||
|
.museo-sans-regular {
|
||||||
|
font-family: "museo-sans", helvetica, arial, sans-serif;
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 300;
|
||||||
|
}
|
||||||
|
|
||||||
|
.museo-sans-bold {
|
||||||
|
font-family: "museo-sans", helvetica, arial, sans-serif;
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
|
||||||
|
.museo-sans-light-italic {
|
||||||
|
font-family: "museo-sans", helvetica, arial, sans-serif;
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 100;
|
||||||
|
}
|
||||||
|
|
||||||
|
.museo-sans-regular-italic {
|
||||||
|
font-family: "museo-sans", helvetica, arial, sans-serif;
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 300;
|
||||||
|
}
|
||||||
|
|
||||||
|
.museo-sans-bold-italic {
|
||||||
|
font-family: "museo-sans", helvetica, arial, sans-serif;
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
/*
|
||||||
|
/|\/|\/|\/|\/|\/|\
|
||||||
|
v a g r a n t u p
|
||||||
|
\|/\|/\|/\|/\|/\|/
|
||||||
|
*/
|
||||||
|
|
||||||
|
@import 'variables';
|
||||||
|
@import 'type';
|
||||||
|
@import 'mixins';
|
||||||
|
@import 'base';
|
||||||
|
@import 'nav';
|
||||||
|
@import 'components';
|
||||||
|
@import 'sidebar';
|
||||||
|
@import 'pages';
|
||||||
|
@import 'footer';
|
||||||
|
@import 'media-queries';
|
|
@ -0,0 +1,39 @@
|
||||||
|
/* variables */
|
||||||
|
|
||||||
|
//grayscale
|
||||||
|
@black: #000;
|
||||||
|
@white: #fff;
|
||||||
|
@gray-background: #f7f6f1;
|
||||||
|
@dark-gray-text: #7f7f7f;
|
||||||
|
@light-gray-background: #f0f0f0;
|
||||||
|
@light-gray: #ccc;
|
||||||
|
@light-gray-text: #eeeeee;
|
||||||
|
@dark-gray-background: #333;
|
||||||
|
@medium-gray-text: #666;
|
||||||
|
|
||||||
|
//vagrant colors
|
||||||
|
@blue-text: #2490cc;
|
||||||
|
@dark-blue-text: #476576;
|
||||||
|
@light-blue-background: #dbf1ff;
|
||||||
|
@vagrant-blue: #0094bf;
|
||||||
|
@light-sidebar-background: #a1ccf0;
|
||||||
|
@docs-blue: #22407f;
|
||||||
|
@blue-background: #1e71a1;
|
||||||
|
@purple-text: #270836;
|
||||||
|
@purple: #735f9f;
|
||||||
|
|
||||||
|
//misc colors
|
||||||
|
@blue: #48b4fb;
|
||||||
|
@green: #43d193;
|
||||||
|
@code-highlight-text: #73c5dd;
|
||||||
|
@current-color: inherit;
|
||||||
|
@button-color: @vagrant-blue;
|
||||||
|
@primary-button-color: #48b4fb;
|
||||||
|
|
||||||
|
//type
|
||||||
|
@sans-serif-stack: 'Museo Sans', 'helvetica neue', helvetica, arial, sans-serif;
|
||||||
|
@mono-stack: 'Inconsolata', monaco, courier, monospace;
|
||||||
|
@base-font-size: 18px;
|
||||||
|
@base-line-height: 30px;
|
||||||
|
@baseline: 20px;
|
||||||
|
@headline-span-size: 30px;
|
|
@ -0,0 +1,85 @@
|
||||||
|
---
|
||||||
|
sidebar_current: "boxes"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Boxes
|
||||||
|
|
||||||
|
Boxes are the skeleton from which Vagrant machines are constructed. They are
|
||||||
|
portable files which can be used by others on any platform that runs Vagrant
|
||||||
|
to bring up a working environment.
|
||||||
|
|
||||||
|
The `vagrant box` utility provides all the functionality for managing
|
||||||
|
boxes. Boxes must currently be created manually.
|
||||||
|
|
||||||
|
Boxes are [provider-specific](/v2/providers/index.html), so you must obtain
|
||||||
|
the proper box depending on what provider you're using.
|
||||||
|
|
||||||
|
If you're interested in more details on the exact file format of
|
||||||
|
boxes, there is a seperate [page dedicated to that](/v2/boxes/format.html), since
|
||||||
|
it is an advanced topic that general users don't need to know.
|
||||||
|
|
||||||
|
## Adding Boxes
|
||||||
|
|
||||||
|
Adding boxes is straightforward:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ vagrant box add name url
|
||||||
|
```
|
||||||
|
|
||||||
|
`name` is a logical name by which the box is referenced from the
|
||||||
|
Vagrantfile. You can put anything you want here, but know that Vagrant
|
||||||
|
matches the `config.vm.box` directive with this name in order to look up
|
||||||
|
the box to use.
|
||||||
|
|
||||||
|
`url` is the location of the box. This can be a path to your local filesystem
|
||||||
|
or an HTTP URL to the box remotely.
|
||||||
|
|
||||||
|
Vagrant will automatically determine the provider the box was built
|
||||||
|
for by reading the "metadata.json" file within the box archive. You
|
||||||
|
may also tell Vagrant what provider the box is for by specifying the
|
||||||
|
`--provider` flag.
|
||||||
|
|
||||||
|
This is recommended as it adds an extra level of verification
|
||||||
|
to the box you're downloading. Additionally, Vagrant can exit early with
|
||||||
|
an error if a box with that name and provider already exists, whereas
|
||||||
|
it must download the entire box before showing such an error in the other
|
||||||
|
case.
|
||||||
|
|
||||||
|
Multiple boxes with the same name can exist as long as they are all
|
||||||
|
for different providers. The example of listing boxes below shows this,
|
||||||
|
where there are multiple precise64 boxes, backed by different providers.
|
||||||
|
This lets a single `config.vm.box` configuration within a Vagrantfile
|
||||||
|
properly reference boxes across providers.
|
||||||
|
|
||||||
|
## Listing Boxes
|
||||||
|
|
||||||
|
To view what boxes Vagrant has locally installed, use `vagrant box list`:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ vagrant box list
|
||||||
|
precise64 (virtualbox)
|
||||||
|
precise64 (vmware_fusion)
|
||||||
|
```
|
||||||
|
|
||||||
|
Vagrant lists all boxes along with the providers the box is for in parentheses.
|
||||||
|
|
||||||
|
## Removing Boxes
|
||||||
|
|
||||||
|
Boxes can be removed just as easily as they are added:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ vagrant box remove precise64 virtualbox
|
||||||
|
```
|
||||||
|
|
||||||
|
The two arguments are the logical name of the box and the provider of the
|
||||||
|
box.
|
||||||
|
|
||||||
|
<div class="alert alert-info">
|
||||||
|
<h3>Optional Provider Parameter?</h3>
|
||||||
|
<p>
|
||||||
|
A future release of Vagrant will make the provider parameter optional
|
||||||
|
when removing a box. In this case, Vagrant will show a list of
|
||||||
|
boxes that can be removed and ask the user which they want to remove.
|
||||||
|
This is not currently implemented.
|
||||||
|
</p>
|
||||||
|
</div>
|
|
@ -0,0 +1,31 @@
|
||||||
|
---
|
||||||
|
sidebar_current: "boxes-format"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Box File Format
|
||||||
|
|
||||||
|
In the past, boxes were just [tar files](http://en.wikipedia.org/wiki/Tar_\(computing\))
|
||||||
|
of VirtualBox exports. With Vagrant supporting multiple providers, box files
|
||||||
|
are now tar files where the contents differ for each provider. They are
|
||||||
|
still tar files, but they may now optionally be [gzipped](http://en.wikipedia.org/wiki/Gzip)
|
||||||
|
as well.
|
||||||
|
|
||||||
|
Box files made for Vagrant 1.0.x and VirtualBox continue to work with
|
||||||
|
Vagrant 1.1+ and the VirtualBox provider.
|
||||||
|
|
||||||
|
The only file required within a box is a "metadata.json" file. This is
|
||||||
|
a [JSON](http://www.json.org/) file that has a top-level object that
|
||||||
|
can contain any metadata about the box. Vagrant requires that a "provider"
|
||||||
|
key exists in this metadata with the name of the provider the box is made
|
||||||
|
for.
|
||||||
|
|
||||||
|
The "metadata.json" file for a VirtualBox box:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"provider": "virtualbox"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
If there is no metadata.json file or the file does not contain valid JSON
|
||||||
|
with at least a "provider" key, then Vagrant will error when adding the box.
|
|
@ -0,0 +1,61 @@
|
||||||
|
---
|
||||||
|
sidebar_current: "cli-box"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Box
|
||||||
|
|
||||||
|
**Command: `vagrant box`**
|
||||||
|
|
||||||
|
This is the command used to manage (add, remove, etc.) [boxes](/v2/boxes/index.html).
|
||||||
|
|
||||||
|
The main functionality of this command is exposed via even more subcommands:
|
||||||
|
|
||||||
|
* `add`
|
||||||
|
* `list`
|
||||||
|
* `remove`
|
||||||
|
* `repackage`
|
||||||
|
|
||||||
|
# Box Add
|
||||||
|
|
||||||
|
**Command: `vagrant box add NAME URL`**
|
||||||
|
|
||||||
|
This adds a box add the given URL to Vagrant and stores it under the
|
||||||
|
logical name `NAME`.
|
||||||
|
|
||||||
|
The URL may be a file path or an HTTP URL. For HTTP, basic authentication
|
||||||
|
is supported and `http_proxy` environmental variables are respected. HTTPS
|
||||||
|
is also supported.
|
||||||
|
|
||||||
|
The name argument of this command is a _logical name_, meaning you can
|
||||||
|
effectively choose whatever you want. This is the name that Vagrant searches
|
||||||
|
for to match with the `config.vm.box` setting in Vagrantfiles.
|
||||||
|
|
||||||
|
## Options
|
||||||
|
|
||||||
|
* `--provider PROVIDER` - If given, Vagrant will verify the box you're
|
||||||
|
adding is for the given provider. By default, Vagrant automatically
|
||||||
|
detects the proper provider to use.
|
||||||
|
|
||||||
|
# Box List
|
||||||
|
|
||||||
|
**Command: `vagrant box list`**
|
||||||
|
|
||||||
|
This command lists all the boxes that are installed into Vagrant.
|
||||||
|
|
||||||
|
# Box Remove
|
||||||
|
|
||||||
|
**Command: `vagrant box remove NAME PROVIDER`**
|
||||||
|
|
||||||
|
This command removes a box from Vagrant that matches the given name and
|
||||||
|
provider.
|
||||||
|
|
||||||
|
# Box Repackage
|
||||||
|
|
||||||
|
**Command: `vagrant box repackage NAME PROVIDER`**
|
||||||
|
|
||||||
|
This command repackages the given box and puts it in the current
|
||||||
|
directory so you can redistribute it.
|
||||||
|
|
||||||
|
When you add a box, Vagrant unpacks it and stores it internally. The
|
||||||
|
original `*.box` file is not preserved. This command is useful for
|
||||||
|
reclaiming a `*.box` file from an installed Vagrant box.
|
|
@ -0,0 +1,19 @@
|
||||||
|
---
|
||||||
|
sidebar_current: "cli-destroy"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Destroy
|
||||||
|
|
||||||
|
**Command: `vagrant destroy`**
|
||||||
|
|
||||||
|
This command stops the running machine Vagrant is managing and
|
||||||
|
destroys all resources that were created during the machine creation process.
|
||||||
|
After running this command, your computer should be left at a clean state,
|
||||||
|
as if you never created the guest machine in the first place.
|
||||||
|
|
||||||
|
This command usually asks for confirmation before destroying. This
|
||||||
|
confirmation can be skipped by passing in the `-f` or `--force` flag.
|
||||||
|
|
||||||
|
## Options
|
||||||
|
|
||||||
|
* `-f` or `--force` - Don't ask for confirmation before destroying.
|
|
@ -0,0 +1,18 @@
|
||||||
|
---
|
||||||
|
sidebar_current: "cli-halt"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Halt
|
||||||
|
|
||||||
|
**Command: `vagrant halt`**
|
||||||
|
|
||||||
|
This command shuts down the running machine Vagrant is managing.
|
||||||
|
|
||||||
|
Vagrant will first attempt to gracefully shut down the machine by running
|
||||||
|
the guest OS shutdown mechanism. If this fails, or if the `--force` flag is
|
||||||
|
specified, Vagrant will effectively just shut off power to the machine.
|
||||||
|
|
||||||
|
## Options
|
||||||
|
|
||||||
|
* `-f` or `--force` - Don't attempt to gracefully shut down the machine.
|
||||||
|
This effectively pulls the power on the guest machine.
|
|
@ -0,0 +1,23 @@
|
||||||
|
---
|
||||||
|
sidebar_current: "cli"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Command-Line Interface
|
||||||
|
|
||||||
|
Almost all interaction with Vagrant is done through the command-line
|
||||||
|
interface.
|
||||||
|
|
||||||
|
The interface is available using the `vagrant` command, and comes installed
|
||||||
|
with Vagrant automatically. The `vagrant` command in turn has many subcommands,
|
||||||
|
such as `vagrant up`, `vagrant destroy`, etc.
|
||||||
|
|
||||||
|
If you run `vagrant` by itself, help will be displayed showing all available
|
||||||
|
subcommands. In addition to this, you can run any Vagrant command with the
|
||||||
|
`-h` flag to output help about that specific command. For example, try
|
||||||
|
running `vagrant init -h`. The help will output a one sentence synopsis of
|
||||||
|
what the command does as well as a list of all the flags the command
|
||||||
|
accepts.
|
||||||
|
|
||||||
|
In depth documentation and use cases of various Vagrant commands is
|
||||||
|
available by reading the appropriate sub-section available in the left
|
||||||
|
navigational area of this site.
|
|
@ -0,0 +1,17 @@
|
||||||
|
---
|
||||||
|
sidebar_current: "cli-init"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Init
|
||||||
|
|
||||||
|
**Command: `vagrant init [box-name] [box-url]`**
|
||||||
|
|
||||||
|
This initializes the current directory to be a Vagrant environment
|
||||||
|
by creating an initial [Vagrantfile](/v2/vagrantfile/index.html) if
|
||||||
|
one doesn't already exist.
|
||||||
|
|
||||||
|
If a first argument is given, it will prepopulate the `config.vm.box`
|
||||||
|
setting in the created Vagrantfile.
|
||||||
|
|
||||||
|
If a second argument is given, it will prepopulate the `config.vm.box_url`
|
||||||
|
setting in the created Vagrantfile.
|
|
@ -0,0 +1,42 @@
|
||||||
|
---
|
||||||
|
sidebar_current: "cli-package"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Package
|
||||||
|
|
||||||
|
**Command: `vagrant package`**
|
||||||
|
|
||||||
|
This packages a currently running _VirtualBox_ environment into a
|
||||||
|
re-usable [box](/v2/boxes.html). This command cannot be used with
|
||||||
|
any other [provider](/v2/providers/index.html). A future version of Vagrant
|
||||||
|
will address packaging boxes for other providers. Until then, they must
|
||||||
|
be made by hand.
|
||||||
|
|
||||||
|
## Options
|
||||||
|
|
||||||
|
* `--base NAME` - Instead of packaging a VirtualBox machine that Vagrant
|
||||||
|
manages, this will package a VirtualBox machine that VirtualBox manages.
|
||||||
|
`NAME` should be the name or UUID of the machine from the VirtualBox GUI.
|
||||||
|
|
||||||
|
* `--output NAME` - The resulting package will be saved as `NAME`. By default,
|
||||||
|
it will be saved as `package.box`.
|
||||||
|
|
||||||
|
* `--include x,y,z` - Additional files will be packaged with the box. These
|
||||||
|
can be used by a packaged Vagrantfile (documented below) to perform additional
|
||||||
|
tasks.
|
||||||
|
|
||||||
|
* `--vagrantfile FILE` - Packages a Vagrantfile with the box, that is loaded
|
||||||
|
as part of the [Vagrantfile load order](/v2/vagrantfile/index.html#load-order)
|
||||||
|
when the resulting box is used.
|
||||||
|
|
||||||
|
<div class="alert alert-info">
|
||||||
|
<p>
|
||||||
|
<strong>A common misconception</strong> is that the <code>--vagrantfile</code>
|
||||||
|
option will package a Vagrantfile that is used when <code>vagrant init</code>
|
||||||
|
is used with this box. This is not the case. Instead, a Vagrantfile
|
||||||
|
is loaded and read as part of the Vagrant load process when the box is
|
||||||
|
used. For more information, read about the
|
||||||
|
<a href="/v2/vagrantfile/index.html#load-order">Vagrantfile load order</a>.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
|
@ -0,0 +1,45 @@
|
||||||
|
---
|
||||||
|
sidebar_current: "cli-plugin"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Plugin
|
||||||
|
|
||||||
|
**Command: `vagrant plugin`**
|
||||||
|
|
||||||
|
This is the command used to manage [plugins](/v2/plugins/index.html).
|
||||||
|
|
||||||
|
The main functionality of this command is exposed via another level
|
||||||
|
of subcommands:
|
||||||
|
|
||||||
|
* `install`
|
||||||
|
* `license`
|
||||||
|
* `list`
|
||||||
|
* `uninstall`
|
||||||
|
|
||||||
|
# Plugin Install
|
||||||
|
|
||||||
|
**Command: `vagrant plugin install <name>`**
|
||||||
|
|
||||||
|
This installs a plugin with the given name or file path. If the name
|
||||||
|
is not a path to a file, then the plugin is installed from remote
|
||||||
|
repositories, usually [RubyGems](http://rubygems.org).
|
||||||
|
|
||||||
|
# Plugin License
|
||||||
|
|
||||||
|
**Command: `vagrant plugin license <name> <license-file>`**
|
||||||
|
|
||||||
|
This command installs a license for a proprietary Vagrant plugin,
|
||||||
|
such as the [VMware Fusion provider](/v2/vmware/index.html).
|
||||||
|
|
||||||
|
# Plugin List
|
||||||
|
|
||||||
|
**Command: `vagrant plugin list`**
|
||||||
|
|
||||||
|
This lists all installed plugins and their respective versions.
|
||||||
|
|
||||||
|
# Plugin Uninstall
|
||||||
|
|
||||||
|
**Command: `vagrant plugin uninstall <name>`**
|
||||||
|
|
||||||
|
This uninstalls the plugin with the given name. Any dependencies of the
|
||||||
|
plugin will also be uninstalled assuming no other plugin needs them.
|
|
@ -0,0 +1,23 @@
|
||||||
|
---
|
||||||
|
sidebar_current: "cli-provision"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Provision
|
||||||
|
|
||||||
|
**Command: `vagrant provision`**
|
||||||
|
|
||||||
|
Runs any configured [provisioners](/v2/provisioning/index.html)
|
||||||
|
against the running Vagrant managed machine.
|
||||||
|
|
||||||
|
This command is a great way to quickly test any provisioners, and is especially
|
||||||
|
useful for incremental development of shell scripts, Chef cookbooks, or Puppet
|
||||||
|
modules. You can just make simple modifications to the provisioning scripts
|
||||||
|
on your machine, run a `vagrant provision`, and check for the desired results.
|
||||||
|
Rinse and repeat.
|
||||||
|
|
||||||
|
# Options
|
||||||
|
|
||||||
|
* `--provision-with x,y,z` - This will only run the given provisioners. For
|
||||||
|
example, if you have a `:shell` and `:chef_solo` provisioner and run
|
||||||
|
`vagrant provision --provision-with shell`, only the shell provisioner will
|
||||||
|
be run.
|
|
@ -0,0 +1,23 @@
|
||||||
|
---
|
||||||
|
sidebar_current: "cli-reload"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Reload
|
||||||
|
|
||||||
|
**Command: `vagrant reload`**
|
||||||
|
|
||||||
|
The equivalent of running a [halt](/v2/cli/halt.html) followed by an
|
||||||
|
[up](/v2/cli/up.html).
|
||||||
|
|
||||||
|
This command is usually required for changes made in the Vagrantfile to
|
||||||
|
take effect. After making any modifications to the Vagrantfile, a `reload`
|
||||||
|
should be called.
|
||||||
|
|
||||||
|
# Options
|
||||||
|
|
||||||
|
* `--no-provision` - The provisioners will not run.
|
||||||
|
|
||||||
|
* `--provision-with x,y,z` - This will only run the given provisioners. For
|
||||||
|
example, if you have a `:shell` and `:chef_solo` provisioner and run
|
||||||
|
`vagrant provision --provision-with shell`, only the shell provisioner will
|
||||||
|
be run.
|
|
@ -0,0 +1,10 @@
|
||||||
|
---
|
||||||
|
sidebar_current: "cli-resume"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Resume
|
||||||
|
|
||||||
|
**Command: `vagrant resume`**
|
||||||
|
|
||||||
|
This resumes a Vagrant managed machine that was previously suspended,
|
||||||
|
perhaps with the [suspend command](/v2/cli/suspend.html).
|
|
@ -0,0 +1,22 @@
|
||||||
|
---
|
||||||
|
sidebar_current: "cli-ssh"
|
||||||
|
---
|
||||||
|
|
||||||
|
# SSH
|
||||||
|
|
||||||
|
**Command: `vagrant ssh`**
|
||||||
|
|
||||||
|
This will SSH into a running Vagrant machine and give you access to a shell.
|
||||||
|
|
||||||
|
If a `--` (two hyphens) are found on the command line, any arguments after
|
||||||
|
this are passed directly into the `ssh` executable. This allows you to pass
|
||||||
|
any abitrary commands to do things such as reverse tunneling down into the
|
||||||
|
`ssh` program.
|
||||||
|
|
||||||
|
## Options
|
||||||
|
|
||||||
|
* `-c COMMAND` or `--command COMMAND` - This executes a single SSH command, prints
|
||||||
|
out the stdout and stderr, and exits.
|
||||||
|
|
||||||
|
* `-p` or `--plain` - This does an SSH without authentication, leaving
|
||||||
|
authentication up to the user.
|
|
@ -0,0 +1,15 @@
|
||||||
|
---
|
||||||
|
sidebar_current: "cli-ssh_config"
|
||||||
|
---
|
||||||
|
|
||||||
|
# SSH Config
|
||||||
|
|
||||||
|
**Command: `vagrant ssh-config`**
|
||||||
|
|
||||||
|
This will output valid configuration for an SSH config file to SSH
|
||||||
|
into the running Vagrant machine from `ssh` directly (instead of
|
||||||
|
using `vagrant ssh`).
|
||||||
|
|
||||||
|
## Options
|
||||||
|
|
||||||
|
* `--host NAME` - Name of the host for the outputted configuration.
|
|
@ -0,0 +1,13 @@
|
||||||
|
---
|
||||||
|
sidebar_current: "cli-status"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Status
|
||||||
|
|
||||||
|
**Command: `vagrant status`**
|
||||||
|
|
||||||
|
This will tell you the state of the machines Vagrant is managing.
|
||||||
|
|
||||||
|
It is quite easy, especially once you get comfortable with Vagrant, to
|
||||||
|
forget whether your Vagrant machine is running, suspended, not created, etc.
|
||||||
|
This command tells you the state of the underlying guest machine.
|
|
@ -0,0 +1,18 @@
|
||||||
|
---
|
||||||
|
sidebar_current: "cli-suspend"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Suspend
|
||||||
|
|
||||||
|
**Command: `vagrant suspend`**
|
||||||
|
|
||||||
|
This suspends the guest machine Vagrant is managing, rather than fully
|
||||||
|
[shutting it down](/v2/cli/halt.html) or [destroying it](/v2/cli/destroy.html).
|
||||||
|
|
||||||
|
A suspend effectively saves the _exact point-in-time state_ of the machine,
|
||||||
|
so that when you [resume](/v2/cli/resume.html) it later, it begins running
|
||||||
|
immediately from that point, rather than doing a full boot.
|
||||||
|
|
||||||
|
This generally requires extra disk space to store all the contents of the
|
||||||
|
RAM within your guest machine, but the machine no longer consumes the
|
||||||
|
RAM of your host machine or CPU cycles while it is suspended.
|
|
@ -0,0 +1,14 @@
|
||||||
|
---
|
||||||
|
sidebar_current: "cli-up"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Up
|
||||||
|
|
||||||
|
**Command: `vagrant up`**
|
||||||
|
|
||||||
|
This command creates and configures guest machines according to your
|
||||||
|
[Vagrantfile](/v2/vagrantfile/index.html).
|
||||||
|
|
||||||
|
This is the single most important command in Vagrant, since it is how
|
||||||
|
any Vagrant machine is created. Anyone using Vagrant must use this command
|
||||||
|
on a day-to-day basis.
|
|
@ -0,0 +1,41 @@
|
||||||
|
---
|
||||||
|
sidebar_current: "debugging"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Debugging
|
||||||
|
|
||||||
|
As much as we try to keep Vagrant stable and bug free, it is inevitable
|
||||||
|
that issues will arise and Vagrant will behave in unexpected ways. In
|
||||||
|
these cases, Vagrant has amazing [support](http://www.vagrantup.com/support.html)
|
||||||
|
channels available to assist you.
|
||||||
|
|
||||||
|
When using these support channels, it is generally helpful to include
|
||||||
|
debugging logs along with any error reports. These logs can often help you
|
||||||
|
troubleshoot any problems you may be having.
|
||||||
|
|
||||||
|
To enable detailed logging, set the `VAGRANT_LOG` environmental variable
|
||||||
|
to the desired log level name, which is one of `debug` (loud), `info` (normal),
|
||||||
|
`warn` (quiet), and `error` (very quiet). When asking for support, please
|
||||||
|
set this to `debug`. When troubleshooting your own issues, you should start
|
||||||
|
with `info`, which is much quieter, but contains important information
|
||||||
|
about the behavior of Vagrant.
|
||||||
|
|
||||||
|
On Linux and Mac systems, this can be done by prepending the `vagrant`
|
||||||
|
command with an environmental variable declaration:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ VAGRANT_LOG=info vagrant up
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
On Windows, multiple steps are required:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ set VAGRANT_LOG=info
|
||||||
|
$ vagrant up
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
If you plan on submitting a bug report, please submit debug-level logs
|
||||||
|
along with the report using [gist](https://gist.github.com/) or
|
||||||
|
some other paste service.
|
|
@ -0,0 +1,55 @@
|
||||||
|
---
|
||||||
|
sidebar_current: "gettingstarted-boxes"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Boxes
|
||||||
|
|
||||||
|
Instead of building a virtual machine from scratch, which would be a
|
||||||
|
slow and tedious process, Vagrant uses a base image to quickly clone
|
||||||
|
a virtual machine. These base images are known as _boxes_ in Vagrant,
|
||||||
|
and specifying the box to use for your Vagrant environment is always
|
||||||
|
the first step after creating a new Vagrantfile.
|
||||||
|
|
||||||
|
## Installing a Box
|
||||||
|
|
||||||
|
If you ran the commands on the [getting started overview page](/v2/getting-started/index.html),
|
||||||
|
then you've already installed a box before, and you don't need to run
|
||||||
|
the commands below again. However, it is still worth reading this section
|
||||||
|
to learn more about how boxes are managed.
|
||||||
|
|
||||||
|
Boxes are added to Vagrant with `vagrant box add`. This stores the box
|
||||||
|
under a specific name so that multiple Vagrant environments can re-use it.
|
||||||
|
If you haven't added a box yet, you can do so now:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ vagrant box add precise32 \
|
||||||
|
http://files.vagrantup.com/precise32.box
|
||||||
|
```
|
||||||
|
|
||||||
|
This will download the box from an HTTP source and save it as "precise32"
|
||||||
|
in a directory that Vagrant manages (away from your project). You can also
|
||||||
|
add boxes from a local file path.
|
||||||
|
|
||||||
|
Added boxes can be re-used by multiple projects. Each project uses a box
|
||||||
|
as an initial image to clone from, and never modifies the actual base
|
||||||
|
image. This means that if you have two projects both using the `precise32`
|
||||||
|
box we just added, adding files in one guest machine will have no effect
|
||||||
|
on the other machine.
|
||||||
|
|
||||||
|
## Using a Box
|
||||||
|
|
||||||
|
Now that the box has been added to Vagrant, we need to configure our
|
||||||
|
project to use it as a base. Open the `Vagrantfile` and change the
|
||||||
|
contents to the following:
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
Vagrant.configure("2") do |config|
|
||||||
|
config.vm.box = "precise32"
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
|
The "precise32" in this case must match the name you used to add
|
||||||
|
the box above. This is how Vagrant knows what box to use.
|
||||||
|
|
||||||
|
In the next section, we'll bring up the guest machine and interact
|
||||||
|
with it a little bit.
|
|
@ -0,0 +1,42 @@
|
||||||
|
---
|
||||||
|
sidebar_current: "gettingstarted"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Getting Started
|
||||||
|
|
||||||
|
The Vagrant getting started guide will walk you through your first
|
||||||
|
Vagrant project, and show off the basics of the major features Vagrant
|
||||||
|
has to offer.
|
||||||
|
|
||||||
|
Before diving into your first project, please [install Vagrant](/v2/installation/index.html).
|
||||||
|
And if you're curious what benefits Vagrant has to offer, you
|
||||||
|
should also read the ["Why Vagrant?"](/v2/why-vagrant/index.html) page.
|
||||||
|
|
||||||
|
The getting started guide will use Vagrant with [VirtualBox](http://www.virtualbox.org),
|
||||||
|
since it is free, available on every major platform, and built-in to
|
||||||
|
Vagrant. After reading the guide though, don't forget that Vagrant
|
||||||
|
can work with [many other providers](/v2/getting-started/providers.html).
|
||||||
|
|
||||||
|
## Up and Running
|
||||||
|
|
||||||
|
```
|
||||||
|
$ vagrant init precise32 http://files.vagrantup.com/precise32.box
|
||||||
|
$ vagrant up
|
||||||
|
```
|
||||||
|
|
||||||
|
After running the above two commands, you'll have a fully running
|
||||||
|
virtual machine in [VirtualBox](http://virtualbox.org) running
|
||||||
|
Ubuntu 12.04 LTS 32-bit. You can SSH into this machine with
|
||||||
|
`vagrant ssh`, and when you're done playing around, you can remove
|
||||||
|
all traces of it with `vagrant destroy`.
|
||||||
|
|
||||||
|
Now imagine every project you've ever worked on being this easy to
|
||||||
|
set up.
|
||||||
|
|
||||||
|
With Vagrant, `vagrant up` is all you need to work on any project,
|
||||||
|
to install every dependency that project needs, and to setup any
|
||||||
|
networking and synced folders so you can continue working from the
|
||||||
|
comfort of your own machine.
|
||||||
|
|
||||||
|
The rest of this guide will walk you through setting up a more
|
||||||
|
complete project, covering more features of Vagrant.
|
|
@ -0,0 +1,44 @@
|
||||||
|
---
|
||||||
|
sidebar_current: "gettingstarted-networking"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Networking
|
||||||
|
|
||||||
|
At this point we have a web server up and running with the ability to
|
||||||
|
modify files from our host and have them automatically synced to the guest.
|
||||||
|
However, accessing the web pages simply from the terminal from inside
|
||||||
|
the machine is not very satisfying. In this step, we'll use Vagrant's
|
||||||
|
_networking_ features to give us additional options for accessing the
|
||||||
|
machine from our host machine.
|
||||||
|
|
||||||
|
## Port Forwarding
|
||||||
|
|
||||||
|
One option is to use _port forwarding_. Port forwarding allows you to
|
||||||
|
specify ports on the guest machine to share via a port on the host machine.
|
||||||
|
This allows you to access a port on your own machine, but actually have
|
||||||
|
all the network traffic forwarded to a specific port on the guest machine.
|
||||||
|
|
||||||
|
Let's setup a forwarded port so we can access Apache in our guest. Doing so
|
||||||
|
is a simple edit to the Vagrantfile, which now looks like this:
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
Vagrant.configure("2") do |config|
|
||||||
|
config.vm.box = "precise32"
|
||||||
|
config.vm.provision :shell, :path => "bootstrap.sh"
|
||||||
|
config.vm.network :forwarded_port, host: 4567, guest: 80
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
|
Run a `vagrant reload` or `vagrant up` (depending on if the machine
|
||||||
|
is already running) so that these changes can take effect.
|
||||||
|
|
||||||
|
Once the machine is running again, load `http://127.0.0.1:4567` in
|
||||||
|
your browser. You should see a web page that is being served from
|
||||||
|
the virtual machine that was automatically setup by Vagrant.
|
||||||
|
|
||||||
|
## Other Networking
|
||||||
|
|
||||||
|
Vagrant also has other forms of networking, allowing you to assign
|
||||||
|
a static IP address to the guest machine, or to bridge the guest
|
||||||
|
machine onto an existing network. If you're interested in other options,
|
||||||
|
read the [networking](/v2/networking/index.html) page.
|
|
@ -0,0 +1,37 @@
|
||||||
|
---
|
||||||
|
sidebar_current: "gettingstarted-projectsetup"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Project Setup
|
||||||
|
|
||||||
|
The first step for any project to use Vagrant is to configure Vagrant
|
||||||
|
using a [Vagrantfile](/v2/vagrantfile/index.html). The purpose of the
|
||||||
|
Vagrantfile is twofold:
|
||||||
|
|
||||||
|
1. Mark the root directory of your project. A lot of the configuration
|
||||||
|
of Vagrant is relative to this root directory.
|
||||||
|
|
||||||
|
2. Describe the kind of machine and resources you need to run your project,
|
||||||
|
as well as what software to install and how you want to access it.
|
||||||
|
|
||||||
|
Vagrant has a built-in command for initializing a directory for usage
|
||||||
|
with Vagrant: `vagrant init`. For the purpose of this getting started guide,
|
||||||
|
please follow along in your terminal:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ mkdir vagrant_getting_started
|
||||||
|
$ cd vagrant_getting_started
|
||||||
|
$ vagrant init
|
||||||
|
```
|
||||||
|
|
||||||
|
This will place a `Vagrantfile` in your current directory. You can
|
||||||
|
take a look at the Vagrantfile if you want, it is filled with comments
|
||||||
|
and examples. Don't be afraid if it looks intimidating, we'll modify it
|
||||||
|
soon enough.
|
||||||
|
|
||||||
|
You can also run `vagrant init` in a pre-existing directory to
|
||||||
|
setup Vagrant for an existing project.
|
||||||
|
|
||||||
|
The Vagrantfile is meant to be committed to version control with
|
||||||
|
your project, if you use version control. This way, every person working
|
||||||
|
with that project can benefit from Vagrant without any upfront work.
|
|
@ -0,0 +1,36 @@
|
||||||
|
---
|
||||||
|
sidebar_current: "gettingstarted-providers"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Providers
|
||||||
|
|
||||||
|
In this getting started guide, your project was always backed with
|
||||||
|
[VirtualBox](http://www.virtualbox.org). But Vagrant can work with
|
||||||
|
a wide variety of backend providers, such as [VMware Fusion](/v2/vmware-fusion/index.html),
|
||||||
|
[AWS](http://github.com/mitchellh/vagrant-aws), and more. Read the page
|
||||||
|
of each provider for more information on how to set them up.
|
||||||
|
|
||||||
|
Once you have a provider installed, you don't need to make any modifications
|
||||||
|
to your Vagrantfile, just `vagrant up` with the proper provider and
|
||||||
|
Vagrant will do the rest:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ vagrant up --provider=vmware_fusion
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
Ready to move that to the cloud? Take it to AWS:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ vagrant up --provider=aws
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
Once you run `vagrant up` with another provider, every other Vagrant
|
||||||
|
command doesn't need to be told what provider to use. Vagrant can automatically
|
||||||
|
figure it out. So when you're ready to SSH or destroy or anything else,
|
||||||
|
just run the commands like normal, such as `vagrant destroy`. No extra
|
||||||
|
flags necessary.
|
||||||
|
|
||||||
|
For more information on providers, read the full documentation on
|
||||||
|
[providers](/v2/providers/index.html).
|
|
@ -0,0 +1,72 @@
|
||||||
|
---
|
||||||
|
sidebar_current: "gettingstarted-provisioning"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Provisioning
|
||||||
|
|
||||||
|
Alright, so we have a virtual machine running a basic copy of Ubuntu and
|
||||||
|
we can edit files from our machine and have them synced into the virtual machine.
|
||||||
|
Let's now serve those files using a webserver.
|
||||||
|
|
||||||
|
We could just SSH in and install a webserver and be on our way, but then
|
||||||
|
every person who used Vagrant would have to do the same thing. Instead,
|
||||||
|
Vagrant has built-in support for _automated provisioning_. Using this
|
||||||
|
feature, Vagrant will automatically install software when you `vagrant up`
|
||||||
|
so that the guest machine can be repeatably created and ready-to-use.
|
||||||
|
|
||||||
|
## Installing Apache
|
||||||
|
|
||||||
|
We'll just setup [Apache](http://httpd.apache.org/) for our basic project,
|
||||||
|
and we'll do so using a shell script. Create the following shell script
|
||||||
|
and save it as `bootstrap.sh` in the same directory as your Vagrantfile:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
apt-get update
|
||||||
|
apt-get install -y apache2
|
||||||
|
rm -rf /var/www
|
||||||
|
ln -fs /vagrant /var/www
|
||||||
|
```
|
||||||
|
|
||||||
|
Next, we configure Vagrant to run this shell script when setting up
|
||||||
|
our machine. We do this by editing the Vagrantfile, which should now
|
||||||
|
look like this:
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
Vagrant.configure("2") do |config|
|
||||||
|
config.vm.box = "precise32"
|
||||||
|
config.vm.provision :shell, :path => "bootstrap.sh"
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
|
The "provision" line is new, and tells Vagrant to use the `shell` provisioner
|
||||||
|
to setup the machine, with the `bootstrap.sh` file. The file path is relative
|
||||||
|
to the location of the project root (where the Vagrantfile is).
|
||||||
|
|
||||||
|
## Provision!
|
||||||
|
|
||||||
|
After everything is configured, just run `vagrant up` to create your
|
||||||
|
machine and Vagrant will automatically provision it. You should see
|
||||||
|
the output from the shell script appear in your terminal. If the guest
|
||||||
|
machine is already running from a previous step, run `vagrant reload`,
|
||||||
|
which will quickly restart your virtual machine, skipping the initial
|
||||||
|
import step.
|
||||||
|
|
||||||
|
After Vagrant completes running, the web server will be up and running.
|
||||||
|
You can't see the website from your own browser (yet), but you can verify
|
||||||
|
that the provisioning works by loading a file from SSH within the machine:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ vagrant ssh
|
||||||
|
...
|
||||||
|
vagrant@precise32:~$ wget -qO- 127.0.0.1
|
||||||
|
```
|
||||||
|
|
||||||
|
This works because in the shell script above we installed Apache and
|
||||||
|
setup the default `DocumentRoot` of Apache to point to our `/vagrant`
|
||||||
|
directory, which is the default synced folder setup by Vagrant.
|
||||||
|
|
||||||
|
You can play around some more by creating some more files and viewing
|
||||||
|
them from the terminal, but in the next step we'll cover networking
|
||||||
|
options so that you can use your own browser to access the guest machine.
|
|
@ -0,0 +1,16 @@
|
||||||
|
---
|
||||||
|
sidebar_current: "gettingstarted-rebuild"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Rebuild
|
||||||
|
|
||||||
|
When you're ready to come back to your project, whether it is tomorrow,
|
||||||
|
a week from now, or a year from now, getting it up and running is easy:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ vagrant up
|
||||||
|
```
|
||||||
|
|
||||||
|
That's it! Since the Vagrant environment is already all configured via
|
||||||
|
the Vagrantfile, you or any of your coworkers simply have to run a
|
||||||
|
`vagrant up` at any time and Vagrant will recreate your work environment.
|
|
@ -0,0 +1,41 @@
|
||||||
|
---
|
||||||
|
sidebar_current: "gettingstarted-syncedfolders"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Synced Folders
|
||||||
|
|
||||||
|
While it is cool to have a virtual machine so easily, not many people
|
||||||
|
want to edit files using just plain terminal-based editors over SSH.
|
||||||
|
Luckily with Vagrant you don't have to. By using _synced folders_, Vagrant
|
||||||
|
will automatically sync your files to and from the guest machine.
|
||||||
|
|
||||||
|
By default, Vagrant shares your project directory (remember, that is the
|
||||||
|
one with the Vagrantfile) to the `/vagrant` directory in your guest machine.
|
||||||
|
Run `vagrant up` again and SSH into your machine to see:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ vagrant up
|
||||||
|
...
|
||||||
|
$ vagrant ssh
|
||||||
|
...
|
||||||
|
vagrant@precise32:~$ ls /vagrant
|
||||||
|
Vagrantfile
|
||||||
|
```
|
||||||
|
|
||||||
|
Believe it or not, that Vagrantfile you see inside the virtual machine
|
||||||
|
is actually the same Vagrantfile that is on your actual host machine.
|
||||||
|
Go ahead and touch a file to prove it to yourself:
|
||||||
|
|
||||||
|
```
|
||||||
|
vagrant@precise32:~$ touch /vagrant/foo
|
||||||
|
vagrant@precise32:~$ exit
|
||||||
|
$ ls
|
||||||
|
foo Vagrantfile
|
||||||
|
```
|
||||||
|
|
||||||
|
Whoa! "foo" is now on your host machine. As you can see, Vagrant kept
|
||||||
|
the folders in sync.
|
||||||
|
|
||||||
|
With [synced folders](/v2/synced-folders/index.html), you can continue
|
||||||
|
to use your own editor on your host machine and have the files sync
|
||||||
|
into the guest machine.
|
|
@ -0,0 +1,40 @@
|
||||||
|
---
|
||||||
|
sidebar_current: "gettingstarted-teardown"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Teardown
|
||||||
|
|
||||||
|
We now have a fully functional virtual machine we can use for basic
|
||||||
|
web development. But now let's say it is time to switch gears, maybe work
|
||||||
|
on another project, maybe go out to lunch, or maybe just time to go home.
|
||||||
|
How do we clean up our development environment?
|
||||||
|
|
||||||
|
With Vagrant, you _suspend_, _halt_, or _destroy_ the guest machine.
|
||||||
|
Each of these options have pros and cons. Choose the method that works
|
||||||
|
best for you.
|
||||||
|
|
||||||
|
**Suspending** the virtual machine by calling `vagrant suspend` will
|
||||||
|
save the current running state of the machine and stop it. When you're
|
||||||
|
ready to begin working again, just run `vagrant up`, and it will be
|
||||||
|
resumed from where you left off. The main benefit of this method is that it
|
||||||
|
is super fast, usually taking only 5 to 10 seconds to stop and start your
|
||||||
|
work. The downside is that the virtual machine still eats up your disk space,
|
||||||
|
and requires even more disk space to store all the state of the virtual
|
||||||
|
machine RAM on disk.
|
||||||
|
|
||||||
|
**Halting** the virtual machine will gracefully shut down the guest
|
||||||
|
operating system and power down the guest machine. You can use `vagrant up`
|
||||||
|
when you're ready to boot it again. The benefit of this method is that
|
||||||
|
it will cleanly shut down your machine, preserving the contents of disk,
|
||||||
|
and allowing it to be cleanly started again. The downside is that it'll
|
||||||
|
take some extra time to start from a cold boot, and the guest machine
|
||||||
|
still consumes disk space.
|
||||||
|
|
||||||
|
**Destroying** the virtual machine will remove all traces of the guest
|
||||||
|
machine from your system. It'll stop the guest machine, power it down,
|
||||||
|
and remove all of the guest hard disks. Again, when you're ready to work
|
||||||
|
again, just issue a `vagrant up`. The benefit of this is that _no cruft_
|
||||||
|
is left on your machine. The disk space and RAM consumed by the guest machine
|
||||||
|
is reclaimed and your host machine is left clean. The downside is that
|
||||||
|
`vagrant up` to get working again will take some extra time since it
|
||||||
|
has to reimport the machine and reprovision it.
|
|
@ -0,0 +1,34 @@
|
||||||
|
---
|
||||||
|
sidebar_current: "gettingstarted-up"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Up And SSH
|
||||||
|
|
||||||
|
It is time to boot your first guest machine. Run the following:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ vagrant up
|
||||||
|
```
|
||||||
|
|
||||||
|
In less than a minute, this command will finish and you'll have a
|
||||||
|
virtual machine running Ubuntu. You won't actually _see_ anything though,
|
||||||
|
since Vagrant runs the virtual machine without a UI. To prove that it is
|
||||||
|
running, you can SSH into the machine:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ vagrant ssh
|
||||||
|
```
|
||||||
|
|
||||||
|
This command will drop you into a full-fledged SSH session. Go ahead and
|
||||||
|
interact with the machine and do whatever you want. Although it may be tempting,
|
||||||
|
be careful about `rm -rf /`, since Vagrant shares a directory at `/vagrant`
|
||||||
|
with the directory on the host containing your Vagrantfile, and this can
|
||||||
|
delete all those files. Shared folders will be covered in the next section.
|
||||||
|
|
||||||
|
Take a moment to think what just happened: With just one line of configuration
|
||||||
|
and one command in your terminal, we brought up a fully functional, SSH accessible
|
||||||
|
virtual machine. Cool.
|
||||||
|
|
||||||
|
When you're done fiddling around with the machine, run `vagrant destroy`
|
||||||
|
back on your host machine, and Vagrant will remove all traces of the
|
||||||
|
virtual machine.
|
|
@ -0,0 +1,10 @@
|
||||||
|
---
|
||||||
|
sidebar_current: "overview"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Vagrant Documentation
|
||||||
|
|
||||||
|
Welcome to the Vagrant docs! This site documents Vagrant from top-to-bottom,
|
||||||
|
covering every feature of Vagrant in great detail. If you're just getting
|
||||||
|
started with Vagrant, it is highly recommended you start with the
|
||||||
|
[getting started guide](/v2/getting-started/index.html).
|
|
@ -0,0 +1,34 @@
|
||||||
|
---
|
||||||
|
sidebar_current: "installation-backwards-compatibility"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Backwards Compatibility
|
||||||
|
|
||||||
|
## For 1.0.x
|
||||||
|
|
||||||
|
Vagrant 1.1+ provides full backwards compatibility for valid Vagrant 1.0.x
|
||||||
|
Vagrantfiles which don't use plugins. After installing Vagrant 1.1, your 1.0.x environments should
|
||||||
|
continue working without modifications, and existing running machines will
|
||||||
|
continue to be managed properly.
|
||||||
|
|
||||||
|
If you use any Vagrant 1.0.x plugins, you must remove references to these from
|
||||||
|
your Vagrantfile prior to upgrading. Vagrant 1.1+ introduces a new plugin
|
||||||
|
format that will protect against this sort of incompatibility from ever
|
||||||
|
happening again.
|
||||||
|
|
||||||
|
If your Vagrantfile doesn't just work with 1.1 and doesn't use any plugins,
|
||||||
|
please [report a bug](https://github.com/mitchellh/vagrant/issues).
|
||||||
|
|
||||||
|
## For 1.x
|
||||||
|
|
||||||
|
Backwards compatibility between 1.x is not promised, and Vagrantfile
|
||||||
|
syntax stability isn't promised until 2.0 final. Any backwards incompatibilities
|
||||||
|
within 1.x will be clearly documented.
|
||||||
|
|
||||||
|
This is similar to how Vagrant 0.x was handled. In practice, Vagrant 0.x
|
||||||
|
only introduced a handful of backwards incompatibilities during the entire
|
||||||
|
development cycle, but the possibility of backwards incompatibilities
|
||||||
|
is made clear so people aren't surprised.
|
||||||
|
|
||||||
|
Vagrant 2.0 final will have a stable Vagrantfile format that will
|
||||||
|
remain backwards compatible, just as 1.0 is considered stable.
|
|
@ -0,0 +1,27 @@
|
||||||
|
---
|
||||||
|
sidebar_current: "installation"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Installing Vagrant
|
||||||
|
|
||||||
|
Installing Vagrant is extremely easy. Head over to the
|
||||||
|
[downloads page](http://downloads.vagrantup.com/) and get the appropriate
|
||||||
|
installer or package for your platform. Then install it using standard
|
||||||
|
procedures for your operating system.
|
||||||
|
|
||||||
|
The installer will automatically add `vagrant` to your system path
|
||||||
|
so that it is available in terminals. If it is not found, please try
|
||||||
|
logging out and logging back in to your system (this is particularly necessary sometimes
|
||||||
|
for Windows).
|
||||||
|
|
||||||
|
If you have an old version of Vagrant 1.0.x installed via [RubyGems](http://en.wikipedia.org/wiki/RubyGems),
|
||||||
|
please remove it prior to installing a newer version of Vagrant.
|
||||||
|
|
||||||
|
<div class="alert alert-info">
|
||||||
|
<h3>Gem Install?</h3>
|
||||||
|
<p>
|
||||||
|
Vagrant 1.0.x had the option to be installed as a
|
||||||
|
<a href="http://en.wikipedia.org/wiki/RubyGems">RubyGem</a>. This
|
||||||
|
installation method has been removed for installers and packages only.
|
||||||
|
</p>
|
||||||
|
</div>
|
|
@ -0,0 +1,38 @@
|
||||||
|
---
|
||||||
|
sidebar_current: "installation-uninstallation"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Uninstalling Vagrant
|
||||||
|
|
||||||
|
Uninstalling Vagrant is easy and straightforward. You can either uninstall
|
||||||
|
the Vagrant binary, the user data, or both. The sections below cover how to
|
||||||
|
do this on every platform.
|
||||||
|
|
||||||
|
## Removing the Vagrant Program
|
||||||
|
|
||||||
|
Removing the Vagrant program will remove the `vagrant` binary and all
|
||||||
|
dependencies from your machine. After uninstalling the program, you can
|
||||||
|
always [reinstall](/v2/installation/index.html) again using standard
|
||||||
|
methods.
|
||||||
|
|
||||||
|
On **Windows**, uninstall using the add/remove programs section of
|
||||||
|
the control panel.
|
||||||
|
|
||||||
|
On **Mac OS X**, remove the `/Applications/Vagrant` directory and
|
||||||
|
the `/usr/bin/vagrant` file.
|
||||||
|
|
||||||
|
On **Linux**, remove the `/opt/vagrant` directory and the `/usr/bin/vagrant`
|
||||||
|
file.
|
||||||
|
|
||||||
|
## Removing User Data
|
||||||
|
|
||||||
|
Removing the user data will remove all [boxes](/v2/boxes.html),
|
||||||
|
[plugins](/v2/plugins/index.html), and any stored state that may be used
|
||||||
|
by Vagrant. Removing the user data effectively makes Vagrant think it
|
||||||
|
is once again a fresh install.
|
||||||
|
|
||||||
|
On every platform, remove the `~/.vagrant.d` directory to delete the
|
||||||
|
user data.
|
||||||
|
|
||||||
|
Running Vagrant will automatically regenerate any data necessary to run,
|
||||||
|
so it is safe to remove the user data at any time.
|
|
@ -0,0 +1,16 @@
|
||||||
|
---
|
||||||
|
sidebar_current: "installation-upgrading-1-0"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Upgrading From Vagrant 1.0.x
|
||||||
|
|
||||||
|
The upgrade process from 1.0.x to 1.x is straightforward. Vagrant is quite
|
||||||
|
[backwards compatible](/v2/installation/backwards-compatibility.html)
|
||||||
|
with Vagrant 1.0.x, so you can simply reinstall Vagrant
|
||||||
|
over your previous installation by downloading the latest package and
|
||||||
|
installing it using standard procedures for your operating system.
|
||||||
|
|
||||||
|
**However**, if your version of Vagrant was installed via RubyGems, then
|
||||||
|
you must `gem uninstall` the old version prior to installing the package for
|
||||||
|
the latest version of Vagrant. The RubyGems-based installation method has
|
||||||
|
been removed.
|
|
@ -0,0 +1,19 @@
|
||||||
|
---
|
||||||
|
sidebar_current: "installation-upgrading"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Upgrading Vagrant
|
||||||
|
|
||||||
|
If you're upgrading from Vagrant 1.0.x, please read the
|
||||||
|
[specific page dedicated to that](/v2/installation/upgrading-from-1-0.html).
|
||||||
|
This page covers upgrading Vagrant in general during the 1.x series.
|
||||||
|
|
||||||
|
Upgrades of Vagrant during the 1.x release series are straightforward:
|
||||||
|
download the new package, install it over the existing package. The installers
|
||||||
|
will properly remove old files, and Linux package managers should do the
|
||||||
|
same thing.
|
||||||
|
|
||||||
|
Note that Vagrantfile stability for the new Vagrantfile syntax is not
|
||||||
|
promised until 2.0 final. So while Vagrantfiles made for 1.0.x will
|
||||||
|
[continue to work](/v2/installation/backwards-compatibility.html),
|
||||||
|
newer Vagrantfiles may have backwards incompatible changes until 2.0 final.
|
|
@ -0,0 +1,89 @@
|
||||||
|
---
|
||||||
|
sidebar_current: "multimachine"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Multi-Machine
|
||||||
|
|
||||||
|
Vagrant is able to define and control multiple guest machines per
|
||||||
|
Vagrantfile. This is known as a "multi-machine" environment.
|
||||||
|
|
||||||
|
These machines are generally able to work together or are somehow associated
|
||||||
|
with each other. Here are some use-cases people are using multi-machine
|
||||||
|
environments for today:
|
||||||
|
|
||||||
|
* Accurately modeling a multi-server production topology, such as separating
|
||||||
|
a web and database server.
|
||||||
|
* Modeling a distributed system and how they interact with each other.
|
||||||
|
* Testing an interface, such as an API to a service component.
|
||||||
|
* Disaster-case testing: machines dying, network partitions, slow networks,
|
||||||
|
inconsistent world views, etc.
|
||||||
|
|
||||||
|
Historically, running complex environments such as these was done by
|
||||||
|
flattening them onto a single machine. The problem with that is that it is
|
||||||
|
an inaccurate model of the production setup, which can behave far differently.
|
||||||
|
|
||||||
|
Using the multi-machine feature of Vagrant, these environments can be modeled
|
||||||
|
in the context of a single Vagrant environment without losing any of the
|
||||||
|
benefits of Vagrant.
|
||||||
|
|
||||||
|
## Defining Multiple Machines
|
||||||
|
|
||||||
|
Multiple machines are defined within the same project [Vagrantfile](/v2/vagrantfile/index.html)
|
||||||
|
using the `config.vm.define` method call. This configuration directive
|
||||||
|
is a little funny, because it creates a Vagrant configuration within a
|
||||||
|
configuration. An example shows this best:
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
Vagrant.configure("2") do |config|
|
||||||
|
config.vm.provision :shell, :inline => "echo Hello"
|
||||||
|
|
||||||
|
config.vm.define :web do |web|
|
||||||
|
web.vm.box = "apache"
|
||||||
|
end
|
||||||
|
|
||||||
|
config.vm.define :db do |db|
|
||||||
|
db.vm.box = "mysql"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
|
As you can see, `config.vm.define` takes a block with another variable. This
|
||||||
|
variable, such as `web` above, is the _exact_ same as the `config` variable,
|
||||||
|
except any configuration of the inner variable applies only to the machine
|
||||||
|
being defined. Therefore, any configuration on `web` will only affect the
|
||||||
|
`:web` machine.
|
||||||
|
|
||||||
|
And importantly, you can continue to use the `config` object as well. The
|
||||||
|
configuration object is loaded and merged before the machine-specific configuration,
|
||||||
|
just like other Vagrantfiles within the
|
||||||
|
[Vagrantfile load order](/v2/vagrantfile/index.html#load-order).
|
||||||
|
|
||||||
|
If you're familiar with programming, this is similar to how languages have
|
||||||
|
different variable scopes.
|
||||||
|
|
||||||
|
## Controlling Multiple Machines
|
||||||
|
|
||||||
|
The moment more than one machine is defined within a Vagrantfile, the
|
||||||
|
usage of the various `vagrant` commands changes slightly. The change should
|
||||||
|
be mostly intuitive.
|
||||||
|
|
||||||
|
Most commands, such as `vagrant up`, begin requiring the name of the machine
|
||||||
|
to control. Using the example above, you could say `vagrant up web`, or
|
||||||
|
`vagrant up db`. If no name is specified, it is assumed you mean to perform
|
||||||
|
that operation on every machine. Therefore, `vagrant up` alone will bring
|
||||||
|
up both the web and DB machine.
|
||||||
|
|
||||||
|
Additionally, you can specify a regular expression for matching only
|
||||||
|
certain machines. This is useful in some cases where you specify many similar
|
||||||
|
machines, for example if you're testing a distributed service you may have
|
||||||
|
a `master` machine as well as a `slave0`, `slave1`, `slave2`, etc. If you
|
||||||
|
want to bring up all the slaves but not the master, you can just do
|
||||||
|
`vagrant up /slave[0-9]/`. If Vagrant sees a machine name within forward
|
||||||
|
slashes, it assumes you're using a regular expression.
|
||||||
|
|
||||||
|
## Communication Between Machines
|
||||||
|
|
||||||
|
In order to faciliate communication within machines in a multi-machine setup,
|
||||||
|
the various [networking](/v2/networking/index.html) options should be used.
|
||||||
|
In particular, the [private network](/v2/networking/private_network.html) can
|
||||||
|
be used to make a private network between multiple machines and the host.
|
|
@ -0,0 +1,42 @@
|
||||||
|
---
|
||||||
|
sidebar_current: "networking-basic"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Basic Usage of Networking
|
||||||
|
|
||||||
|
Vagrant offers multiple options for how you are able to connect your
|
||||||
|
guest machines to the network, but there is a standard usage pattern as
|
||||||
|
well as some points common to all network configurations that
|
||||||
|
are important to know.
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
All networks are configured within your [Vagrantfile](/v2/vagrantfile/index.html)
|
||||||
|
using the `config.vm.network` method call. For example, the Vagrantfile
|
||||||
|
below defines some port forwarding:
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
Vagrant.configure("2") do |config|
|
||||||
|
# other config here
|
||||||
|
|
||||||
|
config.vm.network :forwarded_port, guest: 80, host: 8080
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
|
Every network type has an identifier such as `:forwarded_port` in the above
|
||||||
|
example. Following this is a set of configuration arguments that can differ
|
||||||
|
for each network type. In the case of forwarded ports, two numeric arguments
|
||||||
|
are expected: the port on the guest followed by the port on the host that
|
||||||
|
the guest port can be accessed by.
|
||||||
|
|
||||||
|
## Multiple Networks
|
||||||
|
|
||||||
|
Multiple networks can be defined by having multiple `config.vm.network`
|
||||||
|
calls within the Vagrantfile. The exact meaning of this can differ for
|
||||||
|
each [provider](/v2/providers/index.html), but in general the order specifies
|
||||||
|
the order in which the networks are enabled.
|
||||||
|
|
||||||
|
## Enabling Networks
|
||||||
|
|
||||||
|
Networks are automatically configured and enabled after they've been defined
|
||||||
|
in the Vagrantfile as part of the `vagrant up` or `vagrant reload` process.
|
|
@ -0,0 +1,56 @@
|
||||||
|
---
|
||||||
|
sidebar_current: "networking-fp"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Forwarded Ports
|
||||||
|
|
||||||
|
**Network identifier: `:forwarded_port`**
|
||||||
|
|
||||||
|
Forwarded ports allow you to access a port on your host machine and have
|
||||||
|
all data forwarded to a port on the guest machine, over either TCP or UDP.
|
||||||
|
|
||||||
|
For example: If the guest machine is running a web server listening on port 80,
|
||||||
|
you can make a forwarded port mapping to port 8080 (or anything) on your host
|
||||||
|
machine. You can then open your browser to `localhost:8080` and browse the
|
||||||
|
website, while all actual network data is being sent to the guest.
|
||||||
|
|
||||||
|
## Defining a Forwarded Port
|
||||||
|
|
||||||
|
The forwarded port configuration expects two parameters, the port on the
|
||||||
|
guest and the port on the host. Example:
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
Vagrant.configure("2") do |config|
|
||||||
|
config.vm.network :forwarded_port, guest: 80, host: 8080
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
|
This will allow acessing port 80 on the guest via port 8080 on the host.
|
||||||
|
|
||||||
|
## Port Collisions and Correction
|
||||||
|
|
||||||
|
It is common when running multiple Vagrant machines to unknowingly create
|
||||||
|
forwarded port definitions that collide with each other (two separate
|
||||||
|
Vagrant projects forwarded to port 8080, for example). Vagrant includes
|
||||||
|
built-in mechanism to detect this and correct it, automatically.
|
||||||
|
|
||||||
|
Port collision detection is always done. Vagrant will not allow you to
|
||||||
|
define a forwarded port where the port on the host appears to be accepting
|
||||||
|
traffic or connections.
|
||||||
|
|
||||||
|
Port collision auto-correction must be manually enabled for each forwarded
|
||||||
|
port, since it is often surprising when it occurs and can lead the Vagrant
|
||||||
|
user to think that the port wasn't properly forwarded. Enabling auto correct
|
||||||
|
is easy:
|
||||||
|
|
||||||
|
```
|
||||||
|
Vagrant.configure("2") do |config|
|
||||||
|
config.vm.network :forwarded_port, guest: 80, host: 8080,
|
||||||
|
auto_correct: true
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
|
The final `:auto_correct` parameter set to true tells Vagrant to auto
|
||||||
|
correct any collisions. During a `vagrant up` or `vagrant reload`, Vagrant
|
||||||
|
will output information about any collisions detections and auto corrections
|
||||||
|
made, so you can take notice and act accordingly.
|
|
@ -0,0 +1,39 @@
|
||||||
|
---
|
||||||
|
sidebar_current: "networking"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Networking
|
||||||
|
|
||||||
|
In order to access the Vagrant environment created, Vagrant exposes
|
||||||
|
some high-level networking options for things such as forwarded ports,
|
||||||
|
connecting to a public network, or creating a private network.
|
||||||
|
|
||||||
|
The high-level networking options are meant to define an abstraction that
|
||||||
|
works across multiple [providers](/v2/providers/index.html). This means that
|
||||||
|
you can take your Vagrantfile you used to spin up a VirtualBox machine and
|
||||||
|
you can reasonably expect that Vagrantfile to behave the same with something
|
||||||
|
like VMware.
|
||||||
|
|
||||||
|
You should first read the [basic usage](/v2/networking/basic_usage.html) page
|
||||||
|
and then continue by reading the documentation for a specific networking
|
||||||
|
primitive by following the navigation to the left.
|
||||||
|
|
||||||
|
## Advanced Configuration
|
||||||
|
|
||||||
|
In some cases,
|
||||||
|
these options are _too_ high-level, and you may want to more finely tune
|
||||||
|
and configure the network interfaces of the underlying machine. Most
|
||||||
|
providers expose [provider-specific configuration](/v2/providers/configuration.html)
|
||||||
|
to do this, so please read the documentation for your specific provider
|
||||||
|
to see what options are available.
|
||||||
|
|
||||||
|
<div class="alert alert-info">
|
||||||
|
<p>
|
||||||
|
<strong>For beginners:</strong> It is strongly recommended you use
|
||||||
|
only the high-level networking options until you are comfortable
|
||||||
|
with the Vagrant workflow and have things working at a basic level.
|
||||||
|
Provider-specific network configuration can very quickly lock you out
|
||||||
|
of your guest machine if improperly done.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
|
@ -0,0 +1,47 @@
|
||||||
|
---
|
||||||
|
sidebar_current: "networking-private"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Private Networks
|
||||||
|
|
||||||
|
**Network identifier: `:private_network`**
|
||||||
|
|
||||||
|
Private networks allow you to access your guest machine by some address
|
||||||
|
that is not publicly accessible from the global internet. In general, this
|
||||||
|
means your machine gets an address in the [private address space](http://en.wikipedia.org/wiki/Private_network#Private_IPv4_address_spaces).
|
||||||
|
|
||||||
|
Multiple machines within the same private network (also usually with the
|
||||||
|
restriction that they're backed by the same [provider](/v2/providers/index.html))
|
||||||
|
can communicate with each other on private networks.
|
||||||
|
|
||||||
|
<div class="alert alert-info">
|
||||||
|
<p>
|
||||||
|
<strong>Guest operating system support.</strong> Private networks
|
||||||
|
generally require configuring the network adapters on the guest
|
||||||
|
machine. This process varies from OS to OS. Vagrant ships with
|
||||||
|
knowledge of how to configure networks on a variety of guest
|
||||||
|
operating systems, but it is possible if you're using a particularly
|
||||||
|
old or new operating system that private networks won't properly
|
||||||
|
configure.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
## Static IP
|
||||||
|
|
||||||
|
The easiest way to use a private network is to assign a static IP to it.
|
||||||
|
This let's you access the Vagrant managed machine using a static, known
|
||||||
|
IP. The Vagrantfile for a static IP looks like this:
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
Vagrant.configure("2") do |config|
|
||||||
|
config.vm.network :private_network, ip: "192.168.50.4"
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
|
It is up to the users to make sure that the static IP doesn't collide
|
||||||
|
with any other machines on the same network.
|
||||||
|
|
||||||
|
While you can choose any IP you'd like, you _should_ use an IP from
|
||||||
|
the [reserved private address space](http://en.wikipedia.org/wiki/Private_network#Private_IPv4_address_spaces). These IPs are guaranteed to never be publicly routable,
|
||||||
|
and most routers actually block traffic from going to them from the
|
||||||
|
outside world.
|
|
@ -0,0 +1,38 @@
|
||||||
|
---
|
||||||
|
sidebar_current: "networking-public"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Public Networks
|
||||||
|
|
||||||
|
**Network identifier: `:public_network`**
|
||||||
|
|
||||||
|
Public networks are less private than private networks, and the exact
|
||||||
|
meaning actually varies from [provider to provider](/v2/providers/index.html),
|
||||||
|
hence the ambiguous definition. The idea is that while
|
||||||
|
[private networks](/v2/networking/private_network.html) should never allow the
|
||||||
|
general public access to your machine, public networks can.
|
||||||
|
|
||||||
|
<div class="alert alert-info">
|
||||||
|
<p>
|
||||||
|
<strong>Confused?</strong> We kind of are, too. It is likely that
|
||||||
|
public networks will be replaced by <code>:bridged</code> in a
|
||||||
|
future release, since that is in general what should be done with
|
||||||
|
public networks, and providers that don't support bridging generally
|
||||||
|
don't have any other features that map to public networks either.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
## DHCP
|
||||||
|
|
||||||
|
The easiest way to use a public network is to allow the IP to be assigned
|
||||||
|
via DHCP. In this case, defining a public network is trivially easy:
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
Vagrant.configure("2") do |config|
|
||||||
|
config.vm.network :public_network
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
|
When DHCP is used, the IP can be determined by using `vagrant ssh` to
|
||||||
|
SSH into the machine and using the appropriate command line tool to find
|
||||||
|
the IP, such as `ifconfig`.
|
|
@ -0,0 +1,115 @@
|
||||||
|
---
|
||||||
|
sidebar_current: "plugins-commands"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Plugin Development: Commands
|
||||||
|
|
||||||
|
This page documents how to add new commands to Vagrant, invokable
|
||||||
|
via `vagrant YOUR-COMMAND`. Prior to reading this, you should be familiar
|
||||||
|
with the [plugin development basics](/v2/plugins/development-basics.html).
|
||||||
|
|
||||||
|
<div class="alert alert-warn">
|
||||||
|
<p>
|
||||||
|
<strong>Warning: Advanced Topic!</strong> Developing plugins is an
|
||||||
|
advanced topic that only experienced Vagrant users who are reasonably
|
||||||
|
comfortable with Ruby should approach.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
## Definition Component
|
||||||
|
|
||||||
|
Within the context of a plugin definition, new commands can be defined
|
||||||
|
like so:
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
command "foo" do
|
||||||
|
require_relative "command"
|
||||||
|
Command
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
|
Commands are defined with the `command` method, which takes as an argument
|
||||||
|
the name of the command, in this case "foo." This means the command will be
|
||||||
|
invokable via `vagrant foo`. Then the block argument returns a class that
|
||||||
|
implements the `Vagrant.plugin(2, :command)` interface.
|
||||||
|
|
||||||
|
## Implementation
|
||||||
|
|
||||||
|
Implementations of commands should subclass `Vagrant.plugin(2, :command)`,
|
||||||
|
which is a Vagrant method that will return the proper superclass for
|
||||||
|
a version 2 command. The implementation itself is quite simple, since the
|
||||||
|
class needs to only implement a single method: `execute`. Example:
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
class Command < Vagrant.plugin(2, :command)
|
||||||
|
def execute
|
||||||
|
puts "Hello!"
|
||||||
|
0
|
||||||
|
end
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
|
The `execute` method is called when the command is invoked, and it should
|
||||||
|
return the exit status (0 for success, anything else for error).
|
||||||
|
|
||||||
|
This is a command at its simplest form. Of course, the command superclass
|
||||||
|
gives you access to the Vagrant environment and provides some helpers to
|
||||||
|
do common tasks such as command line parsing.
|
||||||
|
|
||||||
|
## Parsing Command-Line Options
|
||||||
|
|
||||||
|
The `parse_options` method is available which will parse the command line
|
||||||
|
for you. It takes an [OptionParser](http://ruby-doc.org/stdlib-1.9.3/libdoc/optparse/rdoc/OptionParser.html)
|
||||||
|
as an argument, and adds some common elements to it such as the `--help` flag,
|
||||||
|
automatically showing help if requested. View the API docs directly for more
|
||||||
|
information.
|
||||||
|
|
||||||
|
This is recommended over raw parsing/manipulation of command line flags.
|
||||||
|
The following is an example of parsing command line flags pulled directly
|
||||||
|
from the built-in Vagrant `destroy` command:
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
options = {}
|
||||||
|
options[:force] = false
|
||||||
|
|
||||||
|
opts = OptionParser.new do |o|
|
||||||
|
o.banner = "Usage: vagrant destroy [vm-name]"
|
||||||
|
o.separator ""
|
||||||
|
|
||||||
|
o.on("-f", "--force", "Destroy without confirmation.") do |f|
|
||||||
|
options[:force] = f
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Parse the options
|
||||||
|
argv = parse_options(opts)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Using Vagrant Machines
|
||||||
|
|
||||||
|
The `with_target_vms` method is a helper that helps you interact with
|
||||||
|
the machines that Vagrant manages in a standard Vagrant way. This method
|
||||||
|
automatically does the right thing in the case of multi-machine environments,
|
||||||
|
handling target machines on the command line (`vagrant foo my-vm`), etc.
|
||||||
|
If you need to do any manipulation of a Vagrant machine, including SSH
|
||||||
|
access, this helper should be used.
|
||||||
|
|
||||||
|
An example of using the helper, again pulled directly from the built-in
|
||||||
|
`destroy` command:
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
with_target_vms(argv, :reverse => true) do |machine|
|
||||||
|
machine.action(:destroy)
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
|
In this case, it asks for the machines in reverse order and calls the
|
||||||
|
destroy action on each of them. If a user says `vagrant destroy foo`, then
|
||||||
|
the helper automatically only yields the `foo` machine. If no parameter
|
||||||
|
is given and it is a multi-machine environment, every machine in the environment
|
||||||
|
is yielded, and so on. It just does the right thing.
|
||||||
|
|
||||||
|
## Using the Raw Vagrant Environment
|
||||||
|
|
||||||
|
The raw loaded `Vagrant::Environment` object is available with the
|
||||||
|
'@env' instance variable.
|
|
@ -0,0 +1,165 @@
|
||||||
|
---
|
||||||
|
sidebar_current: "plugins-configuration"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Plugin Development: Configuration
|
||||||
|
|
||||||
|
This page documents how to add new configuration options to Vagrant,
|
||||||
|
settable with `config.YOURKEY` in Vagrantfiles. Prior to reading this, you should be familiar
|
||||||
|
with the [plugin development basics](/v2/plugins/development-basics.html).
|
||||||
|
|
||||||
|
<div class="alert alert-warn">
|
||||||
|
<p>
|
||||||
|
<strong>Warning: Advanced Topic!</strong> Developing plugins is an
|
||||||
|
advanced topic that only experienced Vagrant users who are reasonably
|
||||||
|
comfortable with Ruby should approach.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
## Definition Component
|
||||||
|
|
||||||
|
Within the context of a plugin definition, new configuration keys can be defined
|
||||||
|
like so:
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
config "foo" do
|
||||||
|
require_relative "config"
|
||||||
|
Config
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
|
Configuration keys are defined with the `config` method, which takes as an
|
||||||
|
argument the name of the configuration variable as the argument. This
|
||||||
|
means that the configuration object will be accessible via `config.foo`
|
||||||
|
in Vagrantfiles. Then, the block argument returns a class that implements
|
||||||
|
the `Vagrant.plugin(2, :config)` interface.
|
||||||
|
|
||||||
|
## Implementation
|
||||||
|
|
||||||
|
Implementations of configuration keys should subclass `Vagrant.plugin(2, :config)`,
|
||||||
|
which is a Vagrant method that will return the proper subclass for a version
|
||||||
|
2 configuration section. The implementation is very simple, and acts mostly
|
||||||
|
as a plain Ruby object. Here is an example:
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
class Config < Vagrant.plugin(2, :config)
|
||||||
|
attr_accessor :widgets
|
||||||
|
|
||||||
|
def initialize
|
||||||
|
@widgets = UNSET_VALUE
|
||||||
|
end
|
||||||
|
|
||||||
|
def finalize!
|
||||||
|
@widgets = 0 if @widgets == UNSET_VALUE
|
||||||
|
end
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
|
When using this configuration class, it looks like the following:
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
Vagrant.configure("2") do |config|
|
||||||
|
# ...
|
||||||
|
|
||||||
|
config.foo.widgets = 12
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
|
Easy. The only odd thing is the `UNSET_VALUE` bits above. This is actually
|
||||||
|
so that Vagrant can properly automatically merge multiple configurations.
|
||||||
|
Merging is covered in the next section, and `UNSET_VALUE` will be explained
|
||||||
|
there.
|
||||||
|
|
||||||
|
## Merging
|
||||||
|
|
||||||
|
Vagrant works by loading [multiple Vagrantfiles and merging them](/v2/vagrantfile/index.html#load-order).
|
||||||
|
This merge logic is built-in to configuration classes. When merging two
|
||||||
|
configuration objects, we'll call them "old" and "new", it'll by default
|
||||||
|
take all the instance variables defined on "new" that aren't `UNSET_VALUE`
|
||||||
|
and set them onto the merged result.
|
||||||
|
|
||||||
|
The reason `UNSET_VALUE` is used instead of Ruby's `nil` is because
|
||||||
|
it is possible that you want the default to be some value, and the user
|
||||||
|
actually wants to set the value to `nil`, and it is impossible for Vagrant
|
||||||
|
to automatically determine whether the user set the instance variable, or
|
||||||
|
if it was defaulted as nil.
|
||||||
|
|
||||||
|
This merge logic is what you want almost every time. Hence, in the example
|
||||||
|
above, `@widgets` is set to `UNSET_VALUE`. If we had two Vagrant configuration
|
||||||
|
objects in the same file, then Vagrant would properly merge the follows.
|
||||||
|
The example below shows this:
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
Vagrant.configure("2") do |config|
|
||||||
|
config.widgets = 1
|
||||||
|
end
|
||||||
|
|
||||||
|
Vagrant.configure("2") do |config|
|
||||||
|
# ... other stuff
|
||||||
|
end
|
||||||
|
|
||||||
|
Vagrant.configure("2") do |config|
|
||||||
|
config.widgets = 2
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
|
If this were placed in a Vagrantfile, after merging, the value of widgets
|
||||||
|
would be "2".
|
||||||
|
|
||||||
|
The `finalize!` method is called only once ever on the final configuration
|
||||||
|
object in order to set defaults. If `finalize!` is called, that configuration
|
||||||
|
will never be merged again, it is final. This lets you detect any `UNSET_VALUE`
|
||||||
|
and set the proper default, as we do in the above example.
|
||||||
|
|
||||||
|
Of course, sometimes you want custom merge logic. Let's say we
|
||||||
|
wanted our widgets to be additive. We can override the `merge` method to
|
||||||
|
do this:
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
class Config < Vagrant.config("2", :config)
|
||||||
|
attr_accessor :widgets
|
||||||
|
|
||||||
|
def initialize
|
||||||
|
@widgets = 0
|
||||||
|
end
|
||||||
|
|
||||||
|
def merge(other)
|
||||||
|
super.tap do |result|
|
||||||
|
result.widgets = @widgets + other.widgets
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
|
In this case, we didn't use `UNSET_VALUE` for widgets because we didn't
|
||||||
|
need that behavior. We default to 0 and always merge by summing the
|
||||||
|
two widgets. Now, if we ran the example above that had the 3 configuration
|
||||||
|
blocks, the final value of widgets would be "3".
|
||||||
|
|
||||||
|
## Validation
|
||||||
|
|
||||||
|
Configuration classes are also responsible for validating their own
|
||||||
|
values. Vagrant will call the `validate` method to do this. An example
|
||||||
|
validation method is shown below:
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
class Config < Vagrant.plugin("2", :config)
|
||||||
|
# ...
|
||||||
|
|
||||||
|
def validate(machine)
|
||||||
|
if @widgets <= 5
|
||||||
|
return { "foo" => ["widgets must be greater than 5"] }
|
||||||
|
end
|
||||||
|
|
||||||
|
{}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
|
The validation method is given a `machine` object, since validation is
|
||||||
|
done for each machine that Vagrant is managing. This allows you to
|
||||||
|
conditionally validate some keys based on the state of the machine and so on.
|
||||||
|
|
||||||
|
The return value is a Ruby Hash object, where the key is a section name,
|
||||||
|
and the value is a list of error messages. These will be displayed by
|
||||||
|
Vagrant. If there are no errors, an empty hash must be returned.
|
|
@ -0,0 +1,138 @@
|
||||||
|
---
|
||||||
|
sidebar_current: "plugins-development-basics"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Plugin Development Basics
|
||||||
|
|
||||||
|
Plugins are a great way to augment or change the behavior and functionality
|
||||||
|
of Vagrant. Since plugins introduce additional external dependencies for
|
||||||
|
users, they should be used as a last resort when attempting to
|
||||||
|
do something with Vagrant.
|
||||||
|
|
||||||
|
But if you need to introduce custom behaviors
|
||||||
|
into Vagrant, plugins are the best way, since they are safe against future
|
||||||
|
upgrades and use a stable API.
|
||||||
|
|
||||||
|
<div class="alert alert-warn">
|
||||||
|
<p>
|
||||||
|
<strong>Warning: Advanced Topic!</strong> Developing plugins is an
|
||||||
|
advanced topic that only experienced Vagrant users who are reasonably
|
||||||
|
comfortable with Ruby should approach.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
Plugins are written using [Ruby](http://www.ruby-lang.org/en/) and are packaged
|
||||||
|
using [RubyGems](http://rubygems.org/). Familiarity with Ruby is required,
|
||||||
|
but the [packaging and distribution](#) section should help
|
||||||
|
guide you to packaging your plugin into a RubyGem.
|
||||||
|
|
||||||
|
## Plugin Definition
|
||||||
|
|
||||||
|
All plugins are required to have a definition. A definition contains details
|
||||||
|
about the plugin such as the name of it and what components it contains.
|
||||||
|
|
||||||
|
A definition at the bare minimum looks like the following:
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
class MyPlugin < Vagrant.plugin("2")
|
||||||
|
name "My Plugin"
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
|
A definition is a class that inherits from `Vagrant.plugin("2")`. The "2"
|
||||||
|
there is the version that the plugin is valid for. API stability is only
|
||||||
|
promised for each major version of Vagrant, so this is important. (The
|
||||||
|
1.x series is working towards 2.0, so the API version is "2")
|
||||||
|
|
||||||
|
**The most critical feature of a plugin definition** is that it must _always_
|
||||||
|
load, no matter what version of Vagrant is running. Theoretically, Vagrant
|
||||||
|
version 87 (doesn't actually exist) would be able to load a version 2 plugin
|
||||||
|
definition. This is achieved through clever lazy loading of individual components
|
||||||
|
of the plugin, and is covered shortly.
|
||||||
|
|
||||||
|
## Plugin Components
|
||||||
|
|
||||||
|
Within the definition, a plugin advertises what components it adds to
|
||||||
|
Vagrant. An example is shown below where a command and provisioner are
|
||||||
|
added:
|
||||||
|
|
||||||
|
```
|
||||||
|
class MyPlugin < Vagrant.plugin("2")
|
||||||
|
name "My Plugin"
|
||||||
|
|
||||||
|
command "run-my-plugin" do
|
||||||
|
require_relative "command"
|
||||||
|
Command
|
||||||
|
end
|
||||||
|
|
||||||
|
provisioner "my-provisioner" do
|
||||||
|
require_relative "provisioner"
|
||||||
|
Provisioner
|
||||||
|
end
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
|
Let's go over the major pieces of what is going on here. Note from a general
|
||||||
|
Ruby language perspective the above _should_ be familiar. The syntax should
|
||||||
|
not scare you. If it does, then please familiarize with Ruby further before
|
||||||
|
attempting to write a plugin.
|
||||||
|
|
||||||
|
The first thing to note is that individual components are defined by
|
||||||
|
making a method call with the component name, such as `command` or
|
||||||
|
`provisioner`. These in turn take some parameters. In the case of our
|
||||||
|
example it is just the name of the command and the name of the provisioner.
|
||||||
|
All component definitions then take a block argument (a callback) that
|
||||||
|
must return the actual component implementation class.
|
||||||
|
|
||||||
|
The block argument is where the "clever lazy loading" (mentioned above)
|
||||||
|
comes into play. The component blocks should lazy load the actual file that
|
||||||
|
contains the implementation of the component, and then return that component.
|
||||||
|
|
||||||
|
This is done because the actual dependencies and APIs used when defining
|
||||||
|
components are not stable across major Vagrant versions. A command implementation
|
||||||
|
written for Vagrant 2.0 will not be compatible with Vagrant 3.0 and so on. But
|
||||||
|
the _definition_ is just plain Ruby that must always be forward compatible
|
||||||
|
to future Vagrant versions.
|
||||||
|
|
||||||
|
To repeat, **the lazy loading aspect of plugin components is critical**
|
||||||
|
to the way Vagrant plugins work. All components must be lazily loaded
|
||||||
|
and returned within their definition blocks.
|
||||||
|
|
||||||
|
Now, each component has a different API. Please visit the relevant section
|
||||||
|
using the navigation to the left under "Plugins" to learn more about developing
|
||||||
|
each type of component.
|
||||||
|
|
||||||
|
## Error Handling
|
||||||
|
|
||||||
|
One of Vagrant's biggest strength is gracefully handling errors and reporting
|
||||||
|
them in human-readable ways. Vagrant has always strongly believed that if
|
||||||
|
a user sees a stack trace, it is a bug. It is expected that plugins will behave
|
||||||
|
the same way, and Vagrant provides strong error handling mechanisms to
|
||||||
|
assist with this.
|
||||||
|
|
||||||
|
Error handling in Vagrant is done entirely by raising Ruby exceptions.
|
||||||
|
But Vagrant treats certain errors differently than others. If an error
|
||||||
|
is raised that inherits from `Vagrant::Errors::VagrantError`, then the
|
||||||
|
`vagrant` command will output the message of the error in nice red text
|
||||||
|
to the console and exit with an exit status of 1.
|
||||||
|
|
||||||
|
Otherwise, Vagrant reports an "unexpected error" that should be reported
|
||||||
|
as a bug, and shows a full stack trace and other ugliness. Any stack traces
|
||||||
|
should be considered bugs.
|
||||||
|
|
||||||
|
Therefore, to fit into Vagrant's error handling mechanisms, subclass
|
||||||
|
`VagrantError` and set a proper message on your exception. To see
|
||||||
|
examples of this, look at Vagrant's [built-in errors](https://github.com/mitchellh/vagrant/blob/master/lib/vagrant/errors.rb).
|
||||||
|
|
||||||
|
## Console Input and Output
|
||||||
|
|
||||||
|
Most plugins are likely going to want to do some sort of input/output.
|
||||||
|
Plugins should _never_ use Ruby's built-in `puts` or `gets` style methods.
|
||||||
|
Instead, all input/output should go through some sort of Vagrant UI object.
|
||||||
|
The Vagrant UI object properly handles cases where there is no TTY, output
|
||||||
|
pipes are closed, there is no input pipe, etc.
|
||||||
|
|
||||||
|
A UI object is available on every `Vagrant::Environment` via the `ui` property
|
||||||
|
and is exposed within every middleware environment via the `:ui` key. UI
|
||||||
|
objects have [decent documentation](https://github.com/mitchellh/vagrant/blob/master/lib/vagrant/ui.rb)
|
||||||
|
within the comments of their source.
|
|
@ -0,0 +1,99 @@
|
||||||
|
---
|
||||||
|
sidebar_current: "plugins-guestcapabilities"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Plugin Development: Guest Capabilities
|
||||||
|
|
||||||
|
This page documents how to add new capabilities for [guests](/v2/plugins/guests.html)
|
||||||
|
to Vagrant, allowing Vagrant to perform new actions on specific guest
|
||||||
|
operating systems.
|
||||||
|
Prior to reading this, you should be familiar
|
||||||
|
with the [plugin development basics](/v2/plugins/development-basics.html).
|
||||||
|
|
||||||
|
<div class="alert alert-warn">
|
||||||
|
<p>
|
||||||
|
<strong>Warning: Advanced Topic!</strong> Developing plugins is an
|
||||||
|
advanced topic that only experienced Vagrant users who are reasonably
|
||||||
|
comfortable with Ruby should approach.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
Guest capabilities augment [guests](/v2/plugins/guests.html) by attaching
|
||||||
|
specific "capabilities" to the guest, which are actions that can be performed
|
||||||
|
in the context of that guest operating system.
|
||||||
|
|
||||||
|
The power of capabilities is that plugins can add new capabilities to
|
||||||
|
existing guest operating systems without modifying the core of Vagrant.
|
||||||
|
In earlier versions of Vagrant, all the guest logic was contained in the
|
||||||
|
core of Vagrant and wasn't easily augmented.
|
||||||
|
|
||||||
|
## Definition Component
|
||||||
|
|
||||||
|
Within the context of a plugin definition, guest capabilities can be
|
||||||
|
defined like so:
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
guest_capability "ubuntu", "my_custom_capability" do
|
||||||
|
require_relative "cap/my_custom_capability"
|
||||||
|
Cap::MyCustomCapability
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
|
Guest capabilities are defined by calling the `guest_capability` method,
|
||||||
|
which takes two parameters: the guest to add the capability to, and the
|
||||||
|
name of the capability itself. Then, the block argument returns a class
|
||||||
|
that implements a method named the same as the capability. This is
|
||||||
|
coverd in more detail in the next section.
|
||||||
|
|
||||||
|
## Implementation
|
||||||
|
|
||||||
|
Implementations should be classes or modules that have a method with
|
||||||
|
the same name as the capability. The method must be immediately accessible
|
||||||
|
on the class returned from the `guest_capability` component, meaning that
|
||||||
|
if it is an instance method, an instance should be returned.
|
||||||
|
|
||||||
|
In general, class methods are used for capabilities. For example, here
|
||||||
|
is the imlementation for the capability above:
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
module Cap
|
||||||
|
class MyCustomCapability
|
||||||
|
def self.my_custom_capability(machine)
|
||||||
|
# implementation
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
|
All capabilities get the Vagrant machine object as the first argument.
|
||||||
|
Additional arguments are deterined by the specific capability, so view the
|
||||||
|
documentation or usage of the capability you're trying to implement for more
|
||||||
|
information.
|
||||||
|
|
||||||
|
Some capabilities must also return values back to the caller, so be aware
|
||||||
|
of that when implementing a capability.
|
||||||
|
|
||||||
|
Capabilities always have access to communication channels such as SSH
|
||||||
|
on the machine, and the machine can generally be assumed to be booted.
|
||||||
|
|
||||||
|
## Calling Capabilities
|
||||||
|
|
||||||
|
Since you have access to the machine in every capability, capabilities can
|
||||||
|
also call _other_ capabilities. This is useful for using the inheritance
|
||||||
|
mechanism of capabilities to potentially ask helpers for more information.
|
||||||
|
For example, the "redhat" guest has a "network\_scripts\_dir" capability that
|
||||||
|
simply returns the directory where networking scripts go.
|
||||||
|
|
||||||
|
Capabilities on child guests of RedHat such as CentOS or Fedora use this
|
||||||
|
capability to determine where networking scripts go, while sometimes overriding
|
||||||
|
it themselves.
|
||||||
|
|
||||||
|
Capabilities can be called like so:
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
machine.guest.capability(:capability_name)
|
||||||
|
```
|
||||||
|
|
||||||
|
Any additional arguments given to the method will be passed on to the
|
||||||
|
capability, and the capability will return the value that the actual
|
||||||
|
capability returned.
|
|
@ -0,0 +1,98 @@
|
||||||
|
---
|
||||||
|
sidebar_current: "plugins-guests"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Plugin Development: Guests
|
||||||
|
|
||||||
|
This page documents how to add new guest OS detection to Vagrant, allowing
|
||||||
|
Vagrant to properly configure new operating systems.
|
||||||
|
Prior to reading this, you should be familiar
|
||||||
|
with the [plugin development basics](/v2/plugins/development-basics.html).
|
||||||
|
|
||||||
|
<div class="alert alert-warn">
|
||||||
|
<p>
|
||||||
|
<strong>Warning: Advanced Topic!</strong> Developing plugins is an
|
||||||
|
advanced topic that only experienced Vagrant users who are reasonably
|
||||||
|
comfortable with Ruby should approach.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
Vagrant has many features that requires doing guest OS-specific
|
||||||
|
actions, such as mounting folders, configuring networks, etc. These
|
||||||
|
tasks vary from operating system to operating system. If you find that
|
||||||
|
one of these doesn't work for your operating system, then maybe the
|
||||||
|
guest implementation is incomplete or incorrect.
|
||||||
|
|
||||||
|
## Definition Component
|
||||||
|
|
||||||
|
Within the context of a plugin definition, new guests can be defined
|
||||||
|
like so:
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
guest "ubuntu" do
|
||||||
|
require_relative "guest"
|
||||||
|
Guest
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
|
Guests are defined with the `guest` method. The first argument is the
|
||||||
|
name of the guest. This name isn't actually used anywhere, but may in the
|
||||||
|
future, so choose something helpful. Then, the block argument returns a
|
||||||
|
class that implements the `Vagrant.plugin(2, :guest)` interface.
|
||||||
|
|
||||||
|
## Implementation
|
||||||
|
|
||||||
|
Implementations of guests subclass `Vagrant.plugin("2", "guest")`. Within
|
||||||
|
this implementation, only the `detect?` method needs to be implemented.
|
||||||
|
|
||||||
|
The `detect?` method is called by Vagrant at some point after the machine
|
||||||
|
is booted in order to determine what operating system the guest is running.
|
||||||
|
If you detect that it is your operating system, return `true` from `detect?`.
|
||||||
|
Otherwise, return `false`.
|
||||||
|
|
||||||
|
Communication channels to the machine are guranteed to be running at this
|
||||||
|
point, so the most common way to detect the operating system is to do
|
||||||
|
some basic testing:
|
||||||
|
|
||||||
|
```
|
||||||
|
class MyGuest < Vagrant.plugin("2", "guest")
|
||||||
|
def detect?(machine)
|
||||||
|
machine.communicate.test("cat /etc/myos-release")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
|
After detecting an OS, that OS is used for various
|
||||||
|
[guest capabilities](/v2/plugins/guest_capabilities.html) that may be
|
||||||
|
required.
|
||||||
|
|
||||||
|
## Guest Inheritance
|
||||||
|
|
||||||
|
Vagrant also supports a form of inheritance for guests, since sometimes
|
||||||
|
operating systems stem from a common root. A good example of this is Linux
|
||||||
|
is the root of Debian, which further is the root of Ubuntu in many cases.
|
||||||
|
Inheritance allows guests to share a lot of common behavior while allowing
|
||||||
|
distro-specific overrides.
|
||||||
|
|
||||||
|
Inheritance is not done via standard Ruby class inheritance because Vagrant
|
||||||
|
uses a custom [capability-based](/v2/plugins/guest_capabilities.html) system.
|
||||||
|
Vagrant handles inheritance dispatch for you.
|
||||||
|
|
||||||
|
To subclass another guest, specify that guest's name as a second parameter
|
||||||
|
in the guest definition:
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
guest "ubuntu", "debian" do
|
||||||
|
require_relative "guest"
|
||||||
|
Guest
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
|
With the above component, the "ubuntu" guest inherits from "debian." When
|
||||||
|
a capability is looked up for "ubuntu", all capabilities from "debian" are
|
||||||
|
also available, and any capabilities in "ubuntu" override parent capabilities.
|
||||||
|
|
||||||
|
When detecting operating systems with `detect?`, Vagrant always does a
|
||||||
|
depth-first search by searching the children operating systems before
|
||||||
|
checking their parents. Therefore, it is guaranteed in the above example
|
||||||
|
that the `detect?` method on "ubuntu" will be called before "debian."
|
|
@ -0,0 +1,45 @@
|
||||||
|
---
|
||||||
|
sidebar_current: "plugins-hosts"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Plugin Development: Hosts
|
||||||
|
|
||||||
|
This page documents how to add new host OS implementations to Vagrant,
|
||||||
|
allowing Vagrant to properly configure new host operating systems
|
||||||
|
for features such as NFS shared folders. Prior to reading this, you should be familiar
|
||||||
|
with the [plugin development basics](/v2/plugins/development-basics.html).
|
||||||
|
|
||||||
|
<div class="alert alert-warn">
|
||||||
|
<p>
|
||||||
|
<strong>Warning: Advanced Topic!</strong> Developing plugins is an
|
||||||
|
advanced topic that only experienced Vagrant users who are reasonably
|
||||||
|
comfortable with Ruby should approach.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
## Definition Component
|
||||||
|
|
||||||
|
Within the context of a plugin definition, new hosts can be defined
|
||||||
|
like so:
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
host "some_os" do
|
||||||
|
require_relative "host"
|
||||||
|
Host
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
|
Guests are defined with the `host` method. The first argument is th
|
||||||
|
name of the host. This name isn't actually used anywhere, but may in
|
||||||
|
the future, so choose something helpful. Then, the block argument returns a
|
||||||
|
class that implements the `Vagrant.plugin(2, :host)` interface.
|
||||||
|
|
||||||
|
## Implementation
|
||||||
|
|
||||||
|
Implementations of hosts subclass `Vagrant.plugin(2, :host)`. Within
|
||||||
|
this implementation, various methods for different tasks must be implemented.
|
||||||
|
Instead of going over each task, the easiest example would be to take a
|
||||||
|
look at an existing host implementation.
|
||||||
|
|
||||||
|
There are [many host implementations](https://github.com/mitchellh/vagrant/tree/master/plugins/hosts),
|
||||||
|
but you can view the [BSD host implementation](https://github.com/mitchellh/vagrant/blob/master/plugins/hosts/bsd/host.rb) as a starting point.
|
|
@ -0,0 +1,20 @@
|
||||||
|
---
|
||||||
|
sidebar_current: "plugins"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Plugins
|
||||||
|
|
||||||
|
Vagrant comes with many great features out of the box to get your environments up
|
||||||
|
and running. Sometimes, however, you want to change the way Vagrant does something
|
||||||
|
or add additional functionality to Vagrant. This can be done via Vagrant
|
||||||
|
_plugins_.
|
||||||
|
|
||||||
|
Plugins are powerful, first-class citizens that extend Vagrant using a
|
||||||
|
well-documented, stable API that can withstand major version upgrades.
|
||||||
|
|
||||||
|
In fact, most of the core of Vagrant is [implemented using plugins](https://github.com/mitchellh/vagrant/tree/master/plugins).
|
||||||
|
Since Vagrant [dogfoods](http://en.wikipedia.org/wiki/Eating_your_own_dog_food) its own
|
||||||
|
plugin API, you can be confident that the interface is stable and well supported.
|
||||||
|
|
||||||
|
Use the navigation on the left below the "Plugins" section to learn more
|
||||||
|
about how to use and build your own plugins.
|
|
@ -0,0 +1,101 @@
|
||||||
|
---
|
||||||
|
sidebar_current: "plugins-packaging"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Plugin Development: Packaging & Distribution
|
||||||
|
|
||||||
|
This page documents how to add new commands to Vagrant, invokable.
|
||||||
|
This page documents how to organize the file structure of your plugin
|
||||||
|
and distribute it so that it is installable using
|
||||||
|
[standard installation methods](/v2/plugins/usage.html).
|
||||||
|
Prior to reading this, you should be familiar
|
||||||
|
with the [plugin development basics](/v2/plugins/development-basics.html).
|
||||||
|
|
||||||
|
<div class="alert alert-warn">
|
||||||
|
<p>
|
||||||
|
<strong>Warning: Advanced Topic!</strong> Developing plugins is an
|
||||||
|
advanced topic that only experienced Vagrant users who are reasonably
|
||||||
|
comfortable with Ruby should approach.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
## Example Plugin
|
||||||
|
|
||||||
|
The best way to describe packaging and distribution is to look at
|
||||||
|
how another plugin does it. The best example plugin available for this
|
||||||
|
is [vagrant-aws](https://github.com/mitchellh/vagrant-aws).
|
||||||
|
|
||||||
|
By using [Bundler](http://gembundler.com) and Rake, building a new
|
||||||
|
vagrant-aws package is easy. By simply calling `rake package`, a
|
||||||
|
`gem` file is dropped into the directory. By calling `rake release`,
|
||||||
|
the gem is built and it is uploaded to the central [RubyGems](http://rubygems.org)
|
||||||
|
repository so that it can be installed using `vagrant plugin install`.
|
||||||
|
|
||||||
|
Your plugin can and should be this easy, too, since you basically
|
||||||
|
get this for free by using Bundler.
|
||||||
|
|
||||||
|
## Setting Up Your Project
|
||||||
|
|
||||||
|
To setup your project, run `bundle gem vagrant-my-plugin`. This will create a
|
||||||
|
`vagrant-my-plugin` directory that has the initial layout to be a RubyGem.
|
||||||
|
|
||||||
|
You should modify the `vagrant-my-plugin.gemspec` file to add any
|
||||||
|
dependencies and change any metadata. View the [vagrant-aws.gemspec](https://github.com/mitchellh/vagrant-aws/blob/master/vagrant-aws.gemspec)
|
||||||
|
for a good example.
|
||||||
|
|
||||||
|
<div class="alert alert-warn">
|
||||||
|
<p>
|
||||||
|
<strong>Do not depend on Vagrant</strong> for your gem. Vagrant
|
||||||
|
is no longer distributed as a gem, and you can assume that it will
|
||||||
|
always be available when your plugin is installed.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
Next, create a `Rakefile` that has at the very least, the following
|
||||||
|
contents:
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
require 'rubygems'
|
||||||
|
require 'bundler/setup'
|
||||||
|
Bundler::GemHelper.install_tasks
|
||||||
|
```
|
||||||
|
|
||||||
|
If you run `rake -T` now, which lists all the available rake tasks,
|
||||||
|
you should see that you have the `package` and `release` tasks. You
|
||||||
|
can now develop your plugin and build it!
|
||||||
|
|
||||||
|
You can view the [vagrant-aws Rakefile](https://github.com/mitchellh/vagrant-aws/blob/master/Rakefile)
|
||||||
|
for a more comprehensive example that includes testing.
|
||||||
|
|
||||||
|
## Testing Your Plugin
|
||||||
|
|
||||||
|
You have a couple options for testing your plugin. First, you can run
|
||||||
|
`rake package`, then `vagrant plugin install` the resulting file to
|
||||||
|
test it. The downside of this is that there is a pretty slow feedback
|
||||||
|
loop every time you want to test the plugin.
|
||||||
|
|
||||||
|
Alternatively, you can depend on Vagrant from your Gemfile for development
|
||||||
|
purposes only. Then you can use `bundle exec vagrant` and a Vagrantfile
|
||||||
|
in your own directory to test it. This has a fast feedback loop, but requires
|
||||||
|
that Vagrant has all the dependencies it needs installed on your system.
|
||||||
|
|
||||||
|
vagrant-aws uses the second option. You can see the dependency in the
|
||||||
|
[Gemfile](https://github.com/mitchellh/vagrant-aws/blob/master/Gemfile).
|
||||||
|
The Vagrantfile is gitignored so that sensitive and volatile test
|
||||||
|
information can be put into it. The important bit is that the Vagrantfile
|
||||||
|
must have a `Vagrant.require_plugin` call so that it is loaded, since
|
||||||
|
Vagrant doesn't automatically know about plugins not installed using
|
||||||
|
`vagrant plugin`.
|
||||||
|
|
||||||
|
For example, a vagrant-aws development Vagrantfile might look like this:
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
Vagrant.require_plugin "vagrant-aws"
|
||||||
|
|
||||||
|
Vagrant.configure("2") do |config|
|
||||||
|
config.vm.box = "test"
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
|
Then you can run `bundle exec vagrant up` to test it. Note the "bundle exec"
|
||||||
|
is required so that Bundler uses the proper Vagrant installation.
|