{"id":1543,"date":"2014-12-17T23:41:44","date_gmt":"2014-12-17T23:41:44","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=1543"},"modified":"2014-12-17T23:41:44","modified_gmt":"2014-12-17T23:41:44","slug":"couchbase-cluster-minutes-vagrant-and-puppet","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/couchbase-cluster-minutes-vagrant-and-puppet\/","title":{"rendered":"A Couchbase Cluster in Minutes with Vagrant and Puppet"},"content":{"rendered":"<p style=\"margin-bottom: 0px; font-family: ff-kievit-web, 'Helvetica Neue', Helvetica, Helvetica, Arial, sans-serif; font-size: 16px;\"><em style=\"line-height: 23px; font-family: ff-meta-serif-web-pro-1, ff-meta-serif-web-pro-2, Georgia, 'Times New Roman', Times, serif;\">[This blog was syndicated from https:\/\/nitschinger.at\/]<\/em><\/p>\n<div>\u00a0<\/div>\n<div>\n<h2>Motivation<\/h2>\n<p>Since I work as part of the engineering team at Couchbase, I need to run my code against a variety of server deployments. We run a multitude of operating systems and software versions, and so do our customers. In order to fix bugs reliably and build new features, it is critical to get a cluster up and running that resembles these deployments as good as possible. I know that I can run all of these combinations on EC2, but the cost for this would be very high and most of the time its overkill.<\/p>\n<p><span style=\"font-family: inherit; font-size: 1em; line-height: 1.4375em;\">What I need is to get such a cluster up and running in minutes and not spending too much time on configuring it. I heard about <a href=\"https:\/\/www.vagrantup.com\/\">Vagrant<\/a> and <a href=\"https:\/\/puppetlabs.com\/\">Puppet<\/a> in the past, but never got around to use them on my own box (though I always use <a href=\"https:\/\/www.virtualbox.org\/\">VirtualBox<\/a> on MacOS to create virtual machines by hand).<\/span><\/p>\n<p><span style=\"font-family: inherit; font-size: 1em; line-height: 1.4375em;\">This morning I sat down to take a closer look on how these tools can help me to get more productive &#8211; and to my huge surprise I got a 4 node Couchbase Server cluster running in less than 30 minutes (with looking up all the configuration details). Since its so easy, I want to share it with you.<\/span><\/p>\n<h2><span style=\"line-height: 1;\">Prerequisites<\/span><\/h2>\n<p>Before we can provision our nodes, you need to make sure to have Vagrant and VirtualBox installed. If you use MacOS like me, just download the <em>.dmg<\/em> files for both and you&#39;re set. Now, create a directory somewhere to store the configuration files &#8211; I called mine &#39;vagrants&#39;.<\/p>\n<p><span style=\"font-family: inherit; font-size: 1em; line-height: 1.4375em;\">In this directory, you need to create a <em>Vagrantfile<\/em>. Its like the Vagrants <em>makefile<\/em> and it will pick it up to learn how you want to have your nodes provisioned. Note that this doesn&#39;t configure the software on top of the OS (like installing Couchbase), this is handled by puppet in a separate step. Here is the full config:<\/span><\/p>\n<\/div>\n<div>\u00a0<\/div>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family:monospace;\">Vagrant.configure(&#8220;2&#8221;) do |config|<\/p>\n<p>\u00a0 # Number of nodes to provision<\/p>\n<p>\u00a0 numNodes = 4<\/p>\n<p>\u00a0 # IP Address Base for private network<\/p>\n<p>\u00a0 ipAddrPrefix = &#8220;192.168.56.10&#8221;<\/p>\n<p>\u00a0 # Define Number of RAM for each node<\/p>\n<p>\u00a0 config.vm.provider &#8220;virtualbox&#8221; do |v|<\/p>\n<p>\u00a0 \u00a0 v.customize [&#8220;modifyvm&#8221;, :id, &#8220;&#8211;memory&#8221;, 1024]<\/p>\n<p>\u00a0 end<\/p>\n<p>\u00a0 # Provision the server itself with puppet<\/p>\n<p>\u00a0 config.vm.provision :puppet<\/p>\n<p>\u00a0 # Download the initial box from this url<\/p>\n<p>\u00a0 config.vm.box_url = &#8220;https:\/\/files.vagrantup.com\/precise64.box&#8221;<\/p>\n<p>\u00a0 # Provision Config for each of the nodes<\/p>\n<p>\u00a0 1.upto(numNodes) do |num|<\/p>\n<p>\u00a0 \u00a0 nodeName = (&#8220;node&#8221; + num.to_s).to_sym<\/p>\n<p>\u00a0 \u00a0 config.vm.define nodeName do |node|<\/p>\n<p>\u00a0 \u00a0 \u00a0 node.vm.box = &#8220;precise64&#8221;<\/p>\n<p>\u00a0 \u00a0 \u00a0 node.vm.network :private_network, ip: ipAddrPrefix + num.to_s<\/p>\n<p>\u00a0 \u00a0 \u00a0 node.vm.provider &#8220;virtualbox&#8221; do |v|<\/p>\n<p>\u00a0 \u00a0 \u00a0 v.name = &#8220;Couchbase Server Node &#8221; + num.to_s<\/p>\n<p>\u00a0 \u00a0 end<\/p>\n<p>\u00a0 end<\/p>\n<p>end<\/p>\n<p>end<\/div>\n<\/div>\n<p>This file is just ruby code that configures Vagrant. Let&#39;s go through each directive and see what it does for us.<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family:monospace;\"># Number of nodes to provision<\/p>\n<p>numNodes = 4<\/p>\n<p># IP Address Base for private network<\/p>\n<p>ipAddrPrefix = &#8220;192.168.56.10&#8221;<\/p><\/div>\n<\/div>\n<p>You can change these values, I just created them to fit my environment here. Depending on the amount of `numNodes` set, VMs will be created. I added a loop down below depending on this setting, so I don&#39;t have to duplicate code a lot. The ip address prefix is used to easily determine the (static) IP address for the server. The numbers will be counted upwards incrementally, so you will end up with four servers accessible through `192.168.56.101` to `192.168.56.104`.<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family:monospace;\"># Define Number of RAM for each node<\/p>\n<p>config.vm.provider &#8220;virtualbox&#8221; do |v|<\/p>\n<p>\u00a0 v.customize [&#8220;modifyvm&#8221;, :id, &#8220;&#8211;memory&#8221;, 1024]<\/p>\n<p>end<\/p><\/div>\n<\/div>\n<p>This config block is needed to increase the memory size of the VM. By default its less than that (I believe around 512MB), and I want to have 1 gig of RAM for each. Of course, feel free to tune that value or remove it completely.<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family:monospace;\"># Provision the server itself with puppet<\/p>\n<p>config.vm.provision :puppet<\/p><\/div>\n<\/div>\n<p>Because we&#39;ll be using puppet to provision the server software, we need to tell Vagrant to use it.<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family:monospace;\"># Download the initial box from this url<\/p>\n<p>config.vm.box_url = &#8220;https:\/\/files.vagrantup.com\/precise64.box&#8221;<\/p><\/div>\n<\/div>\n<p>Vagrant reuses predefined images so you don&#39;t have to reinstall everything from scratch. Here we use a predefined Ubuntu 12.04 64bit box.<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family:monospace;\"># Provision Config for each of the nodes<\/p>\n<p>1.upto(numNodes) do |num|<\/p>\n<p>\u00a0 nodeName = (&#8220;node&#8221; + num.to_s).to_sym<\/p>\n<p>\u00a0 config.vm.define nodeName do |node|<\/p>\n<p>\u00a0 \u00a0 node.vm.box = &#8220;precise64&#8221;<\/p>\n<p>\u00a0 \u00a0 node.vm.network :private_network, ip: ipAddrPrefix + num.to_s<\/p>\n<p>\u00a0 \u00a0 node.vm.provider &#8220;virtualbox&#8221; do |v|<\/p>\n<p>\u00a0 \u00a0 \u00a0v.name = &#8220;Couchbase Server Node &#8221; + num.to_s<\/p>\n<p>\u00a0 \u00a0 end<\/p>\n<p>\u00a0 end<\/p>\n<p>end<\/p><\/div>\n<\/div>\n<p>This code block configures each virtual machine. Given the number of nodes we want to create, for each of them it assigns an IP address and gives it a descriptive name inside Virtualbox. If you want to add server-dependent settings, the &#8220;node&#8221; block is the right place for it. Otherwise it will pick the cluster wide settings defined in the &#8220;config&#8221; block.<\/p>\n<p>Now if we would run `vagrant up` from the command line in this directory, we&#39;d get four Ubuntu machines setup where we could SSH into, but nothing else would be installed. In order to make them do something, we want to install Couchbase Server. Puppet is a system automation software and very good at provisioning systems. Vagrant has amazing support for it, all we need to is create a `default.pp` file inside a `manifests` directory that looks like this:<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family:monospace;\">exec { &#8220;couchbase-server-source&#8221;: <\/p>\n<p>\u00a0 command => &#8220;\/usr\/bin\/wget https:\/\/packages.couchbase.com\/releases\/2.0.1\/couchbase-server-enterprise_x86_64_2.0.1.deb&#8221;,<\/p>\n<p>\u00a0 cwd => &#8220;\/home\/vagrant\/&#8221;,<\/p>\n<p>\u00a0 creates => &#8220;\/home\/vagrant\/couchbase-server-enterprise_x86_64_2.0.1.deb&#8221;,<\/p>\n<p>\u00a0 before => Package[&#8216;couchbase-server&#8217;]<\/p>\n<p>}<\/p>\n<p>exec { &#8220;install-deps&#8221;:<\/p>\n<p>\u00a0 command => &#8220;\/usr\/bin\/apt-get install libssl0.9.8&#8221;,<\/p>\n<p>\u00a0 before => Package[&#8216;couchbase-server&#8217;]<\/p>\n<p>}<\/p>\n<p>package { &#8220;couchbase-server&#8221;:<\/p>\n<p>\u00a0 provider => dpkg,<\/p>\n<p>\u00a0 ensure => installed,<\/p>\n<p>\u00a0 source => &#8220;\/home\/vagrant\/couchbase-server-enterprise_x86_64_2.0.1.deb&#8221;<\/p>\n<p>}<\/p><\/div>\n<\/div>\n<p>Let&#39;s go over the internals once more.<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family:monospace;\">exec { &#8220;couchbase-server-source&#8221;: <\/p>\n<p>\u00a0 command => &#8220;\/usr\/bin\/wget https:\/\/packages.couchbase.com\/releases\/2.0.1\/couchbase-server-enterprise_x86_64_2.0.1.deb&#8221;,<\/p>\n<p>\u00a0 cwd => &#8220;\/home\/vagrant\/&#8221;,<\/p>\n<p>\u00a0 creates => &#8220;\/home\/vagrant\/couchbase-server-enterprise_x86_64_2.0.1.deb&#8221;,<\/p>\n<p>\u00a0 before => Package[&#8216;couchbase-server&#8217;]<\/p>\n<p>}<\/p><\/div>\n<\/div>\n<p>In puppet, we define some tasks that we want to run. This task executes a shell command <em>wget<\/em> and stores the file inside the home directory of the user. We tell puppet to download the debian package of the server. Note that there is a <em>before<\/em> dependency to the package installation task, because we can&#39;t install it before the file wasn&#39;t downloaded.<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family:monospace;\">exec { &#8220;install-deps&#8221;:<\/p>\n<p>\u00a0 command => &#8220;\/usr\/bin\/apt-get install libssl0.9.8&#8221;,<\/p>\n<p>\u00a0 before => Package[&#8216;couchbase-server&#8217;]<\/p>\n<p>}<\/p><\/div>\n<\/div>\n<p>We also need to install `libssl0.9.8` on the server, this is the only dependency it has. We use the command line tool <em>apt-get<\/em> for this.<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family:monospace;\">package { &#8220;couchbase-server&#8221;:<\/p>\n<p>\u00a0 provider => dpkg,<\/p>\n<p>\u00a0 ensure => installed,<\/p>\n<p>\u00a0 source => &#8220;\/home\/vagrant\/couchbase-server-enterprise_x86_64_2.0.1.deb&#8221;<\/p>\n<p>}<\/p><\/div>\n<\/div>\n<p>Finally, we can install the debian package from couchbase-server, because the file is in place and all dependencies are satisfied.<\/p>\n<p>Of course, this puppet file is very simple and I&#39;m you can do much more with it (and maybe even simplify it more) &#8211; but for my needs it is more than enough. If I want a different server version, I just need to change the puppet file and point it to the new debian package.<\/p>\n<p>Now if we run <em>vagrant up<\/em> again, much more happens. Note that if you want to play with your puppet files, you can also use <em>vagrant provision<\/em> to apply the changes while the node is running.<\/p>\n<p>If everything is okay, the output should look like this:<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family:monospace;\">Bringing machine &#8216;node1&#8217; up with &#8216;virtualbox&#8217; provider&#8230;<\/p>\n<p>Bringing machine &#8216;node2&#8217; up with &#8216;virtualbox&#8217; provider&#8230;<\/p>\n<p>Bringing machine &#8216;node3&#8217; up with &#8216;virtualbox&#8217; provider&#8230;<\/p>\n<p>Bringing machine &#8216;node4&#8217; up with &#8216;virtualbox&#8217; provider&#8230;<\/p>\n<p>[node1] Clearing any previously set forwarded ports&#8230;<\/p>\n<p>[node1] Creating shared folders metadata&#8230;<\/p>\n<p>[node1] Clearing any previously set network interfaces&#8230;<\/p>\n<p>[node1] Preparing network interfaces based on configuration&#8230;<\/p>\n<p>[node1] Forwarding ports&#8230;<\/p>\n<p>[node1] &#8212; 22 => 2222 (adapter 1)<\/p>\n<p>[node1] Running any VM customizations&#8230;<\/p>\n<p>[node1] Booting VM&#8230;<\/p>\n<p>[node1] Waiting for VM to boot. This can take a few minutes.<\/p>\n<p>[node1] VM booted and ready for use!<\/p>\n<p>[node1] Configuring and enabling network interfaces&#8230;<\/p>\n<p>[node1] Mounting shared folders&#8230;<\/p>\n<p>[node1] &#8212; \/vagrant<\/p>\n<p>[node1] &#8212; \/tmp\/vagrant-puppet\/manifests<\/p>\n<p>[node1] Running provisioner: puppet&#8230;<\/p>\n<p>Running Puppet with default.pp&#8230;<\/p>\n<p>stdin: is not a tty<\/p>\n<p>notice: \/Stage[main]\/\/Exec[install-deps]\/returns: executed successfully<\/p>\n<p>notice: Finished catalog run in 0.77 seconds<\/p>\n<p>&#8230;. more for all the other nodes.<\/p><\/div>\n<\/div>\n<p>You can then point your browser to <em>192.168.56.10[1-4] <\/em>and work with your Couchbase cluster. If you are done with it, you can use the <em>vagrant halt<\/em> command to shut it down cleanly. Very handy is also <em>vagrant suspend<\/em>, which will save the state of the nodes instead of shutting them down completely.<\/p>\n<p>If you want to interact with one of the nodes instead of the whole cluster, you can always specify the node identifier. For example, if you want to start only the first node you can do it with the <em>vagrant up node1<\/em> command.<\/p>\n<p>To me, this is a very fast and clean way to provision server nodes. I just need to change a few lines in a file and get a new cluster without much hassle. Even more important, I can put those config files in version control and <a href=\"https:\/\/github.com\/daschl\/vagrants\">share them<\/a>\u00a0with other folks!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>[This blog was syndicated from https:\/\/nitschinger.at\/] \u00a0 Motivation Since I work as part of the engineering team at Couchbase, I need to run my code against a variety of server deployments. We run a multitude of operating systems and software [&hellip;]<\/p>\n","protected":false},"author":19,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1],"tags":[1250],"ppma_author":[8987],"class_list":["post-1543","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-vagrant"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.0 (Yoast SEO v26.0) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>A Couchbase Cluster in Minutes with Vagrant and Puppet - The Couchbase Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/couchbase-cluster-minutes-vagrant-and-puppet\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"A Couchbase Cluster in Minutes with Vagrant and Puppet\" \/>\n<meta property=\"og:description\" content=\"[This blog was syndicated from https:\/\/nitschinger.at\/] \u00a0 Motivation Since I work as part of the engineering team at Couchbase, I need to run my code against a variety of server deployments. We run a multitude of operating systems and software [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/couchbase-cluster-minutes-vagrant-and-puppet\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2014-12-17T23:41:44+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/11\/couchbase-nosql-dbaas.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1800\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Michael Nitschinger\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@daschl\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Michael Nitschinger\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-cluster-minutes-vagrant-and-puppet\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-cluster-minutes-vagrant-and-puppet\/\"},\"author\":{\"name\":\"Michael Nitschinger\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/e5d4d332756da6f361dd88c1576de61d\"},\"headline\":\"A Couchbase Cluster in Minutes with Vagrant and Puppet\",\"datePublished\":\"2014-12-17T23:41:44+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-cluster-minutes-vagrant-and-puppet\/\"},\"wordCount\":1501,\"commentCount\":3,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-cluster-minutes-vagrant-and-puppet\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"keywords\":[\"Vagrant\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/couchbase-cluster-minutes-vagrant-and-puppet\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-cluster-minutes-vagrant-and-puppet\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/couchbase-cluster-minutes-vagrant-and-puppet\/\",\"name\":\"A Couchbase Cluster in Minutes with Vagrant and Puppet - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-cluster-minutes-vagrant-and-puppet\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-cluster-minutes-vagrant-and-puppet\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2014-12-17T23:41:44+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-cluster-minutes-vagrant-and-puppet\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/couchbase-cluster-minutes-vagrant-and-puppet\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-cluster-minutes-vagrant-and-puppet\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"width\":1800,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-cluster-minutes-vagrant-and-puppet\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"A Couchbase Cluster in Minutes with Vagrant and Puppet\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/e5d4d332756da6f361dd88c1576de61d\",\"name\":\"Michael Nitschinger\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/95e178617974d46e3b02dd1754a3f60b\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/dad99b5e02a74ca4bec14352e9da710160647a97290814b669babb3aac0ea675?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/dad99b5e02a74ca4bec14352e9da710160647a97290814b669babb3aac0ea675?s=96&d=mm&r=g\",\"caption\":\"Michael Nitschinger\"},\"description\":\"Michael Nitschinger works as a Principal Software Engineer at Couchbase. He is the architect and maintainer of the Couchbase Java SDK, one of the first completely reactive database drivers on the JVM. He also authored and maintains the Couchbase Spark Connector. Michael is active in the open source community, a contributor to various other projects like RxJava and Netty.\",\"sameAs\":[\"https:\/\/nitschinger.at\",\"https:\/\/x.com\/daschl\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/author\/michael-nitschinger\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"A Couchbase Cluster in Minutes with Vagrant and Puppet - The Couchbase Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/couchbase-cluster-minutes-vagrant-and-puppet\/","og_locale":"en_US","og_type":"article","og_title":"A Couchbase Cluster in Minutes with Vagrant and Puppet","og_description":"[This blog was syndicated from https:\/\/nitschinger.at\/] \u00a0 Motivation Since I work as part of the engineering team at Couchbase, I need to run my code against a variety of server deployments. We run a multitude of operating systems and software [&hellip;]","og_url":"https:\/\/www.couchbase.com\/blog\/couchbase-cluster-minutes-vagrant-and-puppet\/","og_site_name":"The Couchbase Blog","article_published_time":"2014-12-17T23:41:44+00:00","og_image":[{"width":1800,"height":630,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/11\/couchbase-nosql-dbaas.png","type":"image\/png"}],"author":"Michael Nitschinger","twitter_card":"summary_large_image","twitter_creator":"@daschl","twitter_misc":{"Written by":"Michael Nitschinger","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-cluster-minutes-vagrant-and-puppet\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-cluster-minutes-vagrant-and-puppet\/"},"author":{"name":"Michael Nitschinger","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/e5d4d332756da6f361dd88c1576de61d"},"headline":"A Couchbase Cluster in Minutes with Vagrant and Puppet","datePublished":"2014-12-17T23:41:44+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-cluster-minutes-vagrant-and-puppet\/"},"wordCount":1501,"commentCount":3,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-cluster-minutes-vagrant-and-puppet\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","keywords":["Vagrant"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/couchbase-cluster-minutes-vagrant-and-puppet\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-cluster-minutes-vagrant-and-puppet\/","url":"https:\/\/www.couchbase.com\/blog\/couchbase-cluster-minutes-vagrant-and-puppet\/","name":"A Couchbase Cluster in Minutes with Vagrant and Puppet - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-cluster-minutes-vagrant-and-puppet\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-cluster-minutes-vagrant-and-puppet\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2014-12-17T23:41:44+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-cluster-minutes-vagrant-and-puppet\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/couchbase-cluster-minutes-vagrant-and-puppet\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-cluster-minutes-vagrant-and-puppet\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","width":1800,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-cluster-minutes-vagrant-and-puppet\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"A Couchbase Cluster in Minutes with Vagrant and Puppet"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"The Couchbase Blog","description":"Couchbase, the NoSQL Database","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"The Couchbase Blog","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/e5d4d332756da6f361dd88c1576de61d","name":"Michael Nitschinger","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/95e178617974d46e3b02dd1754a3f60b","url":"https:\/\/secure.gravatar.com\/avatar\/dad99b5e02a74ca4bec14352e9da710160647a97290814b669babb3aac0ea675?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/dad99b5e02a74ca4bec14352e9da710160647a97290814b669babb3aac0ea675?s=96&d=mm&r=g","caption":"Michael Nitschinger"},"description":"Michael Nitschinger works as a Principal Software Engineer at Couchbase. He is the architect and maintainer of the Couchbase Java SDK, one of the first completely reactive database drivers on the JVM. He also authored and maintains the Couchbase Spark Connector. Michael is active in the open source community, a contributor to various other projects like RxJava and Netty.","sameAs":["https:\/\/nitschinger.at","https:\/\/x.com\/daschl"],"url":"https:\/\/www.couchbase.com\/blog\/author\/michael-nitschinger\/"}]}},"authors":[{"term_id":8987,"user_id":19,"is_guest":0,"slug":"michael-nitschinger","display_name":"Michael Nitschinger","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/dad99b5e02a74ca4bec14352e9da710160647a97290814b669babb3aac0ea675?s=96&d=mm&r=g","author_category":"","last_name":"Nitschinger, Principal Software Engineer, Couchbase","first_name":"Michael","job_title":"","user_url":"https:\/\/nitschinger.at","description":"Michael Nitschinger works as a Principal Software Engineer at Couchbase. He is the architect and maintainer of the Couchbase Java SDK, one of the first completely reactive database drivers on the JVM. He also authored and maintains the Couchbase Spark Connector. Michael is active in the open source community, a contributor to various other projects like RxJava and Netty."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts\/1543","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/users\/19"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/comments?post=1543"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts\/1543\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/media?parent=1543"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/categories?post=1543"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/tags?post=1543"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/ppma_author?post=1543"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}