From 5ea48963effbdfd3f8dbfe86cbd643bee28da91d Mon Sep 17 00:00:00 2001 From: Arthur Lutz Date: Fri, 9 May 2014 14:21:36 +0200 Subject: [PATCH 1/2] [vagrant+salt] initial commit --- Vagrantfile | 124 ++++++++++++++++ salt/minion | 219 ++++++++++++++++++++++++++++ salt/roots/apache.sls | 3 + salt/roots/btb.sls | 35 +++++ salt/roots/create_admin.py | 5 + salt/roots/dependencies.sls | 35 +++++ salt/roots/deploy.sls | 5 + salt/roots/init_db.sls | 27 ++++ salt/roots/install_deps_from_src.sh | 4 + salt/roots/ntp.sls | 2 + salt/roots/settings.py | 137 +++++++++++++++++ salt/roots/start_server.sls | 8 + salt/roots/top.sls | 8 + 13 files changed, 612 insertions(+) create mode 100644 Vagrantfile create mode 100644 salt/minion create mode 100644 salt/roots/apache.sls create mode 100644 salt/roots/btb.sls create mode 100644 salt/roots/create_admin.py create mode 100644 salt/roots/dependencies.sls create mode 100644 salt/roots/deploy.sls create mode 100644 salt/roots/init_db.sls create mode 100644 salt/roots/install_deps_from_src.sh create mode 100644 salt/roots/ntp.sls create mode 100644 salt/roots/settings.py create mode 100644 salt/roots/start_server.sls create mode 100644 salt/roots/top.sls diff --git a/Vagrantfile b/Vagrantfile new file mode 100644 index 0000000..5ae9307 --- /dev/null +++ b/Vagrantfile @@ -0,0 +1,124 @@ +# -*- mode: ruby -*- +# vi: set ft=ruby : + +Vagrant.configure("2") do |config| + # All Vagrant configuration is done here. The most common configuration + # options are documented and commented below. For a complete reference, + # please see the online documentation at vagrantup.com. + + # Every Vagrant virtual environment requires a box to build off of. + config.vm.box = "trusty64" + + # The url from where the 'config.vm.box' box will be fetched if it + # doesn't already exist on the user's system. + # config.vm.box_url = "http://domain.com/path/to/above.box" + + # Create a forwarded port mapping which allows access to a specific port + # within the machine from a port on the host machine. In the example below, + # accessing "localhost:8080" will access port 80 on the guest machine. + config.vm.network :forwarded_port, guest: 8000, host: 8000 + config.vm.network :forwarded_port, guest: 80, host: 8080 + config.vm.network :forwarded_port, guest: 443, host: 8443 + + # Create a private network, which allows host-only access to the machine + # using a specific IP. + # config.vm.network :private_network, ip: "192.168.33.10" + + # Create a public network, which generally matched to bridged network. + # Bridged networks make the machine appear as another physical device on + # your network. + # config.vm.network :public_network + + # Share an additional folder to the guest VM. The first argument is + # the path on the host to the actual folder. The second argument is + # the path on the guest to mount the folder. And the optional third + # argument is a set of non-required options. + # config.vm.synced_folder "../data", "/vagrant_data" + + # Provider-specific configuration so you can fine-tune various + # backing providers for Vagrant. These expose provider-specific options. + # Example for VirtualBox: + # + # config.vm.provider :virtualbox do |vb| + # # Don't boot with headless mode + # vb.gui = true + # + # # Use VBoxManage to customize the VM. For example to change memory: + # vb.customize ["modifyvm", :id, "--memory", "1024"] + # end + # + # View the documentation for the provider you're using for more + # information on available options. + + # Enable provisioning with Puppet stand alone. Puppet manifests + # are contained in a directory path relative to this Vagrantfile. + # You will need to create the manifests directory and a manifest in + # the file base.pp in the manifests_path directory. + # + # An example Puppet manifest to provision the message of the day: + # + # # group { "puppet": + # # ensure => "present", + # # } + # # + # # File { owner => 0, group => 0, mode => 0644 } + # # + # # file { '/etc/motd': + # # content => "Welcome to your Vagrant-built virtual machine! + # # Managed by Puppet.\n" + # # } + # + # config.vm.provision :puppet do |puppet| + # puppet.manifests_path = "manifests" + # puppet.manifest_file = "init.pp" + # end + + # Enable provisioning with chef solo, specifying a cookbooks path, roles + # path, and data_bags path (all relative to this Vagrantfile), and adding + # some recipes and/or roles. + # + # config.vm.provision :chef_solo do |chef| + # chef.cookbooks_path = "../my-recipes/cookbooks" + # chef.roles_path = "../my-recipes/roles" + # chef.data_bags_path = "../my-recipes/data_bags" + # chef.add_recipe "mysql" + # chef.add_role "web" + # + # # You may also specify custom JSON attributes: + # chef.json = { :mysql_password => "foo" } + # end + + # Enable provisioning with chef server, specifying the chef server URL, + # and the path to the validation key (relative to this Vagrantfile). + # + # The Opscode Platform uses HTTPS. Substitute your organization for + # ORGNAME in the URL and validation key. + # + # If you have your own Chef Server, use the appropriate URL, which may be + # HTTP instead of HTTPS depending on your configuration. Also change the + # validation key to validation.pem. + # + # config.vm.provision :chef_client do |chef| + # chef.chef_server_url = "https://api.opscode.com/organizations/ORGNAME" + # chef.validation_key_path = "ORGNAME-validator.pem" + # end + # + # If you're using the Opscode platform, your validator client is + # ORGNAME-validator, replacing ORGNAME with your organization name. + # + # If you have your own Chef Server, the default validation client name is + # chef-validator, unless you changed the configuration. + # + # chef.validation_client_name = "ORGNAME-validator" + + ## For masterless, mount your salt file root + config.vm.synced_folder "salt/roots/", "/srv/salt/" + + ## Use all the defaults: + config.vm.provision :salt do |salt| + + salt.minion_config = "salt/minion" + salt.run_highstate = true + + end +end diff --git a/salt/minion b/salt/minion new file mode 100644 index 0000000..2d29168 --- /dev/null +++ b/salt/minion @@ -0,0 +1,219 @@ +##### Primary configuration settings ##### +########################################## +# Set the location of the salt master server, if the master server cannot be +# resolved, then the minion will fail to start. +master: localhost + +# Set the port used by the master reply and authentication server +#master_port: 4506 + +# The user to run salt +#user: root + +# The root directory prepended to these options: pki_dir, cachedir, log_file. +#root_dir: / + +# The directory to store the pki information in +#pki_dir: /etc/salt/pki + +# Explicitly declare the id for this minion to use, if left commented the id +# will be the hostname as returned by the python call: socket.getfqdn() +# Since salt uses detached ids it is possible to run multiple minions on the +# same machine but with different ids, this can be useful for salt compute +# clusters. +#id: testing + +# Append a domain to a hostname in the event that it does not exist. This is +# usefule for systems where socket.getfqdn() does not actually result in a +# FQDN (for instance, Solaris). +#append_domain: + +# If the the connection to the server is interrupted, the minion will +# attempt to reconnect. sub_timeout allows you to control the rate +# of reconnection attempts (in seconds). To disable reconnects, set +# this value to 0. +#sub_timeout: 60 + +# Where cache data goes +#cachedir: /var/cache/salt + +# The minion can locally cache the return data from jobs sent to it, this +# can be a good way to keep track of jobs the minion has executed +# (on the minion side). By default this feature is disabled, to enable +# set cache_jobs to True +#cache_jobs: False + +# When waiting for a master to accept the minion's public key, salt will +# continuously attempt to reconnect until successful. This is the time, in +# seconds, between those reconnection attempts. +#acceptance_wait_time = 10 + +# When healing a dns_check is run, this is to make sure that the originally +# resolved dns has not changed, if this is something that does not happen in +# your environment then set this value to False. +#dns_check: True + + +##### Minion module management ##### +########################################## +# Disable specific modules. This allows the admin to limit the level of +# access the master has to the minion +#disable_modules: [cmd,test] +#disable_returners: [] +# +# Modules can be loaded from arbitrary paths. This enables the easy deployment +# of third party modules. Modules for returners and minions can be loaded. +# Specify a list of extra directories to search for minion modules and +# returners. These paths must be fully qualified! +#module_dirs: [] +#returner_dirs: [] +#states_dirs: [] +#render_dirs: [] +# +# A module provider can be statically overwritten or extended for the minion +# via the providers option, in this case the default module will be +# overwritten by the specified module. In this example the pkg module will +# be provided by the yumpkg5 module instead of the system default. +# +# providers: +# pkg: yumpkg5 +# +# Enable Cython modules searching and loading. (Default: False) +#cython_enable: False + +##### State Management Settings ##### +########################################### +# The state management system executes all of the state templates on the minion +# to enable more granular control of system state management. The type of +# template and serialization used for state management needs to be configured +# on the minion, the default renderer is yaml_jinja. This is a yaml file +# rendered from a jinja template, the available options are: +# yaml_jinja +# yaml_mako +# json_jinja +# json_mako +# +#renderer: yaml_jinja +# +# state_verbose allows for the data returned from the minion to be more +# verbose. Normaly only states that fail or states that have changes are +# returned, but setting state_verbose to True will return all states that +# were checked +#state_verbose: False +# +# autoload_dynamic_modules Turns on automatic loading of modules found in the +# environments on the master. This is turned on by default, to turn of +# autoloading modules when states run set this value to False +#autoload_dynamic_modules: True +# +# clean_dynamic_modules keeps the dynamic modules on the minion in sync with +# the dynamic modules on the master, this means that if a dynamic module is +# not on the master it will be deleted from the minion. By default this is +# enabled and can be disabled by changing this value to False +#clean_dynamic_modules: True +# +# Normally the minion is not isolated to any single environment on the master +# when running states, but the environment can be isolated on the minion side +# by statically setting it. Remember that the recommended way to manage +# environments is to issolate via the top file. +#environment: None +# +# If using the local file directory, then the state top file name needs to be +# defined, by default this is top.sls. +#state_top: top.sls + +##### File Directory Settings ##### +########################################## +# The Salt Minion can redirect all file server operations to a local directory, +# this allows for the same state tree that is on the master to be used if +# coppied completely onto the minion. This is a literal copy of the settings on +# the master but used to reference a local directory on the minion. + +# Set the file client, the client defaults to looking on the master server for +# files, but can be directed to look at the local file directory setting +# defined below by setting it to local. +file_client: local + +# The file directory works on environments passed to the minion, each environment +# can have multiple root directories, the subdirectories in the multiple file +# roots cannot match, otherwise the downloaded files will not be able to be +# reliably ensured. A base environment is required to house the top file. +# Example: +# file_roots: +# base: +# - /srv/salt/ +# dev: +# - /srv/salt/dev/services +# - /srv/salt/dev/states +# prod: +# - /srv/salt/prod/services +# - /srv/salt/prod/states +# +# Default: +#file_roots: +# base: +# - /srv/salt + +# The hash_type is the hash to use when discovering the hash of a file in +# the minion directory, the default is md5, but sha1, sha224, sha256, sha384 +# and sha512 are also supported. +#hash_type: md5 + +# The Salt pillar is searched for locally if file_client is set to local. If +# this is the case, and pillar data is defined, then the pillar_roots need to +# also be configured on the minion: +#pillar_roots: +# base: +# - /srv/pillar + +###### Security settings ##### +########################################### +# Enable "open mode", this mode still maintains encryption, but turns off +# authentication, this is only intended for highly secure environments or for +# the situation where your keys end up in a bad state. If you run in open mode +# you do so at your own risk! +#open_mode: False + + +###### Thread settings ##### +########################################### +# Disable multiprocessing support, by default when a minion receives a +# publication a new process is spawned and the command is executed therein. +#multiprocessing: True + +###### Logging settings ##### +########################################### +# The location of the minion log file +#log_file: /var/log/salt/minion +# +# The level of messages to send to the log file. +# One of 'info', 'quiet', 'critical', 'error', 'debug', 'warning'. +# Default: 'warning' +#log_level: warning +# +# Logger levels can be used to tweak specific loggers logging levels. +# For example, if you want to have the salt library at the 'warning' level, +# but you still wish to have 'salt.modules' at the 'debug' level: +# log_granular_levels: { +# 'salt': 'warning', +# 'salt.modules': 'debug' +# } +# +#log_granular_levels: {} + +###### Module configuration ##### +########################################### +# Salt allows for modules to be passed arbitrary configuration data, any data +# passed here in valid yaml format will be passed on to the salt minion modules +# for use. It is STRONGLY recommended that a naming convention be used in which +# the module name is followed by a . and then the value. Also, all top level +# data must be applied via the yaml dict construct, some examples: +# +# A simple value for the test module: +#test.foo: foo +# +# A list for the test module: +#test.bar: [baz,quo] +# +# A dict for the test module: +#test.baz: {spam: sausage, cheese: bread} diff --git a/salt/roots/apache.sls b/salt/roots/apache.sls new file mode 100644 index 0000000..763e1bd --- /dev/null +++ b/salt/roots/apache.sls @@ -0,0 +1,3 @@ +install apache: + pkg.installed: + - name : apache2 diff --git a/salt/roots/btb.sls b/salt/roots/btb.sls new file mode 100644 index 0000000..01a0b3d --- /dev/null +++ b/salt/roots/btb.sls @@ -0,0 +1,35 @@ + +get source: + git.latest: + - name : https://github.com/yourcelf/btb + - target: /opt/btb + +python-pip: + pkg.installed + +install pyPDF from external: + pip.installed: + - name: http://pybrary.net/pyPdf/pyPdf-1.13.tar.gz + - require: + - pkg: python-pip + +install requirements: + pip.installed: + - requirements: /opt/btb/scanblog/requirements.txt + - require: + - pkg: python-pip + +/opt/btb/scanblog/site_static/CACHE: + file.directory: + - makedirs: True + - user: vagrant + +img symbolic link: + file.symlink: + - target : /opt/btb/scanblog/static/img + - name : /opt/btb/scanblog/site_static/CACHE/img + +fonts symbolic link: + file.symlink: + - target : /opt/btb/scanblog/static/fonts + - name : /opt/btb/scanblog/site_static/CACHE/fonts diff --git a/salt/roots/create_admin.py b/salt/roots/create_admin.py new file mode 100644 index 0000000..6a6f80d --- /dev/null +++ b/salt/roots/create_admin.py @@ -0,0 +1,5 @@ +from sh import * +u = User.objects.create(username='admin', is_superuser=True, is_staff=True) +u.set_password('admin') +u.save() +exit() diff --git a/salt/roots/dependencies.sls b/salt/roots/dependencies.sls new file mode 100644 index 0000000..61f2561 --- /dev/null +++ b/salt/roots/dependencies.sls @@ -0,0 +1,35 @@ +install dependencies: + pkg.installed: + - refresh: True + - pkgs: + - git + - mercurial + - poppler-utils + - pdftk + - imagemagick + - rubber + - rabbitmq-server + - python-dev + - postgresql-server-dev-all + - nodejs + - npm + - texlive-fonts-extra + - texlive-fonts-recommended + - texlive-font-utils + - texlive-generic-recommended + - texlive-latex-extra + - texlive-latex-recommended + {% if grains['oscodename'] == 'trusty' %} + - fonts-sil-gentium + - ruby + - nodejs-legacy + {% else %} + - ttf-sil-gentium + - rubygems + {% endif %} + +install from source: + cmd.script: + - name: /tmp/install_deps_from_src.sh + - source: salt://install_deps_from_src.sh + diff --git a/salt/roots/deploy.sls b/salt/roots/deploy.sls new file mode 100644 index 0000000..4add637 --- /dev/null +++ b/salt/roots/deploy.sls @@ -0,0 +1,5 @@ +/opt/btb/scanblog/settings.py: + file.managed: + - source: salt://settings.py + + diff --git a/salt/roots/init_db.sls b/salt/roots/init_db.sls new file mode 100644 index 0000000..f994bd8 --- /dev/null +++ b/salt/roots/init_db.sls @@ -0,0 +1,27 @@ + +python /opt/btb/scanblog/manage.py syncdb --noinput: + cmd.run: + - user: vagrant + - unless: ls /opt/btb//scanblog/deploy/dev.db + +python /opt/btb/scanblog/manage.py migrate && touch /opt/btb/scanblog/deploy/migrate_done: + cmd.run: + - user: vagrant + - unless: ls /opt/btb/scanblog/deploy/migrate_done + +python /opt/btb/scanblog/manage.py loaddata btb/fixtures/initial_data.json && touch /opt/btb/scanblog/deploy/loaddata_done: + cmd.run: + - user: vagrant + - unless: ls /opt/btb/scanblog/deploy/loaddata_done + +/tmp/create_admin.py: + file.managed: + - user: vagrant + - source: salt://create_admin.py + +python /opt/btb/scanblog/manage.py shell << /tmp/create_admin.py && touch /opt/btb/scanblog/deploy/admin_done: + cmd.run: + - user: vagrant + - require: + - file : /tmp/create_admin.py + - unless: ls /opt/btb/scanblog/deploy/admin_done diff --git a/salt/roots/install_deps_from_src.sh b/salt/roots/install_deps_from_src.sh new file mode 100644 index 0000000..488a1ed --- /dev/null +++ b/salt/roots/install_deps_from_src.sh @@ -0,0 +1,4 @@ +curl -L https://wkhtmltopdf.googlecode.com/files/wkhtmltopdf-0.11.0_rc1-static-{{ grains['arch'] }}.tar.bz2 | tar xjv > wkhtmltopdf +sudo mv wkhtmltopdf /usr/local/bin +sudo gem install compass +sudo npm install -g coffee-script diff --git a/salt/roots/ntp.sls b/salt/roots/ntp.sls new file mode 100644 index 0000000..a0fcf77 --- /dev/null +++ b/salt/roots/ntp.sls @@ -0,0 +1,2 @@ +ntp: + pkg.installed diff --git a/salt/roots/settings.py b/salt/roots/settings.py new file mode 100644 index 0000000..1e83b6f --- /dev/null +++ b/salt/roots/settings.py @@ -0,0 +1,137 @@ +from default_settings import * + +DEBUG = TEMPLATE_DEBUG = True +THUMBNAIL_DEBUG = DEBUG + +EMAIL_BACKEND = 'django.core.mail.backends.dummy.EmailBackend' +DISABLE_NOTIFICATIONS = False +DISABLE_ADMIN_NOTIFICATIONS = False + +# Make this unique, and don't share it with anybody. +SECRET_KEY = 'W^X~>p2j+u9XmNfNyt<9;ffaIVo{2vsfI-?_o8z893V8t$<[7\\' + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'. + 'NAME': os.path.join(SETTINGS_ROOT, 'deploy', 'dev.db'), # Or path to database file if using sqlite3. + 'USER': '', # Not used with sqlite3. + 'PASSWORD': '', # Not used with sqlite3. + 'HOST': '', # Set to empty string for localhost. Not used with sqlite3. + 'PORT': '', # Set to empty string for default. Not used with sqlite3. + } +} + +ADMINS = ( + ("You", "you@example.com"), +) +MANAGERS = ADMINS + +# Email for messages sent from the server, sent to admin/managers. +SERVER_EMAIL = "you@example.com" +# From email for notifications and user-facing stuff. +DEFAULT_FROM_EMAIL = SERVER_EMAIL + +# http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=Gentium_download +# Be sure to change this to the exact location +TEXT_IMAGE_FONT = "/usr/share/fonts/truetype/gentium/GenR102.ttf" + +# You'll want to change these as needed... +NICE_CMD = "/usr/bin/nice" +PDFTK_CMD = '/usr/bin/pdftk' +RUBBER_PIPE_CMD = '/usr/bin/rubber-pipe' +PDFINFO_CMD = '/usr/bin/pdfinfo' +CONVERT_CMD = '/usr/bin/convert' +WKHTMLTOPDF_CMD = os.path.join(SETTINGS_ROOT, 'bin', 'wkhtmltopdf-i386') +# Selenium for running tests. Depending on the current state of firefox +# binaries/selenium libraries, it may be necessary to pin to older versions +# that work properly together. +# An oldy-but-goody is Firefox 10.0 with Selenium 2.20.0. +#SELENIUM_FIREFOX_BIN = os.path.join(SETTINGS_ROOT, "bin", "firefox", "firefox") + +# Whether or not to allow new user sign ups +REGISTRATION_OPEN = True +# Whether or not to allow new comments +COMMENTS_OPEN = True +# Whether or not to allow transcriptions +TRANSCRIPTION_OPEN = True + +# Whether or not to allow new user sign ups +REGISTRATION_OPEN = True +# Whether or not to allow new comments +COMMENTS_OPEN = True +# Whether or not to allow transcriptions +TRANSCRIPTION_OPEN = True + +LOGGING = { + 'version': 1, + 'disable_existing_loggers': False, + 'formatters': { + 'verbose': { + 'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s' + }, + 'simple': { + 'format': '%(levelname)s %(message)s' + }, + }, + 'handlers': { + 'null': { + 'level':'DEBUG', + 'class':'django.utils.log.NullHandler', + }, + 'console':{ + 'level': 'DEBUG', + 'class': 'logging.StreamHandler', + 'formatter': 'simple' + }, + 'log_file':{ + 'level': 'DEBUG', + 'class': 'logging.handlers.RotatingFileHandler', + 'filename': os.path.join(SETTINGS_ROOT, 'deploy', 'django.log'), + 'maxBytes': '16777216', # 16megabytes + 'formatter': 'verbose' + }, + 'mail_admins': { + 'level': 'ERROR', + 'class': 'django.utils.log.AdminEmailHandler', + 'include_html': True, + 'filters': ['require_debug_false', 'skip_unreadable_posts'], + } + }, + 'loggers': { + 'django.request': { + 'handlers': ['mail_admins', 'log_file', 'console'], + 'level': 'ERROR', + 'propagate': True, + }, + }, + 'filters': { + 'require_debug_false': { + '()': 'django.utils.log.RequireDebugFalse' + }, + 'skip_unreadable_posts': { + '()': 'django.utils.log.CallbackFilter', + 'callback': 'btb.log_filter.skip_unreadable_post' + } + } +} + +# Uncomment the following to enable django debug toolbar. You'll need to +# install it first with e.g. `pip install django-debug-toolbar` +# if DEBUG: +# MIDDLEWARE_CLASSES += ('debug_toolbar.middleware.DebugToolbarMiddleware',) +# INSTALLED_APPS += ('debug_toolbar',) +# DEBUG_TOOLBAR_CONFIG = { +# 'INTERCEPT_REDIRECTS': False, +# } +# DEBUG_TOOLBAR_PANELS = ( +# 'debug_toolbar.panels.version.VersionDebugPanel', +# 'debug_toolbar.panels.timer.TimerDebugPanel', +# 'debug_toolbar.panels.settings_vars.SettingsVarsDebugPanel', +# 'debug_toolbar.panels.headers.HeaderDebugPanel', +# 'debug_toolbar.panels.request_vars.RequestVarsDebugPanel', +# 'debug_toolbar.panels.sql.SQLDebugPanel', +# 'debug_toolbar.panels.template.TemplateDebugPanel', +# 'debug_toolbar.panels.signals.SignalDebugPanel', +# 'debug_toolbar.panels.logger.LoggingPanel', +# 'debug_toolbar.panels.cache.CacheDebugPanel', +# ) diff --git a/salt/roots/start_server.sls b/salt/roots/start_server.sls new file mode 100644 index 0000000..74aea4f --- /dev/null +++ b/salt/roots/start_server.sls @@ -0,0 +1,8 @@ +python /opt/btb/scanblog/manage.py celeryd_detach: + cmd.run: + - user: vagrant + +nohup python /opt/btb/scanblog/manage.py runserver 0.0.0.0:8000 &: + cmd.run: + - user: vagrant + diff --git a/salt/roots/top.sls b/salt/roots/top.sls new file mode 100644 index 0000000..30ce3c4 --- /dev/null +++ b/salt/roots/top.sls @@ -0,0 +1,8 @@ +base: + '*': + - apache + - ntp + - dependencies + - btb + - deploy + - init_db From 241a1d1130a4286bf93e505c3ab440a522daa558 Mon Sep 17 00:00:00 2001 From: Arthur Lutz Date: Fri, 9 May 2014 14:22:37 +0200 Subject: [PATCH 2/2] [vagrant+salt] add box url --- Vagrantfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Vagrantfile b/Vagrantfile index 5ae9307..91761fd 100644 --- a/Vagrantfile +++ b/Vagrantfile @@ -12,7 +12,8 @@ Vagrant.configure("2") do |config| # The url from where the 'config.vm.box' box will be fetched if it # doesn't already exist on the user's system. # config.vm.box_url = "http://domain.com/path/to/above.box" - + config.vm.box_url = "http://cloud-images.ubuntu.com/vagrant/trusty/current/trusty-server-cloudimg-amd64-vagrant-disk1.box" + # Create a forwarded port mapping which allows access to a specific port # within the machine from a port on the host machine. In the example below, # accessing "localhost:8080" will access port 80 on the guest machine.