{"id":69053,"date":"2016-11-17T18:31:38","date_gmt":"2016-11-17T18:31:38","guid":{"rendered":"https:\/\/www.simple-talk.com\/?p=69053"},"modified":"2021-04-27T13:35:17","modified_gmt":"2021-04-27T13:35:17","slug":"automating-setup-local-developer-machine","status":"publish","type":"post","link":"https:\/\/www.red-gate.com\/simple-talk\/sysadmin\/general\/automating-setup-local-developer-machine\/","title":{"rendered":"Setting up developer workstations"},"content":{"rendered":"<h2>Introduction<\/h2>\n<p>When a developer joins our team, we are faced with the problem that it can take up to two weeks\u00a0setting up developer workstations and bringing them up to speed, to the point at which they can make a contribution. In my role as Development Manager, I\u2019m very interested in reducing this time. An obvious way of doing this is to reduce the time spent provisioning the development workstation with the right tools. A newly-arrived Developer has to Install JDK, Oracle DB, WebLogic, Eclipse IDE, SVN, WinMerge, Notepad++ and Oracle Client. Often there are various admin rights required, and it takes time to give them temporary elevation of system privileges to allow them to do the installs. To get everything up-and-running, developers then have to tackle those data and configuration setup procedures on their local machines that would allow them to do development work. Usually this amounts to over a hundred configuration steps that are required before your entire stack &#8211; database, app server, code, dependencies &#8211; work in harmony.<\/p>\n<p>There is often an engrained idea that each configuration is somehow unique and tailored to the individual. This is a fallacy which seems to follow from the very nature of this error-prone manual process to set up the machine. In reality, there are very few deviations from a standard development workstation. Certainly, a specialist may require certain additions but they still need the standard setup to start with.<\/p>\n<p>So how can we cut down the time needed for the local machine setup from weeks down to minutes? You guessed it: We use a provisioning tool to do it for us.<\/p>\n<h2><strong>Finding suitable tools<\/strong><\/h2>\n<p>There are various tools in the market for provisioning PCs and VMs. When I set out to tackle the problem, I was quite perplexed as to how do we could devise a toolchain that tied these together into a meaningful architecture that would solve most of our common use cases. We ended up selecting three tools.<\/p>\n<ul>\n<li><strong>Vagrant<\/strong> \u2013 Provides a setup environment for a workstation that is easy to configure, reproducible, and portable.<\/li>\n<li><strong>Chocolatey<\/strong> &#8211; is a single, unified interface designed to easily work with all aspects of managing Windows software using a packaging framework that understands both versioning and dependency requirements.<\/li>\n<li><strong>Boxstarter<\/strong> &#8211; Leverages\u00a0<a href=\"https:\/\/chocolatey.org\/\">Chocolatey<\/a>\u00a0packages to automate the installation of software and create repeatable, scripted Windows environments while providing reboot resiliency, windows customization, remote installations and automated windows updates.<\/li>\n<\/ul>\n<p>These tools have proved really powerful weapons in our fight to solve some of the challenges we met along the way to creating a package management architecture that allowed us to do standard replicable installations. Being a Linux fan myself, I will start by describing a Linux installation with Vagrant; followed by a Windows installation utilizing Vagrant, BoxStarter and Chocolatey.<\/p>\n<p>Vagrant provides a setup for a workstation that is easy to configure, reproducible, and portable. It is built on top of industry-standard technology and controlled by a single consistent workflow to help maximize the productivity and flexibility of you and your team. It stands on the shoulders of giants. Machines are provisioned on top of Virtual Box, VMware, AWS, or <a href=\"https:\/\/www.vagrantup.com\/docs\/providers\/\">any other provider<\/a>. Then, industry-standard <a href=\"https:\/\/www.vagrantup.com\/docs\/provisioning\/\">provisioning tools<\/a> such as shell scripts, Chef, or Puppet, can be used to automatically install and configure software on the machine.<\/p>\n<p>Vagrant will isolate dependencies and their configuration within a single disposable, consistent environment. Once the developer creates a single <strong>Vagrantfile<\/strong>, which defines the dependencies, the working environment can be reproduced by doing a \u2018<strong>vagrant up<\/strong>\u2019 which will install and configure the application\u2019s working environment whether it be on Linux, Mac OS X, or Windows, against the same dependencies, all configured the same way.<\/p>\n<p>The overall process can be summarized into<\/p>\n<ul>\n<li><strong>Set Up<\/strong> &#8211; Download and install Vagrant<\/li>\n<li><strong>Configure<\/strong> &#8211; Create a configuration file which includes all steps with respect to your required software\u2019s, configuration rules etc. This file can be placed in your repository such as GIT\/Stash<\/li>\n<li><strong>Work<\/strong> &#8211; Execute the single command \u2014 &#8220;<strong>vagrant up<\/strong>&#8221; and sit back while vagrant gets your machine ready to go.<\/li>\n<li>Taking Vagrant for a Spin<\/li>\n<\/ul>\n<p>Just to demonstrate how easy it is, we will start by creating a virtual Machine on our local Linux workstation. The steps below depict how you can utilize VAGRANT to spin up and tear down a standard Ubuntu virtual machine in just a couple of minutes.<\/p>\n<p><strong>Step 1:<\/strong> Download and Install vagrant. Link at <a href=\"https:\/\/www.vagrantup.com\/downloads.html\">https:\/\/www.vagrantup.com\/downloads.html<\/a><\/p>\n<p><strong>Step 2:<\/strong> We now create a virtual machine by using these two simple commands<\/p>\n<pre class=\"theme:terminal lang:vim decode:true\">$ vagrant init hashicorp\/precise64<\/pre>\n<pre class=\"theme:terminal lang:vim decode:true\">$ vagrant up<\/pre>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-69094\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2016\/11\/Vagrant1.png\" alt=\"Initiating Vagrant Setting up developer workstations\" width=\"700\" height=\"215\" \/>\u00a0\u00a0\u00a0<\/p>\n<p><strong>Figure 1:<\/strong>\u00a0 Initiating Vagrant<\/p>\n<p>Vagrant at this point will create a virtual machine (VM) with standard Ubuntu 12.04 LTS 64-bit OS. Although I have used Ubuntu, there are various alternative images available on the Atlas Box Catalog, such as the evaluation version of Windows 2012 r2, Windows Nano Technical Preview 3, Debian or Centos.<\/p>\n<p>It takes about 2 minutes to get your base VM up and you can <strong>ssh<\/strong> into your VM via<\/p>\n<pre class=\"theme:terminal lang:vim decode:true\">$ vagrant ssh<\/pre>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-69093\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2016\/11\/Vagrant2.png\" alt=\"SSH into Vagrant Setting up developer workstations\" width=\"702\" height=\"282\" \/><\/p>\n<p><strong>Figure 2:<\/strong>\u00a0 How to ssh into Vagrant VM<\/p>\n<p><strong>Note:<\/strong> Vagrant looks for an <a href=\"https:\/\/www.virtualbox.org\/\">Oracle VM VirtualBox<\/a> installation on the host machine. If it doesn\u2019t find one, it would automatically download and install that before proceeding.<\/p>\n<p><strong>Step 3<\/strong>: You can destroy the VM By typing<\/p>\n<pre class=\"theme:terminal lang:vim decode:true\">$ vagrant destroy<\/pre>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone  wp-image-69092\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2016\/11\/Vagrant3.png\" alt=\"Vagrant3\" width=\"698\" height=\"94\" \/><\/p>\n<p><strong>Figure 3:<\/strong>\u00a0 Destroying the VM<\/p>\n<p>How easy was that? Now that we know how to get a basic VM up and running, we\u2019ll make Vagrant automate our project setup.<\/p>\n<h1>The installation<\/h1>\n<p>I will show how to provision both a Linux Workstation and a Windows-based Workstation using combination of tools mentioned above. All the files I use are in a GitHub repository <a href=\"https:\/\/github.com\/vishwas-parameshwarappa\/vagrant_demo\">https:\/\/github.com\/vishwas-parameshwarappa\/vagrant_demo<\/a> so you can use them to play along.<\/p>\n<h2>Linux Installation<\/h2>\n<p>In this tutorial, our aim is to automate the setup of a local machine for a 64 bit Linux OS with Tomcat Webserver with a sample Angular JS application deployed.<\/p>\n<p><strong>Step1: <\/strong> Ensure that your GitHub repository has the latest application code. I have created a sample Angular JS application for the purpose of this tutorial.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2016\/11\/word-image-41.png\" \/><\/p>\n<p><strong>Figure 4:<\/strong>\u00a0 Sample GIT Repository<\/p>\n<p><strong>Step 2:<\/strong> Navigate to your project folder and initiate Vagrant. This would create a configuration file <strong>Vagrantfile<\/strong> in your project folder as shown in the figure below.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone  wp-image-69091\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2016\/11\/Vagrant5.png\" alt=\"Vagrant5\" width=\"699\" height=\"298\" \/><\/p>\n<p><strong>Figure 5:<\/strong>\u00a0 Creating Vagrant File in the project folder<\/p>\n<p><strong>Vagrantfile<\/strong> is basically a configuration guideline to Vagrant engine which must contain all the details that are relevant to your machine configuration i.e. The OS, the Network settings, the software\u2019s and the app build path etc. &#8211; pretty much the complete set of steps to prepare the machine.<\/p>\n<p>We now have to modify this <strong>Vagrantfile<\/strong> configuration file to &#8230;<\/p>\n<ol>\n<li>Define your Virtual Machine Operation System\n<pre class=\"theme:terminal lang:vim decode:true\">config.vm.box = \"hashicorp\/precise64\"<\/pre>\n<\/li>\n<li>Define a post-provisioning script to setup your VM. Typically this can be your shell script or any other provisioning tools such as Puppet, Chef, Ansible, Salt, Docker etc.<strong><br \/>\n<\/strong><\/p>\n<pre class=\"theme:terminal lang:vim decode:true\">config.vm.provision :shell, path: \"linuxProvisioning.sh\"<\/pre>\n<p>In my file <strong>linuxProvisioning.sh<\/strong>, I include all the details relevant to what I want to be provisioned by Vagrant once my local machine virtual machine is created.<\/p>\n<h4>\u00a0<strong>LINUXPROVISINING.SH<\/strong><\/h4>\n<pre class=\"theme:terminal lang:vim decode:true \">#!\/usr\/bin\/env bash\r\necho \"*****************STARTING VM PREP****************\"\r\napt-get update\r\necho \"*****************Installing JDK****************\"\r\nsudo apt-get install -y openjdk-7-jdk\r\necho \"*****************Installing Tomcat****************\"\r\nsudo apt-get install -y tomcat7\r\necho \"*****************Preparing War****************\"\r\ncd \/vagrant\r\njar cvf tutorial.war *\r\necho \"*****************Deploying War*****************\"\r\nsudo cp tutorial.war \/var\/lib\/tomcat7\/webapps\/\r\necho \"*****************VM PREP COMPLETE**************\r\n<\/pre>\n<\/li>\n<li>Ensure that you have port-forwarded the VM to access it from our MAC. Here port 4567 on my host forwards the traffic to port 8080 on my VM \n<pre class=\"theme:terminal lang:vim decode:true \">config.vm.network :forwarded_port, guest: 8080, host: 4567<\/pre>\n<\/li>\n<\/ol>\n<p><strong>Step 3<\/strong>: Go to your project folder and type-in<\/p>\n<pre class=\"theme:terminal lang:vim decode:true \">$vagrant up<\/pre>\n<p>Vagrant at this point will perform the following actions based on configuration details in <strong>Vagrantfile<\/strong><\/p>\n<ol>\n<li>Creates a 64-Bit Ubuntu virtual machine<\/li>\n<li>Forwards the port 4567 on your host to port 8080 on the virtual machine<\/li>\n<li>Invokes the <strong>linuxProvisioning.sh<\/strong> script which\n<ol>\n<li>Downloads and install JDK &amp; Tomcat software\u2019s.<\/li>\n<li>Creates an application war file and deploys the war file on the Tomcat Webserver.<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<p>Sit back and relax while vagrant sets up your VM. You can see the application installed, deployed and accessible via your host machine browser at <code><strong>http:\/\/127.0.0.1:4567\/tutorial<\/strong><\/code>.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2016\/11\/word-image-44.png\" width=\"566\" height=\"485\" \/><\/p>\n<p><strong>Figure 6:<\/strong>\u00a0Deployed Application on Linux VM!!!<\/p>\n<p><strong>Step 6:<\/strong> Check-in <strong>Vagrant File<\/strong> and <strong>linuxProvisioning.sh<\/strong> into GIT along with your project.<\/p>\n<p>That is it. A new developer on board now has to just perform the following three actions to get going on Linux<\/p>\n<ol>\n<li>Checkout to your code from GitHub<\/li>\n<li>Ensure <strong>VagrantFile<\/strong> is set to Linux Mode<\/li>\n<li>Install vagrant and type vagrant up<\/li>\n<\/ol>\n<h2><strong>Windows Installation<\/strong><\/h2>\n<p>Now that we have accomplished an automated Linux installation, let\u2019s look at how do we utilize Vagrant to spin up a local machine for 64 bit Windows OS. In the same way that we had to provide additional shell scripting for Linux, we will need the help of Chocolatey and Boxstarter in order to provision the relevant software and deploy our application in a Windows workstation.<\/p>\n<p><strong>Step 1: <\/strong>We\u2019ll need to change our <strong>Vagrantfile<\/strong> to support Windows configurations and point to this image. We do this in the following lines within the <strong>Vagrantfile<\/strong>.<\/p>\n<pre class=\"theme:terminal lang:vim decode:true\">\tconfig.vm.box = 'opentable\/win-2012r2-standard-amd64-nocm'\r\n\tconfig.vm.guest = :windows\r\n\tconfig.vm.boot_timeout = 300\r\n\tconfig.vm.communicator = \"winrm\"\r\n\tconfig.winrm.username = 'vagrant'\r\n\tconfig.winrm.password = 'vagrant'\r\n\r\n        config.vm.provider :virtualbox do |vb|\r\n                vb.name = \"Win2012_Server\"\r\n\t\tvb.gui = true\r\n\t\tvb.customize [\"modifyvm\", :id, \"--memory\", \"1024\"]\r\n\t\tvb.customize [\"modifyvm\", :id, \"--vram\", \"64\"]\r\n\t\tvb.customize [\"modifyvm\", :id, \"--clipboard\", \"bidirectional\"]\r\n\tend\r\n\r\n\tconfig.vm.network :forwarded_port, guest: 8080, host: 4567\r\n<\/pre>\n<p>This part of the configuration ensures that we are creating a 2012 64 Bit windows image and allocating 1 GIG RAM, 64 MB Video RAM, support bidirectional copy paste functionality and forwarding port 4567 on host to Port 8080 on the VM.<\/p>\n<p>If you type <code>vagrant up<\/code> with just these lines in the <strong>Vagrantfile<\/strong> so far, you should be able to see a bare windows VM created. However, we will be adding more to the file in order to specify what software then needs to be loaded.<\/p>\n<p><strong>Step 2<\/strong>: Now that we are able to setup the base configuration of our windows VM the next job is to provision it by installing the software and setting it up as a development machine. We will be using <strong>Boxstarter<\/strong>. When we bulk-install using Boxstarter, it will detect any reboots that are triggered by MSI installers, reboot the machine and then run the Boxstarter script again. It will also allow us to do other configuration tasks such as<\/p>\n<ul>\n<li>Setting up remote desktop.<\/li>\n<li>Setting up Microsoft update.<\/li>\n<li>Providing user access control (UAC).<\/li>\n<li>Setting taskbar options like size, position, and lock the size.<\/li>\n<li>Setting Windows explorer options such as showing hidden files, protected OS files, and file extensions.<\/li>\n<\/ul>\n<p>The provisioning activity on the windows machine is a two-step process<\/p>\n<ol>\n<li>Install Chocolatey which provides a baseline to install BoxStarter<\/li>\n<li>Install Boxstarter and then us this to install the rest of the software (such as the JDK and Tomcat)<\/li>\n<\/ol>\n<p>Because the installation of Chocolatey means having to reopen the shell, I had to break my provisioning script into two scripts and utilize Vagrant to invoke these scripts one after the other.<\/p>\n<h4><strong>windowsProvisioning_Part1.cmd<\/strong><\/h4>\n<pre class=\"theme:terminal lang:vim decode:true \">echo *****************Installing Chocolatey****************\r\n@powershell -NoProfile -ExecutionPolicy Bypass -Command \"iex ((New-Object System.Net.WebClient).DownloadString('https:\/\/chocolatey.org\/install.ps1'))\" &amp;&amp; SET \"PATH=%PATH%;%ALLUSERSPROFILE%\\chocolatey\\bin\"\r\necho \"*****************WINDOWS VM PREP_1 COMPLETE****************\"\r\n<\/pre>\n<h4><strong>windowsProvisioning_Part2.cmd<\/strong><\/h4>\n<pre class=\"lang:tsql decode:true\">echo *****************STARTING WINDOWS VM PREP_2****************\r\necho *****************Installing BoxStarter****************\r\nchoco install -y boxstarter\r\necho *****************Installing Softwares****************\r\ncopy \/Y \"%systemdrive%\\vagrant\\software_list.txt\" \"%temp%\\software_list.txt\" \r\n@powershell -NoProfile -ExecutionPolicy Bypass -Command \"Import-Module $env:appdata\\boxstarter\\boxstarter.chocolatey\\boxstarter.chocolatey.psd1;Install-BoxStarterPackage -PackageName $env:temp\\software_list.txt\"\r\necho *****************Preparing War****************\r\ncd %systemdrive%\\vagrant\r\n\"C:\\Program Files\\Java\\jdk1.8.0_112\\bin\\jar.exe\" cvf tutorial.war *\r\necho *****************Deploying War*****************\r\nMOVE tutorial.war \"C:\\Program Files\\Apache Software Foundation\\tomcat\\apache-tomcat-8.0.33\\webapps\"\r\necho \"*****************WINDOWS VM PREP_2 COMPLETE****************\"\r\n<\/pre>\n<p><strong>Step 3: <\/strong>Link our windows provisioning scripts to <strong>Vagrantfile<\/strong> Configuration as an instruction for provisioning activity. Also I had to make sure to modify the <strong>Max No of Shells<\/strong> and <strong>Concurrent Operations per user<\/strong> options because I ran into a threshold problem during the development.<\/p>\n<pre class=\"theme:terminal lang:vim decode:true\">config.vm.provision \"shell\", inline: &lt;&lt;-SCRIPT \r\n\tSet-Item WSMan:\\\\localhost\\\\Shell\\\\MaxShellsPerUser -Value 100 \r\n\tSet-Item WSMan:\\\\localhost\\\\Service\\\\MaxConcurrentOperationsPerUser -Value 100 \r\nSCRIPT\r\n<\/pre>\n<p><strong>Step 4:<\/strong> Go to your project folder and type-in<\/p>\n<pre class=\"theme:terminal lang:vim decode:true \">vagrant up<\/pre>\n<p>Vagrant at this point will perform the following actions based on configuration details in <strong>Vagrantfile<\/strong><\/p>\n<ol>\n<li>Creates a 64-Bit Windows 2012 virtual machine<\/li>\n<li>Forwards the port 4567 on your host to port 8080 on the virtual machine and sets the VM shell parameters<\/li>\n<li>Invokes the WindowsProvisioning_Part1.cmd script which downloads and installs Chocolatey<\/li>\n<li>Invokes the WindowsProvisioning_Part2.cmd script which\n<ol>\n<li>installs Boxstarter<\/li>\n<li>Further utilizes Boxstarter to install JDK and Tomcat software\u2019s mentioned in software_list.txt<\/li>\n<li>Creates an application war file and deploys the war file on the Tomcat Webserver.<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<p>Sit back and relax while vagrant sets up your local virtual machine. You can see the application installed, deployed and accessible via your local machine browser at <strong>http:\/\/127.0.0.1:4567\/tutorial<\/strong>.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2016\/11\/word-image-45.png\" width=\"703\" height=\"387\" \/><\/p>\n<p><strong>Figure 7:<\/strong>\u00a0 Vagrant installation on Chocolatey<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2016\/11\/word-image-46.png\" width=\"701\" height=\"382\" \/><\/p>\n<p><strong>Figure 8:<\/strong>\u00a0 Installation of Boxstarter utilizing Chocolatey<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2016\/11\/word-image-47.png\" width=\"701\" height=\"518\" \/><\/p>\n<p><strong>Figure 9:<\/strong>\u00a0 Installation of JDK and Tomcat utilizing Boxstarter<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"\" src=\"https:\/\/www.red-gate.com\/simple-talk\/wp-content\/uploads\/2016\/11\/word-image-48.png\" width=\"632\" height=\"432\" \/><\/p>\n<p><strong>Figure 10:<\/strong>\u00a0 Deployed Application on Windows VM<\/p>\n<p><strong>Step 5:<\/strong> Check-in <strong>Vagrantfile<\/strong>, <strong>windowsProvisioning_Part1.cmd, windowsProvisioning_Part2.cmd<\/strong> , <strong>software_list.txt<\/strong> into GIT along with your project.<\/p>\n<p>A new developer who joins the team just has to perform the following three actions to get going on Windows<\/p>\n<ol>\n<li>Checkout your code from GitHub<\/li>\n<li>Ensure <strong>Vagrantfile<\/strong> is set to Windows Mode<\/li>\n<li>Install vagrant and type vagrant up<\/li>\n<\/ol>\n<h2><strong>Setting up developer workstations<\/strong><\/h2>\n<p>Vagrant, Boxstarter &amp; Chocolatey are powerful DevOps tools that are capable of automating the setup of your entire development machine in couple of clicks. This will eliminate developer frustrations; speed up the development lifecycle and save time and money for your organizations. In Linux, Vagrant alone can be sufficient if you then use the inbuilt Linux package manager. We would need to couple this with Chocolatey and Boxstarter for Windows. The number of required software packages is increasing in line with the increasing adoption of open stack software for development work, because most of the DevOps tools perform specific activities, such as logging, testing, deployment, build or providing code-quality metrics. Software package management is increasingly important to ensure that developers don\u2019t spend too much time trying to figure out where to download from, which version to use and how to install. Instead, we can allow them to focus on delivery right from the start. Apart from alleviating the local machine setup, these packaged installations can be maintained centrally and versioned to suit to your organizations test and production configurations and horizontally scale your cloud instances.<\/p>\n<h2><strong>Attachments<\/strong><\/h2>\n<ol class=\"list--bare\">\n<li><a href=\"https:\/\/github.com\/vishwas-parameshwarappa\/vagrant_demo\">https:\/\/github.com\/vishwas-parameshwarappa\/vagrant_demo<\/a><\/li>\n<\/ol>\n<h2><strong>References<\/strong><\/h2>\n<ol class=\"list--bare\">\n<li><a href=\"https:\/\/www.vagrantup.com\/\">https:\/\/www.vagrantup.com\/<\/a><\/li>\n<li><a href=\"https:\/\/chocolatey.org\/\">https:\/\/chocolatey.org\/<\/a><\/li>\n<li><a href=\"http:\/\/boxstarter.org\">http:\/\/boxstarter.org<\/a><\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>On both Windows and Linux, the chore of setting up developer workstations can take several days, and there always seem to be a few configuration settings that get missed. You can reduce the time and tedium dramatically by automating the process by using Vagrant to set up the operating system, followed by your choice of provisioning, configuration management and orchestration applications such as Puppet, Chef, Ansible, Salt, Docker, Chocolatey and Boxstarter.  Vishwas  shows how to make it easy to do with Vagrant, Chocolatey and Boxstarter.&hellip;<\/p>\n","protected":false},"author":250217,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[143516,32],"tags":[5970],"coauthors":[35132],"class_list":["post-69053","post","type-post","status-publish","format-standard","hentry","category-database-devops","category-general","tag-devops"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/posts\/69053","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/users\/250217"}],"replies":[{"embeddable":true,"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/comments?post=69053"}],"version-history":[{"count":15,"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/posts\/69053\/revisions"}],"predecessor-version":[{"id":89481,"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/posts\/69053\/revisions\/89481"}],"wp:attachment":[{"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/media?parent=69053"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/categories?post=69053"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/tags?post=69053"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.red-gate.com\/simple-talk\/wp-json\/wp\/v2\/coauthors?post=69053"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}