 DIP and team productivity as well because whenever a developer environment needs to be set up the new guy is already setting up his own environment and he has to be helped by another older member of the team that is always the case like how to set up the developer environment then there is he or she will need help like understanding the mode ways. So like cutting down the entire DIP or the entire data before you can actually start contributing is almost impossible but it is always possible to reduce the data, reduce the time between a new member joining a team and starting to contribute to the project. So problem is different operating systems so if you work in a bring your own laptop kind of environment so different operating systems people with different operating systems or hardware will always have issues with whatever development environment setup you have. Okay so even same operating systems can have that problem but so it is like just for an example Google Chrome installation on site was 6.5 and the Google 12.04 is extremely different it's not even like you have installed Google Chrome you have to use a script which does that. Till 6.2 I think it would work properly if you have installed and after that you have to use a script just install a simple Google Chrome. So then there is inconsistency between procedures so if you are having different hardware different environments so to achieve the same thing you have different procedures for every different person. If somebody has to check out the data so rather than just running PC for minus your own order it might differ from operating system or if somebody god knows why but brings in a Windows laptop in between. So somebody has to form simple links so even between Ubuntu and CentOS the location where you form the simple links vary. So in the same exact thing you will be following different procedures so some might not know about themselves which is a lot of time pasted rather than actually got very good. Then there is inconsistent environment so you have already got a different operating system so now imagine your development environment and the difference between that and all the other environments you might have like you might have a CI staging or QA or even suppose you do not have that with your program. But there will always be a difference between your developer environment and the CI staging and the QA environment or any other environment which you use. So that means a lot of unexpected errors or behaviors so you might work on something that works on your machine and then you push it and it might fail. So now works on my machine phrase is like very hard to like evaporate of this planet but you can still work towards cutting it down a lot. So then there are dependency conflicts so if you are working on multiple code bases on the same machine so you might be working on a Ruby or Rails project requiring different version of Rails. You will have to use RBM and it's actually really complicated to do that like using two different versions Ruby and two different versions of Rails or if you are working on Python Django project which requires different versions. So suppose you added something as a gem file like you needed a dependency for one of your apps you added you installed the gem and you added that to your gem file. After that your second version also works which also using that dependency but you did not add it to your gem file and you just pushed it and it fails on CN at that time itself. Or even something simple like if you are using two data like you will be using suppose Postless for both apps and then you will be on different versions of Postless. So you will have to run the Postless server on two different ports and when you are running servers on two different ports then before pushing it to CI you will have to change the port to whatever or you can either use environment variables but it's still a lot of pain. So I am going to talk about virtualization and virtualbox. So there are three types of virtualization, full virtualization, partial virtualization and para virtualization. So for this we will just be talking about full virtualization. Para virtualization is like software like VMware and virtualbox for full virtualization. Para virtualization is used by like software like Xen. They use para virtualization and AWS uses Xen and para virtualization is not at all in the scope of this talk because para virtualization requires modifying the guest operating system. While full virtualization does not. You can just put any ISO you want and run the software just out of the person as you want it to. So we are covering virtualbox because it's very open to use and if anybody wants to try it they can do it. And also in the scope of Akron it works well with Akron so that also. So virtualbox try using the latest addition. So vagrant over virtualbox which makes managing virtual machines really easy. So vagrant won't offer you if you want to use GUI or virtualbox then it's not really helpful. But vagrant does offer a lot of other things like you are abstracted from a lot of things which you would have to go through if you had used virtualbox. So something as simple as synchronization of folders, getting internet connectivity in vagrant. Just the speed with which you can get up a machine or spin off a virtual machine using vagrant is very easy. And the interaction you have with vagrant managed virtual machines like you can spin up a terminal as such into the machine and just use it there itself. And vagrant also offers a lot of features like configuration management which I will be talking about. So vagrant also uses providers so vagrant is a wrapper over virtualbox you can also use VMware method. So software like full virtualization software like VMware and virtualbox are called providers. And this is not exactly right because it does not only work with full virtualization in the software but also Docker and LXC right now. But before there was no support for Docker and LXC. So vagrant uses the dotbox format to package this virtual machine. So every vagrant virtual machine is a package as dotbox. Now that dotbox has two parts. One is the actual dotbox, one has the actual disk and where the operating system is installed and all that. But that vagrant does nothing well. What vagrant is concerned with is the metadata JSON in the dotbox package. And after getting the metadata JSON it finds out what is the provider of this virtual machine. It might be VMware in my virtualbox and then it just passes on that disk to the full virtualization implementation software. So if you have any machine at any point of time just shoot 500. So whatever vagrant images also download like whatever dotbox files also download will also be in the dotbox format. That's the best format which works. So this is how easy it is to get up a vagrant machine. So I'll be giving you a demo. So here are the sentos 6.4 dotbox file which I downloaded which I'll eventually tell you from where I downloaded. So now if I want to spin off a VM with this, right? So if I want to spin off a VM with this usually if you are using virtualbox something you need the dot is for file or the VM is for file. But an installation procedure and all that other stuff. So here I just do it. So now it has added a box here in the main home dot vagrant directory. So there I created a box named demo. So I ran the command vagrant box add demo. Okay so vagrant box comes together. Now vagrant box has a list of other commands like remove, update, list etc. And then I give it a name demo and I just link it to the box. Okay now this box doesn't need to be downloaded as well. If you just have a dot, if you have it uploaded somewhere on a cloud or something you just specify that you are a little downloaded for you and add it. Once this is added, I need to create a vagrant file. So for that I do vagrant in vagrant feature list. So if I just need to run this VM now, just do a vagrant now. So this is how it comes out. So now this is where it will be mounting my current folder. So the folder from which I ran the vagrant app or where the vagrant file or whatever our project root is that will be mounted in slash vagrant directory. This is for the SSH. Now the machine is up, I can SSH it to it using my own terminal itself. So I don't even have to use the third party tool or something for that. And just do run vagrant SSH. I go to vagrant folder. So all my files in that folder are here. So now suppose if you have something like a Java project or say a Ruby project. So rather than using something like virtualbox, so there you will be using to edit the code. You might be using something inside the virtualbox GUI or you might have synchronized folder there as well with a lot of pain. But here I can just use the ID, my Java ID outside and compile the code, run the test, whatever I want to do inside the vagrant machine. So these are just three commands. You can even cut it down with the new rules of vagrant. Now I showed you the vagrant file. Now the vagrant file is used to manage the configurations of the entire VM. I mean it is powerful enough to even change the memory if you want in your virtualbox machine which the vagrant is managing. Or like forward supports from the virtualbox machine to here. Bridge adapters between your connection so that you get internet connectivity inside the virtual machine as well. And also you can plug it like even if you are using some provision like Chef or Buffet. So you can plug it in in the vagrant file itself. So I will be showing you some of the vagrant files. So this is my box name demo. But I can also have a box URL here. Like if I have uploaded that box somewhere or even file system respective URL, box URL here as well. So this is just a very basic example of a vagrant file. It does nothing. So I will show you some of the more advanced ones. So this is my previous projects of a vagrant file where I specified the URL which is in the same directory. Which was in the same directory as the vagrant file. And then I specified an IP. So if I run any web server inside vagrant. So they will be forwarded so that web server if I want to access it from outside the virtual machine. So I can just go to this IP and whatever the web server is serving I can access to it outside the vagrant virtual machine. Now I will cover all the data. Now this is my sync folders. So I am syncing whatever was in the folder before my into a folder called slash project inside my virtual machine. So like I had like 23 repos outside that folder and all of them were synced inside slash project. So I can work on all of them outside and run whatever builds I want inside my VM. Now something like this. If you are using a javascript tab, if you are using something like AngularJS or something. So with AngularJS once you build it there will be a distribution folder form. But while working you won't be building it again to get any feedback. You just add some header. So at that time it's also better to have the actual build compiled on the host machine as well. Rather than always lightly go with vagrant and do whatever you want inside the vagrant. So last one you will be using Puppet. This is a very specific thing. So this is our plugin. I buy Puppet manifest and modules in the vagrant file. So I will be covering vagrant provision later. So vagrant will allow you to plug in different provision as like Chef, Puppet, Ansible or even Shell. The thing with that is you can whenever you want to bring up your vagrant. So suppose you did some changes and modified some things but you got something uninstalled and you want to fix it. So you can just run the command vagrant provision or vagrant dot minus minus provision to provision your vagrant box. So the ideal scenario would be like whatever you install in your box you have automation scripts for that as well. So if you install even a simple thing like NTP it's better to include the automation script as well. So it's very easy for you to just restore the entire vagrant box and recreate it again using the provision. So there is no Puppet. I will show you just a simple example of my box as well. So I will be, I am forwarding port into 8000. So I will be running 80 inside my virtual machine and from outside I access it using local host 8000. And inside my virtual machine I will be running it on 0.0.0 like for any all IPs at 8000. 8080.0. There is a difference between the virtual box version and the box dot box which you are using. So usually you can just install a plugin like vagrant dash vp guest to resolve this issue. But it involves installing some kernel headers and it takes time so I removed that plugin for demo purposes. One question please. The port running that we can use is in a different kind of method. So when it starts it's automatically running the port on 8080. Yeah. So I will show you the vagrant file because of the guest conditions this would work. So this is how I have plugged in my first site software. So guest has their own single threaded developer server. Or even if you are just using nginx or apache or something. So you listen on 8080 on your guest machine and on your host machine you use 8000 to reach to that port. You just use localhost 8000. So you get other things as well. So I can forward multiple ports for multiple engines. Yeah. Communication between simultaneously using port forwarding. Suppose you do not want your database to be. Suppose your actual system is very loosely coupled and you have a database somewhere you have an app somewhere. So you can also have vagrant boxes or vagrant. You can also have vagrant configurations like where you forward one port from here. So you can have a database in one vagrant box itself and you are given more realistic environment. Okay. And just if you do not want to pass around on the vagrant at that time then you can just use nginx to forward whatever you want in proxy. So this is where I plug in my Chef. So now Chef solo. So this particular dot box did not have Chef solo installed. So what I do, this is not very important though. What I do is install Chef solo. This install.sh will install Chef solo for me. This is not important. This install over top of it. And then it will just like this recipe for me. Which right now just installs empty. So this is an example of Chef plug-in. Okay. So are you getting only a bit of Ansible as well? So all these Chef, Poppet and all that. Ansible is also another administration provision and configuration management tool. So the advantage, Ansible gives you over the thing which is really good about Ansible is you do not need any client side agent installed. So like in Chef client server you need Chef client installed. But with Ansible you do not need anything installed. So your provisional, sorry, your machine, you can just sit with one machine. You can have 10 computers right in front of you. And this provisional you can have at the same time using server SSH without even touching them. Just given that they have open SSH access. So if you want to install, add, suppose, Ruby on 10 machine, 10 given machines. Or if you have like 10 bigger boxes as running in the server right. So you can just run the one script one time and sit with provisional all time. Without even having to install anything on the client side. So that is one of the advantage of Ansible. So Begrid also provides a module for Ansible. Like I showed you for Chef and showed it to you for Poppet. So things like this you actually have to go to documentation when you are actually implementing it. And the Begrid documentation is amazing. So it also gives you a module for Ansible. So for this I want to be covering the plugin for Ansible. Because if I actually cover Ansible you can use it without that plugin and provisional Begrid box like that only. You don't actually need to use the plugin ever unless. Like it's better if you use it for the entire project and have the Begrid find provision all the time. But you can also choose, you can choose not to tell you why. So I'll show you Ansible script. So Ansible has playbooks and roles. So one playbook can have multiple roles. And our role can be you can decide what are the multiple things grouped together. Like if you want to install MySQL you would just be installing MySQL server. You would be installing MySQL client MySQL common and everything along with it. So you can have all of them grouped together in one role. So is it possible to find the hosts? Ansible is in double syntax. So you don't actually need to know coding to provision using Ansible. So here I define hosts which Ansible picks up from Etsy Ansible and hosts. Whereas specify the item which I want provision. Username which people use to SSH into that machine and the password. Okay this is not really a safe method. Usually it's preferred to use SSH keys. But since I provisioned my local maintenance. So this is a remote user. So a user I want to use on the remote as a maintenance. Okay so environment variable I'm defining as java home. Okay and these are the roles I'm running. First is user, then host. Hosts, outputs, java and mySQL. Okay so this will in that particular order in which I have listed. So I'll go to utils. So it's as simple as this. You want to install git. Like even if git is installed you might want to ensure that you want to install git. Okay so it's as simple as install git. And just say the state. You can specify a particular version if you want. Or you can just specify the state you want. You want to know all the details. So this is another simpler intent. This is the repo script. I'm actually adding a bunch of repositories in sentos. So all these will be added to slash yam slash repost.d. And so I'm adding a repost so that I can in future run easily yam install. Or the software I want rather than actually download the rpm site. Put it in the pms. Is it all understandable? Is it all here? It's all right. Like the repository makes like yourself or is fully formed. It can be anything right? So you are not reposting. Like Apple repo or madame. Base, updates, madame all the reposts. Here and I'm placing it in the repost.d and then activating all the reposts on my mind. Okay so with this you can have something like environments. CI, QA and staging. Provisioning all these things with all the packages you know. So suppose if you want to install 10 packages and you know all the names. And they are not available on any repost. They are available on different reposts. So the best option there is to just take an alternative, create a custom repo. And using that you can provision all the boxes. Rather than transferring each and every don't argue for example installing it on it. Adding multiple reposts and increasing the jam update. Is it clear? The series is clear. So this is actually different. And then I have Java is kind of. So here is setting Java also. So from what I have mentioned in answer today. I did not find a particular method to set an environment variable directly. Like you have to run a basket to set an environment variable. Okay. So that's how I wrote basket. So it's the Java and the Java variable I have set. And the defaults. So it's important right now. So I had another VM connection. No. You know basically that command. Command is used to execute the playbook. And I showed you the exe answerable host directory. So that will be used to SSH it to the vagrant box. Which is not set enough. SSH it to the vagrant box on that IP. And. So suppose if you have your CI staging and everything. So with that you can have. So whatever operating system you have on all those environments. You can have the same operating system running on a different environment. The entire team can be running the same operating system. And similar configuration. Less amount of surprises. So something as simple as. As simple as. You know what a lot of surprises. And then the ease of distribution which you get. So once I showed you the vagrant package command. So. Once you have everything installed on your box. Suppose you do not want to write automations. But once you have everything installed on the box. Right. So you can run a simple. Vagrant package. The VM name and ID. Box file which you both made. So it will generate a .box file. At the end. Which you may distribute on your team. And they can just straight away start using. Have the entire development environment setup. And they can just straight away start. There is the ease of use over VMs. Like all the problems which are highlighted. Can also be solved with a VM. But VM adds a lot of complexity. And this gives a very good abstraction over. A regular virtual machine. And also it is very fast to bring it down. As well as. So. In an idea of automations script written. To provision of vagrant box. You will have. The. And now vagrant also introduced. In that. You can actually version control your vagrant box. But it is not exactly. The vagrant box using some. They will give you any free space. Push it to your personal cloud. And just add that link to the new version. Say call this point to. To the vagrant. And that's all the vagrant box version. So there. When your team next time does a vagrant up. So if they run a vagrant box update. So they can. They will be updated with the new .box file. Which has been updated. And pushed to the cloud. So. The entire team will have. P-SQL after that. And. They cannot find it there. So it actually destroys all the box. And re-creates the. And creates a new one which you have pushed. Okay. But this is. More abstraction over simple copy. These are my resources. I can cover more. Comments of vagrant. This is the question. We are. We are using. We are using. The original. Any reason why you use it. Because if you run vagrant. It will create the. So suppose if I have written scripts. In answer but outside of a. Right. But I started on multiple boxes. And it forwarded a lot of books. And that. So. So. I said I prefer this. So. Right. And then the same script you use to. Your. The same script you can use to. On the cloud. Or. So. Inside. The same thing. And you can also use the same script to. Somebody else's machine. Suppose if you actually have a lot of the same solution. Any. Yeah. It is. Right. Right. Right. Right. Right. Right. Right. So. Right. Right. Right. Right. Right. Right. Right. Right. Right. Right. Right. Right. Right. So on that there are again other plugins which we can use to form a .box file out of that and we can end in that. Okay, so what about ESS? Yeah, so I don't know about ESS, but I have Oracle functions the same thing. There are plugins outside, but out of the box, so I told you about the .box file for right there is the biggest part of the file that goes to the provider and the box of JSON file needs to be formed. So that is what we are going to use. What is the box saying? Maybe the box says. No, you just know, now in HyperV, like just one week back there is still an introduction for my contact. Okay, thanks to England, etc.