{"id":1569,"date":"2015-11-24T09:28:57","date_gmt":"2015-11-24T09:28:57","guid":{"rendered":"https:\/\/blogs.gov.scot\/digital\/?p=1569"},"modified":"2018-02-19T17:24:19","modified_gmt":"2018-02-19T17:24:19","slug":"masterless-puppet-declarative-provisioning","status":"publish","type":"post","link":"https:\/\/blogs.gov.scot\/digital\/2015\/11\/24\/masterless-puppet-declarative-provisioning\/","title":{"rendered":"Masterless Puppet and Declarative provisioning"},"content":{"rendered":"<p><em>This is a post by <a href=\"https:\/\/twitter.com\/gordonjclark\">Gordon Clark<\/a>, one of our Infrastructure Engineers, and <a href=\"https:\/\/www.twitter.com\/jonoellis\">Jono Ellis<\/a>, our Social Media Manager<\/em>.<\/p>\n<p>This post is the second post in our series covering how we approach <a href=\"http:\/\/inside.mygov.scot\/2015\/11\/04\/how-we-approach-continuous-delivery\/\">continuous delivery<\/a>,\u00a0covering the tools that we use.<\/p>\n<p>We are not precious about our servers, they are just tools for a defined purpose and when they\u2019ve reached the end of their usefulness we can get rid of them. They are disposable. This is something you can only do with cloud computing \u2013 we don\u2019t own a physical server anywhere; instead we create and configure servers from our cloud providers. The benefits are the speed and agility that this setup offers us. As an example, in order to test a proof of concept we could spin up several servers to do a task, gather whatever stats we needed, and then we could destroy them. With no physical server needing to be purchased, set up, powered, etc. there are significant environmental benefits to this approach.<!--more--><\/p>\n<h3>Tools<\/h3>\n<p>We use several tools in order to facilitate our server configuration management:<\/p>\n<ul>\n<li>Puppet \u2013 provisioning and configuration of hosts (we use Puppet in a masterless way);<\/li>\n<li>Packer \u2013 definition and creation of our base image;<\/li>\n<li>Base images \u2013 assignment\u00a0of a role and an environment (based on the rules for the role\u00a0a host is given, the host will self-provision. This means that the host gathers packages and configuration from a known artifact repository such as Debian);<\/li>\n<li>Vagrant \u2013 deploying Puppet runs locally for testing purposes.<\/li>\n<\/ul>\n<h3>Roles and Profiles<\/h3>\n<p>The role a server is provided with equates to a business need i.e. a web server, an application or a database server.<\/p>\n<p>Each role (e.g. web server) has an accompanying module in Puppet. This Puppet module in turn contains one or more technology profiles, which are also described in Puppet. Each host can only be assigned a single role but each role can contain multiple profiles (which is turn can contain multiple modules).\u00a0The modules are directly related to an individual technology, e.g. NGINX, Java or PostgreSQL. The diagram below shows how the hierarchy is arranged. It should be noted that the modules are generic, they can be used in any environment and do not contain any configuration related to an individual host. The configuration data is abstracted to Hiera.<\/p>\n<p><a href=\"https:\/\/blogs.gov.scot\/digital\/wp-content\/uploads\/sites\/5\/2017\/07\/masterless-puppet.png\"><img decoding=\"async\" class=\"alignnone size-full wp-image-1573 lazyload\" data-src=\"https:\/\/blogs.gov.scot\/digital\/wp-content\/uploads\/sites\/5\/2017\/07\/masterless-puppet.png\" alt=\"\" width=\"700\" height=\"700\" data-srcset=\"https:\/\/blogs.gov.scot\/digital\/wp-content\/uploads\/sites\/5\/2017\/07\/masterless-puppet.png 700w, https:\/\/blogs.gov.scot\/digital\/wp-content\/uploads\/sites\/5\/2017\/07\/masterless-puppet-150x150.png 150w, https:\/\/blogs.gov.scot\/digital\/wp-content\/uploads\/sites\/5\/2017\/07\/masterless-puppet-300x300.png 300w, https:\/\/blogs.gov.scot\/digital\/wp-content\/uploads\/sites\/5\/2017\/07\/masterless-puppet-512x512.png 512w, https:\/\/blogs.gov.scot\/digital\/wp-content\/uploads\/sites\/5\/2017\/07\/masterless-puppet-420x420.png 420w\" data-sizes=\"(max-width: 700px) 100vw, 700px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 700px; --smush-placeholder-aspect-ratio: 700\/700;\" \/><\/a><br \/>\n<!--more--><\/p>\n<p>In addition to the role, each server is assigned to an environment (i.e. dev, test or production), and from that it picks up the appropriate state and configuration. We use Puppet because Puppet is good for saying what state something should be \u2013 what packages should be installed and how they can be configured.<\/p>\n<p>The code below gives you an example of setting up the role of a web server which will be spun up with an Nginx profile.<\/p>\n<h4>Example role manifest: web_svr.pp<\/h4>\n<p>[code]<br \/>\n#- file: modules\/role\/manifests\/web.pp<br \/>\n#- Class: role::web_svr<br \/>\n#<br \/>\n# Class to define a web server role<br \/>\n#<br \/>\nclass role::web_svr {<\/p>\n<p>include profile::base<br \/>\ninclude profile::web<\/p>\n<p>}<br \/>\n[\/code]<\/p>\n<h4>Example profile manifest: web.pp<\/h4>\n<p>[code]<br \/>\n#- file: modules\/profile\/manifests\/web.pp<br \/>\n#- Class: profile::web<br \/>\n#<br \/>\n# Class to incorporate all web components<br \/>\n#<br \/>\nclass profile::web {<\/p>\n<p>class { &#8216;nginx&#8217;: }<\/p>\n<p>}<br \/>\n[\/code]<\/p>\n<h4>Example profile manifest: base.pp<\/h4>\n<p>[code]<br \/>\n#- file: modules\/profile\/manifests\/base.pp<br \/>\n#- Class: profile::base<br \/>\n#<br \/>\n# Class to install the base requirements for any host<br \/>\n#<br \/>\nclass profile::base {<\/p>\n<p>package { &#8220;ntp&#8221;:<br \/>\nensure =&gt; installed<br \/>\n}<\/p>\n<p>service { &#8220;ntp&#8221;:<br \/>\nensure =&gt; running,<br \/>\nrequire =&gt; Package[&#8216;ntp&#8217;]<br \/>\n}<\/p>\n<p>}<br \/>\n[\/code]<\/p>\n<p>We do things in the cloud but we&#8217;ve created some example code which will run on your own computer.\u00a0At the end of this article we have included instructions and a link so that you can run this\u00a0Puppet example on VirtualBox.<\/p>\n<h3>Configuration<\/h3>\n<p>A lot of our application configuration is externalised to the Hiera config repository as YAML files which contain the configuration. We have our Puppet modules which define technologies and Hiera config files which can contain things like port numbers, root directory, host name, etc. It\u2019s a good idea to separate the Puppet modules from the Hiera config as this means that a module can be taken off the shelf and configured separately.<\/p>\n<p>For example our environment\/role configuration is arranged as follows in Hiera:<\/p>\n<p>.\/dev\/app_svr.yaml<\/p>\n<p>.\/dev\/web_svr.yaml<\/p>\n<p>.\/tst\/app_svr.yaml<\/p>\n<p>.\/tst\/web_svr.yaml<\/p>\n<p>So, if a host is defined as a \u2018dev\u2019 \u2019web_svr\u2019 (i.e. a development environment web server) then it inherits the values defined in the .\/dev\/web_svr.yaml file \u2013 in the provided files this means that the image displayed is a unicorn. If a host is defined as a \u2018tst\u2019 \u2019web_svr\u2019 (i.e. a test environment web server) then it inherits the values defined in the .\/tst\/web_svr.yaml file \u2013 which means it uses the panda.png image.<\/p>\n<p>The process we follow to apply our Puppet manifests\/configuration is as follows:<\/p>\n<ul>\n<li>Puppet code checked in to Stash<\/li>\n<li>Packaged as a versioned Debian \u2018deb\u2019<\/li>\n<li>Pushed to Nexus and an apt repository<\/li>\n<li>Trigger Puppet run via Bamboo<\/li>\n<li>Package containing Puppet Module is pulled to individual boxes<\/li>\n<li>Installed<\/li>\n<li>Puppet Apply is run applying the new code\/configuration<\/li>\n<\/ul>\n<h3>Why masterless?<\/h3>\n<ul>\n<li>We don\u2019t have to worry about certificates or scaling<\/li>\n<li>We can trigger a Puppet run across an entire environment<\/li>\n<li>We can version the Puppet manifests and promote them with the other code<\/li>\n<\/ul>\n<p>We don\u2019t have to worry about how to scale Puppet because it is self-contained and runs locally on the target box i.e. there is no Puppet master. We treat Puppet manifests as artifacts themselves so they can be tested and promoted through the pipeline accordingly. This agility comes into it\u2019s own when news of a security vulnerability (such as Shellshock or Heartbleed) is announced online \u2013 we have the ability to make security updates quickly and with relative ease.<\/p>\n<p>Many people use Puppet masters and both setups have their advantages, as do alternate setups using Chef or Ansible. We chose to go masterless as it was the best fit for us; we can version control Puppet, treat it like an artefact and orchestrate Puppet how we want. We are also not subject to scaling issues as there is no need for certificate agent. Any problem we can roll back or rebuild as appropriate.<\/p>\n<h3>Demo code<\/h3>\n<p>You can download and play around with our\u00a0example following these steps:<\/p>\n<ul>\n<li>Download\/clone our demo code from <a href=\"https:\/\/github.com\/scottishgovernment\/mygovscot-puppet-blogpost\">Github<\/a><\/li>\n<li>Install <a href=\"https:\/\/www.virtualbox.org\/wiki\/Downloads\">VirtualBox<\/a><\/li>\n<li>Install <a href=\"https:\/\/www.vagrantup.com\/downloads.html\">Vagrant<\/a><\/li>\n<li>Go to the .\/puppettest directory &amp; run the following:[code]vagrant up &#8211;provider=&#8221;virtualbox&#8221;[\/code]<\/li>\n<li>This should provision 2 virtual machines on your local machine &#8211; 1 web server and 1 app server \u2013 provisioned as \u2018dev\u2019 environments.<\/li>\n<li>To change this to the \u2018tst\u2019 environment, simply modify the symbolic link \u2018servers.yaml\u2019 to link to \u2018servers.yaml.tst\u2019 by running:[code]rm \u2013f servers.yaml[\/code][code]ln -s servers.yaml.tst servers.yaml[\/code]<\/li>\n<\/ul>\n<p>Once the VM\u2019s are up and running, open any browser and navigate to http:\/\/localhost:8080 for the web server and http:\/\/localhost:9090 for the app server (the servers.yaml file has details of what ports are forwarded).<\/p>\n<h3>Useful links<\/h3>\n<p>Roles and profiles:<\/p>\n<ul>\n<li><a href=\"http:\/\/rnelson0.com\/2014\/07\/14\/intro-to-roles-and-profiles-with-puppet-and-hiera\/\">http:\/\/rnelson0.com\/2014\/07\/14\/intro-to-roles-and-profiles-with-puppet-and-hiera\/<\/a><\/li>\n<li><a href=\"http:\/\/garylarizza.com\/blog\/2014\/02\/17\/puppet-workflow-part-2\/\">http:\/\/garylarizza.com\/blog\/2014\/02\/17\/puppet-workflow-part-2\/<\/a><\/li>\n<\/ul>\n<p>Masterless Puppet:<\/p>\n<ul>\n<li><a href=\"http:\/\/pierrerambaud.com\/blog\/devops\/using-hiera-with-puppet\">http:\/\/pierrerambaud.com\/blog\/devops\/using-hiera-with-puppet<\/a><\/li>\n<li><a href=\"https:\/\/www.digitalocean.com\/community\/tutorials\/how-to-set-up-a-masterless-puppet-environment-on-ubuntu-14-04\">https:\/\/www.digitalocean.com\/community\/tutorials\/how-to-set-up-a-masterless-puppet-environment-on-ubuntu-14-04<\/a><\/li>\n<li>https:\/\/puppetlabs.com\/presentations\/de-centralise-and-conquer-masterless-puppet-dynamic-environment<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p><em>We\u2019ll be sharing updates on this topic, and much more on social, so follow the team via <a href=\"https:\/\/twitter.com\/mygovscot\">@mygovscot on Twitter<\/a> for more updates. Got a question or want to comment? Get in touch below!<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>This is a post by Gordon Clark, one of our Infrastructure Engineers, and Jono Ellis, our Social Media Manager. This post is the second post in our series covering how we approach continuous delivery,\u00a0covering the tools that we use. We are not precious about our servers, they are just tools for a defined purpose and&#8230;<\/p>\n","protected":false},"author":401,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5,10],"tags":[70],"class_list":["post-1569","post","type-post","status-publish","format-standard","hentry","category-digital-public-services","category-mygov-scot","tag-technology-digital-architecture"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.8 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Masterless Puppet and Declarative provisioning - Digital<\/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:\/\/blogs.gov.scot\/digital\/2015\/11\/24\/masterless-puppet-declarative-provisioning\/\" \/>\n<meta property=\"og:locale\" content=\"en_GB\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Masterless Puppet and Declarative provisioning - Digital\" \/>\n<meta property=\"og:description\" content=\"This is a post by Gordon Clark, one of our Infrastructure Engineers, and Jono Ellis, our Social Media Manager. This post is the second post in our series covering how we approach continuous delivery,\u00a0covering the tools that we use. We are not precious about our servers, they are just tools for a defined purpose and...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blogs.gov.scot\/digital\/2015\/11\/24\/masterless-puppet-declarative-provisioning\/\" \/>\n<meta property=\"og:site_name\" content=\"Digital\" \/>\n<meta property=\"article:published_time\" content=\"2015-11-24T09:28:57+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2018-02-19T17:24:19+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blogs.gov.scot\/digital\/wp-content\/uploads\/sites\/5\/2017\/07\/masterless-puppet.png\" \/>\n\t<meta property=\"og:image:width\" content=\"700\" \/>\n\t<meta property=\"og:image:height\" content=\"700\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"craigmilligan\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"craigmilligan\" \/>\n\t<meta name=\"twitter:label2\" content=\"Estimated reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/blogs.gov.scot\/digital\/2015\/11\/24\/masterless-puppet-declarative-provisioning\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/blogs.gov.scot\/digital\/2015\/11\/24\/masterless-puppet-declarative-provisioning\/\"},\"author\":{\"name\":\"craigmilligan\",\"@id\":\"https:\/\/blogs.gov.scot\/digital\/#\/schema\/person\/ef1ff8acf7c47992d04cea9ca3f9b3e9\"},\"headline\":\"Masterless Puppet and Declarative provisioning\",\"datePublished\":\"2015-11-24T09:28:57+00:00\",\"dateModified\":\"2018-02-19T17:24:19+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/blogs.gov.scot\/digital\/2015\/11\/24\/masterless-puppet-declarative-provisioning\/\"},\"wordCount\":1257,\"commentCount\":0,\"image\":{\"@id\":\"https:\/\/blogs.gov.scot\/digital\/2015\/11\/24\/masterless-puppet-declarative-provisioning\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/blogs.gov.scot\/digital\/wp-content\/uploads\/sites\/5\/2017\/07\/masterless-puppet.png\",\"keywords\":[\"Technology &amp; Digital Architecture\"],\"articleSection\":[\"Digital Public Services\",\"mygov.scot\"],\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/blogs.gov.scot\/digital\/2015\/11\/24\/masterless-puppet-declarative-provisioning\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blogs.gov.scot\/digital\/2015\/11\/24\/masterless-puppet-declarative-provisioning\/\",\"url\":\"https:\/\/blogs.gov.scot\/digital\/2015\/11\/24\/masterless-puppet-declarative-provisioning\/\",\"name\":\"Masterless Puppet and Declarative provisioning - Digital\",\"isPartOf\":{\"@id\":\"https:\/\/blogs.gov.scot\/digital\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/blogs.gov.scot\/digital\/2015\/11\/24\/masterless-puppet-declarative-provisioning\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/blogs.gov.scot\/digital\/2015\/11\/24\/masterless-puppet-declarative-provisioning\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/blogs.gov.scot\/digital\/wp-content\/uploads\/sites\/5\/2017\/07\/masterless-puppet.png\",\"datePublished\":\"2015-11-24T09:28:57+00:00\",\"dateModified\":\"2018-02-19T17:24:19+00:00\",\"author\":{\"@id\":\"https:\/\/blogs.gov.scot\/digital\/#\/schema\/person\/ef1ff8acf7c47992d04cea9ca3f9b3e9\"},\"breadcrumb\":{\"@id\":\"https:\/\/blogs.gov.scot\/digital\/2015\/11\/24\/masterless-puppet-declarative-provisioning\/#breadcrumb\"},\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blogs.gov.scot\/digital\/2015\/11\/24\/masterless-puppet-declarative-provisioning\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\/\/blogs.gov.scot\/digital\/2015\/11\/24\/masterless-puppet-declarative-provisioning\/#primaryimage\",\"url\":\"https:\/\/blogs.gov.scot\/digital\/wp-content\/uploads\/sites\/5\/2017\/07\/masterless-puppet.png\",\"contentUrl\":\"https:\/\/blogs.gov.scot\/digital\/wp-content\/uploads\/sites\/5\/2017\/07\/masterless-puppet.png\",\"width\":700,\"height\":700},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/blogs.gov.scot\/digital\/2015\/11\/24\/masterless-puppet-declarative-provisioning\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/blogs.gov.scot\/digital\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Masterless Puppet and Declarative provisioning\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/blogs.gov.scot\/digital\/#website\",\"url\":\"https:\/\/blogs.gov.scot\/digital\/\",\"name\":\"Digital\",\"description\":\"Updates from the Scottish Government&#039;s Digital Directorate\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/blogs.gov.scot\/digital\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-GB\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/blogs.gov.scot\/digital\/#\/schema\/person\/ef1ff8acf7c47992d04cea9ca3f9b3e9\",\"name\":\"craigmilligan\",\"url\":\"https:\/\/blogs.gov.scot\/digital\/author\/craigmilligan\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Masterless Puppet and Declarative provisioning - Digital","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:\/\/blogs.gov.scot\/digital\/2015\/11\/24\/masterless-puppet-declarative-provisioning\/","og_locale":"en_GB","og_type":"article","og_title":"Masterless Puppet and Declarative provisioning - Digital","og_description":"This is a post by Gordon Clark, one of our Infrastructure Engineers, and Jono Ellis, our Social Media Manager. This post is the second post in our series covering how we approach continuous delivery,\u00a0covering the tools that we use. We are not precious about our servers, they are just tools for a defined purpose and...","og_url":"https:\/\/blogs.gov.scot\/digital\/2015\/11\/24\/masterless-puppet-declarative-provisioning\/","og_site_name":"Digital","article_published_time":"2015-11-24T09:28:57+00:00","article_modified_time":"2018-02-19T17:24:19+00:00","og_image":[{"width":700,"height":700,"url":"https:\/\/blogs.gov.scot\/digital\/wp-content\/uploads\/sites\/5\/2017\/07\/masterless-puppet.png","type":"image\/png"}],"author":"craigmilligan","twitter_card":"summary_large_image","twitter_misc":{"Written by":"craigmilligan","Estimated reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blogs.gov.scot\/digital\/2015\/11\/24\/masterless-puppet-declarative-provisioning\/#article","isPartOf":{"@id":"https:\/\/blogs.gov.scot\/digital\/2015\/11\/24\/masterless-puppet-declarative-provisioning\/"},"author":{"name":"craigmilligan","@id":"https:\/\/blogs.gov.scot\/digital\/#\/schema\/person\/ef1ff8acf7c47992d04cea9ca3f9b3e9"},"headline":"Masterless Puppet and Declarative provisioning","datePublished":"2015-11-24T09:28:57+00:00","dateModified":"2018-02-19T17:24:19+00:00","mainEntityOfPage":{"@id":"https:\/\/blogs.gov.scot\/digital\/2015\/11\/24\/masterless-puppet-declarative-provisioning\/"},"wordCount":1257,"commentCount":0,"image":{"@id":"https:\/\/blogs.gov.scot\/digital\/2015\/11\/24\/masterless-puppet-declarative-provisioning\/#primaryimage"},"thumbnailUrl":"https:\/\/blogs.gov.scot\/digital\/wp-content\/uploads\/sites\/5\/2017\/07\/masterless-puppet.png","keywords":["Technology &amp; Digital Architecture"],"articleSection":["Digital Public Services","mygov.scot"],"inLanguage":"en-GB","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blogs.gov.scot\/digital\/2015\/11\/24\/masterless-puppet-declarative-provisioning\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/blogs.gov.scot\/digital\/2015\/11\/24\/masterless-puppet-declarative-provisioning\/","url":"https:\/\/blogs.gov.scot\/digital\/2015\/11\/24\/masterless-puppet-declarative-provisioning\/","name":"Masterless Puppet and Declarative provisioning - Digital","isPartOf":{"@id":"https:\/\/blogs.gov.scot\/digital\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blogs.gov.scot\/digital\/2015\/11\/24\/masterless-puppet-declarative-provisioning\/#primaryimage"},"image":{"@id":"https:\/\/blogs.gov.scot\/digital\/2015\/11\/24\/masterless-puppet-declarative-provisioning\/#primaryimage"},"thumbnailUrl":"https:\/\/blogs.gov.scot\/digital\/wp-content\/uploads\/sites\/5\/2017\/07\/masterless-puppet.png","datePublished":"2015-11-24T09:28:57+00:00","dateModified":"2018-02-19T17:24:19+00:00","author":{"@id":"https:\/\/blogs.gov.scot\/digital\/#\/schema\/person\/ef1ff8acf7c47992d04cea9ca3f9b3e9"},"breadcrumb":{"@id":"https:\/\/blogs.gov.scot\/digital\/2015\/11\/24\/masterless-puppet-declarative-provisioning\/#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blogs.gov.scot\/digital\/2015\/11\/24\/masterless-puppet-declarative-provisioning\/"]}]},{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/blogs.gov.scot\/digital\/2015\/11\/24\/masterless-puppet-declarative-provisioning\/#primaryimage","url":"https:\/\/blogs.gov.scot\/digital\/wp-content\/uploads\/sites\/5\/2017\/07\/masterless-puppet.png","contentUrl":"https:\/\/blogs.gov.scot\/digital\/wp-content\/uploads\/sites\/5\/2017\/07\/masterless-puppet.png","width":700,"height":700},{"@type":"BreadcrumbList","@id":"https:\/\/blogs.gov.scot\/digital\/2015\/11\/24\/masterless-puppet-declarative-provisioning\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/blogs.gov.scot\/digital\/"},{"@type":"ListItem","position":2,"name":"Masterless Puppet and Declarative provisioning"}]},{"@type":"WebSite","@id":"https:\/\/blogs.gov.scot\/digital\/#website","url":"https:\/\/blogs.gov.scot\/digital\/","name":"Digital","description":"Updates from the Scottish Government&#039;s Digital Directorate","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blogs.gov.scot\/digital\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-GB"},{"@type":"Person","@id":"https:\/\/blogs.gov.scot\/digital\/#\/schema\/person\/ef1ff8acf7c47992d04cea9ca3f9b3e9","name":"craigmilligan","url":"https:\/\/blogs.gov.scot\/digital\/author\/craigmilligan\/"}]}},"_links":{"self":[{"href":"https:\/\/blogs.gov.scot\/digital\/wp-json\/wp\/v2\/posts\/1569","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogs.gov.scot\/digital\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.gov.scot\/digital\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.gov.scot\/digital\/wp-json\/wp\/v2\/users\/401"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.gov.scot\/digital\/wp-json\/wp\/v2\/comments?post=1569"}],"version-history":[{"count":0,"href":"https:\/\/blogs.gov.scot\/digital\/wp-json\/wp\/v2\/posts\/1569\/revisions"}],"wp:attachment":[{"href":"https:\/\/blogs.gov.scot\/digital\/wp-json\/wp\/v2\/media?parent=1569"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.gov.scot\/digital\/wp-json\/wp\/v2\/categories?post=1569"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.gov.scot\/digital\/wp-json\/wp\/v2\/tags?post=1569"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}