{"id":475,"date":"2010-08-03T20:01:51","date_gmt":"2010-08-03T19:01:51","guid":{"rendered":"http:\/\/www.streppone.it\/cosimo\/blog\/2010\/08\/puppet-custom-facts-and-master-less-puppet-deployment\/"},"modified":"2010-08-03T20:01:51","modified_gmt":"2010-08-03T19:01:51","slug":"puppet-custom-facts-and-master-less-puppet-deployment","status":"publish","type":"post","link":"https:\/\/www.streppone.it\/cosimo\/blog\/2010\/08\/puppet-custom-facts-and-master-less-puppet-deployment\/","title":{"rendered":"Puppet custom facts, and master-less puppet deployment"},"content":{"rendered":"<p>As I mentioned a few weeks ago, I&#39;m using <a href=\"http:\/\/www.puppetlabs.com\/\" rel=\"nofollow\">Puppet<\/a> for some smaller projects here at work. They&#39;re pilot projects to see how puppet behaves and scales for us before taking it into bigger challenges.<\/p>\n<p>One of the problems so far is that we&#39;re using <a href=\"http:\/\/www.fabfile.org\" rel=\"nofollow\">fabric<\/a> as the &quot;last-mile&quot; deployment tool, and that doesn&#39;t yet have any way to run jobs in parallel. That&#39;s the reason why I&#39;m starting to look elsewhere, like <a href=\"http:\/\/www.google.com\/search?client=opera&amp;rls=en&amp;q=mcollective&amp;sourceid=opera&amp;ie=utf-8&amp;oe=utf-8\" rel=\"nofollow\">mcollective<\/a> for example.<\/p>\n<p>However, today I had to prepare a new <b>varnish<\/b> box for files.myopera.com. This new machine is in a different data center than our current one, so we don&#39;t have any puppetmaster deployed there yet. This stopped me from using puppet in also <a href=\"http:\/\/my.opera.com\/cstrep\/blog\/a-geolocating-distributed-dns-service-geodns\" rel=\"nofollow\">another project<\/a>. But lately I&#39;ve been reading on the puppet-users mailing list that several people have tried to deploy a master-less puppet configuration, where you have <b>no puppetmasterd running<\/b>. You just deploy the puppet files, via rsync, source control or pigeons, and then let the standalone <b>puppet executable run<\/b>.<\/p>\n<h3>Puppet master-less setup<\/h3>\n<p>To do this, you have to at least have a good set of reusable puppet modules, which I tried to build small pieces at a time during the last few months. So I decided to give it a shot, and got everything up and running quickly. Deployed my set of modules in <code>\/etc\/puppet\/modules<\/code>, and built a single manifest file that looks like the following:<\/p>\n<pre><code>\r\n#\r\n# Puppet standalone no-master deployment\r\n# for files.myopera.com varnish nodes\r\n#\r\nnode varnish_box {\r\n\r\n    # Basic debian stuff\r\n    $disableservices = [ &quot;exim4&quot;, &quot;nfs-common&quot;, &quot;portmap&quot; ]\r\n    service { $disableservices:\r\n        enable =&gt; &quot;false&quot;,\r\n        ensure =&gt; &quot;stopped&quot;,\r\n    }\r\n\r\n    # Can cause overload on the filesystem through cronjobs\r\n    package { &quot;locate&quot;: ensure =&gt; &quot;absent&quot;, }\r\n    package { &quot;man-db&quot;: ensure =&gt; &quot;absent&quot;, }\r\n\r\n    # Basic configuration, depends on data center too\r\n    include opera\r\n    include opera::sudoers\r\n    include opera::admins::core_services\r\n    include opera::datacenters::dc2\r\n\r\n    # Basic packages now. These are all in-house modules\r\n    include base_packages\r\n    include locales\r\n    include bash\r\n    include munin\r\n    include cron\r\n    include puppet\r\n    include varnish\r\n\r\n    varnish::config { &quot;files-varnish-config&quot;:\r\n        vcl_conf =&gt; &quot;files.vcl&quot;,\r\n        storage_type =&gt; &quot;malloc&quot;,\r\n        storage_size =&gt; &quot;20G&quot;,\r\n        listen_port =&gt; 80,\r\n        ttl =&gt; 864000,\r\n        thread_pools =&gt; 8,\r\n        thread_min =&gt; 800,\r\n        thread_max =&gt; 10000,\r\n    }\r\n\r\n    #\r\n    # Nginx (SSL certs required)\r\n    #\r\n    include nginx\r\n\r\n    nginx::config { &quot;\/etc\/nginx\/nginx.conf&quot;:\r\n        worker_processes =&gt; 16,\r\n        worker_connections =&gt; 16384,\r\n        keepalive_timeout =&gt; 5,\r\n    }\r\n\r\n    nginx::vhost { &quot;https.files.myopera.com&quot;:\r\n        ensure =&gt; &quot;present&quot;,\r\n        source =&gt; &quot;\/usr\/local\/src\/myopera\/config\/nginx\/sites-available\/https.files.myopera.com&quot;,\r\n    }\r\n\r\n    bash:: prompt { &quot;\/root\/.bashrc&quot;:\r\n        description =&gt; &quot;Files::Varnish&quot;,\r\n        color =&gt; &quot;red&quot;,\r\n    }\r\n\r\n    munin:: plugin::custom { &quot;cpuopera&quot;: }\r\n\r\n    munin:: plugin { &quot;if_eth0&quot;:\r\n        plugin_name =&gt; &quot;if_&quot;\r\n    }\r\n\r\n    munin:: plugin {\r\n        [ &quot;mem_&quot;, &quot;load&quot;, &quot;df&quot;, &quot;df_inode&quot;, &quot;netstat&quot;, &quot;vmstat&quot;,\r\n          &quot;iostat&quot;, &quot;uptime&quot;, &quot;threads&quot;, &quot;open_files&quot;, &quot;memory&quot;, &quot;diskstats&quot; ]:\r\n    }\r\n}\r\n\r\nnode default inherits varnish_box {\r\n}\r\n\r\nnode &#39;my.hostname.opera.com&#39; inherits varnish_box {\r\n}\r\n\r\n<\/code><\/pre>\n<p>This manifest installs varnish, nginx, a bunch of basic packages I always want on every machines (vim, tcpdump, etc&#8230;), munin and appropriate plugins already configured, and also a nice <span style=\"color:red\">red bash prompt<\/span> to warn me that this is production stuff.<\/p>\n<p>This file is everything the puppet client needs to run and produce the desired effect, without needing a puppet master. Save it as <code>varnish-node.pp<\/code> and then you run it with:<\/p>\n<pre><code>\r\npuppet varnish-node.pp\r\n<\/code><\/pre>\n<p>One problem that usually arises is how to serve the static files. In this case, I assumed I&#39;m going to check out the source code and config files from my own repository into <code>\/usr\/local\/src\/...<\/code> so I don&#39;t need to point puppet to a server with the classic:<\/p>\n<pre><code>\r\nsource =&gt; &quot;puppet:\/\/\/module\/filename&quot;\r\n<\/code><\/pre>\n<p>but you can just use:<\/p>\n<pre><code>\r\nsource =&gt; &quot;\/usr\/local\/whatever\/in\/my\/local\/filesystem&quot;\r\n<\/code><\/pre>\n<p>That&#39;s great and it works just fine.<\/p>\n<h3>Custom facts<\/h3>\n<p>Puppet uses a utility called <b>facter<\/b> to extract &quot;facts&quot; from the underlying system, sysinfo-style. A typical facter run produces the following output:<\/p>\n<pre><code>\r\n$ facter\r\narchitecture =&gt; x86_64\r\ndomain =&gt; internal.opera.com\r\nfacterversion =&gt; 1.5.6\r\nfqdn =&gt; cd01.internal.opera.com\r\n...\r\nhardwaremodel =&gt; x86_64\r\nhostname =&gt; cd01\r\nid =&gt; cosimo\r\nipaddress =&gt; 10.20.30.40\r\nipaddress_eth0 =&gt; 10.20.30.40\r\nis_virtual =&gt; false\r\n...\r\nkernel =&gt; Linux\r\nkernelmajversion =&gt; 2.6\r\n...\r\noperatingsystem =&gt; Ubuntu\r\noperatingsystemrelease =&gt; 10.04\r\nphysicalprocessorcount =&gt; 1\r\nprocessor0 =&gt; Intel(R) Core(TM)2 Duo CPU     E6550  @ 2.33GHz\r\nprocessor1 =&gt; Intel(R) Core(TM)2 Duo CPU     E6550  @ 2.33GHz\r\nprocessorcount =&gt; 2\r\n...\r\n<\/code><\/pre>\n<p>and so on. Within puppet manifests, <b>you can use any of these facts<\/b> to influence the configuration of your system. For example, if <code>memorysize &gt; 4.0 Gb<\/code> then run varnish with 2000 threads instead of 1000. This is all very cool, but sometimes you need something that facter doesn&#39;t give you by default.<\/p>\n<p>That&#39;s why facter can be extended.<\/p>\n<p>I tried creating a <code>datacenter.rb<\/code> facter plugin that would look at the box IP address and figure out in which data center we&#39;re located. That in turn can be used to setup the nameservers and other stuff.<\/p>\n<p>Here&#39;s the code. My Ruby-fu is less than awesome:<\/p>\n<pre><code>\r\n#\r\n# Provide an additional &#39;datacenter&#39; fact\r\n# to use in generic modules to provide datacenter\r\n# specific settings, such as resolv.conf\r\n#\r\n# Cosimo, 03\/Aug\/2010\r\n#\r\n\r\nFacter.add(&quot;datacenter&quot;) do\r\n    setcode do\r\n\r\n        datacenter = &quot;unknown&quot;\r\n\r\n        # Get current ip address from Facter&#39;s own database\r\n        ipaddr = Facter.value(:ipaddress)\r\n\r\n        # Data center on Mars\r\n        if ipaddr.match(&quot;^88.88.88.&quot;)\r\n            datacenter = &quot;mars&quot;\r\n\r\n        # This one on Mercury\r\n        elsif ipaddr.match(&quot;^99.99.99.&quot;)\r\n            datacenter = &quot;mercury&quot;\r\n\r\n        # And on Jupiter\r\n        elsif ipaddr.match(&quot;^77.77.77.&quot;)\r\n            datacenter = &quot;jupiter&quot;\r\n        end\r\n\r\n        datacenter\r\n    end\r\nend\r\n<\/code><\/pre>\n<p>However, there&#39;s one problem. When puppet runs, it doesn&#39;t get the new fact, even though facter from the command line can see it and execute it just fine (when the plugin is in the current directory).<\/p>\n<p>Now I need to know how to inform puppet (and\/or facter) that it has to look into one of my puppet modules&#39; <code>plugin<\/code> (or <code>lib<\/code> from 0.25.x) directory to load my additional <code>datacenter.rb<\/code> fact.<\/p>\n<p>Any idea ??<\/p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>As I mentioned a few weeks ago, I&#39;m using Puppet for some smaller projects here at work. They&#39;re pilot projects to see how puppet behaves and scales for us before taking it into bigger challenges. One of the problems so far is that we&#39;re using fabric as the &quot;last-mile&quot; deployment tool, and that doesn&#39;t yet [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[388,231,347,390,260,389,76,60],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v22.9 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Puppet custom facts, and master-less puppet deployment - Random hacking<\/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.streppone.it\/cosimo\/blog\/2010\/08\/puppet-custom-facts-and-master-less-puppet-deployment\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Puppet custom facts, and master-less puppet deployment - Random hacking\" \/>\n<meta property=\"og:description\" content=\"As I mentioned a few weeks ago, I&#039;m using Puppet for some smaller projects here at work. They&#039;re pilot projects to see how puppet behaves and scales for us before taking it into bigger challenges. One of the problems so far is that we&#039;re using fabric as the &quot;last-mile&quot; deployment tool, and that doesn&#039;t yet [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.streppone.it\/cosimo\/blog\/2010\/08\/puppet-custom-facts-and-master-less-puppet-deployment\/\" \/>\n<meta property=\"og:site_name\" content=\"Random hacking\" \/>\n<meta property=\"article:published_time\" content=\"2010-08-03T19:01:51+00:00\" \/>\n<meta name=\"author\" content=\"cosimo\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"cosimo\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.streppone.it\/cosimo\/blog\/2010\/08\/puppet-custom-facts-and-master-less-puppet-deployment\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.streppone.it\/cosimo\/blog\/2010\/08\/puppet-custom-facts-and-master-less-puppet-deployment\/\"},\"author\":{\"name\":\"cosimo\",\"@id\":\"https:\/\/www.streppone.it\/cosimo\/blog\/#\/schema\/person\/c443bedbf6ecf99550d6395620801df1\"},\"headline\":\"Puppet custom facts, and master-less puppet deployment\",\"datePublished\":\"2010-08-03T19:01:51+00:00\",\"dateModified\":\"2010-08-03T19:01:51+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.streppone.it\/cosimo\/blog\/2010\/08\/puppet-custom-facts-and-master-less-puppet-deployment\/\"},\"wordCount\":582,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.streppone.it\/cosimo\/blog\/#\/schema\/person\/c443bedbf6ecf99550d6395620801df1\"},\"keywords\":[\"datacenter\",\"deployment\",\"facter\",\"master-less\",\"puppet\",\"puppetmasterd\",\"servers\",\"varnish\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.streppone.it\/cosimo\/blog\/2010\/08\/puppet-custom-facts-and-master-less-puppet-deployment\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.streppone.it\/cosimo\/blog\/2010\/08\/puppet-custom-facts-and-master-less-puppet-deployment\/\",\"url\":\"https:\/\/www.streppone.it\/cosimo\/blog\/2010\/08\/puppet-custom-facts-and-master-less-puppet-deployment\/\",\"name\":\"Puppet custom facts, and master-less puppet deployment - Random hacking\",\"isPartOf\":{\"@id\":\"https:\/\/www.streppone.it\/cosimo\/blog\/#website\"},\"datePublished\":\"2010-08-03T19:01:51+00:00\",\"dateModified\":\"2010-08-03T19:01:51+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.streppone.it\/cosimo\/blog\/2010\/08\/puppet-custom-facts-and-master-less-puppet-deployment\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.streppone.it\/cosimo\/blog\/2010\/08\/puppet-custom-facts-and-master-less-puppet-deployment\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.streppone.it\/cosimo\/blog\/2010\/08\/puppet-custom-facts-and-master-less-puppet-deployment\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.streppone.it\/cosimo\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Puppet custom facts, and master-less puppet deployment\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.streppone.it\/cosimo\/blog\/#website\",\"url\":\"https:\/\/www.streppone.it\/cosimo\/blog\/\",\"name\":\"Random hacking\",\"description\":\"Assume nothing. Code defensively. Keep it simple, stupid!\",\"publisher\":{\"@id\":\"https:\/\/www.streppone.it\/cosimo\/blog\/#\/schema\/person\/c443bedbf6ecf99550d6395620801df1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.streppone.it\/cosimo\/blog\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/www.streppone.it\/cosimo\/blog\/#\/schema\/person\/c443bedbf6ecf99550d6395620801df1\",\"name\":\"cosimo\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.streppone.it\/cosimo\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/cb1d938720df45a2720724aae99e3bfc?s=96&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/cb1d938720df45a2720724aae99e3bfc?s=96&r=g\",\"caption\":\"cosimo\"},\"logo\":{\"@id\":\"https:\/\/www.streppone.it\/cosimo\/blog\/#\/schema\/person\/image\/\"},\"url\":\"https:\/\/www.streppone.it\/cosimo\/blog\/author\/cosimo\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Puppet custom facts, and master-less puppet deployment - Random hacking","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.streppone.it\/cosimo\/blog\/2010\/08\/puppet-custom-facts-and-master-less-puppet-deployment\/","og_locale":"en_US","og_type":"article","og_title":"Puppet custom facts, and master-less puppet deployment - Random hacking","og_description":"As I mentioned a few weeks ago, I&#39;m using Puppet for some smaller projects here at work. They&#39;re pilot projects to see how puppet behaves and scales for us before taking it into bigger challenges. One of the problems so far is that we&#39;re using fabric as the &quot;last-mile&quot; deployment tool, and that doesn&#39;t yet [&hellip;]","og_url":"https:\/\/www.streppone.it\/cosimo\/blog\/2010\/08\/puppet-custom-facts-and-master-less-puppet-deployment\/","og_site_name":"Random hacking","article_published_time":"2010-08-03T19:01:51+00:00","author":"cosimo","twitter_card":"summary_large_image","twitter_misc":{"Written by":"cosimo","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.streppone.it\/cosimo\/blog\/2010\/08\/puppet-custom-facts-and-master-less-puppet-deployment\/#article","isPartOf":{"@id":"https:\/\/www.streppone.it\/cosimo\/blog\/2010\/08\/puppet-custom-facts-and-master-less-puppet-deployment\/"},"author":{"name":"cosimo","@id":"https:\/\/www.streppone.it\/cosimo\/blog\/#\/schema\/person\/c443bedbf6ecf99550d6395620801df1"},"headline":"Puppet custom facts, and master-less puppet deployment","datePublished":"2010-08-03T19:01:51+00:00","dateModified":"2010-08-03T19:01:51+00:00","mainEntityOfPage":{"@id":"https:\/\/www.streppone.it\/cosimo\/blog\/2010\/08\/puppet-custom-facts-and-master-less-puppet-deployment\/"},"wordCount":582,"commentCount":0,"publisher":{"@id":"https:\/\/www.streppone.it\/cosimo\/blog\/#\/schema\/person\/c443bedbf6ecf99550d6395620801df1"},"keywords":["datacenter","deployment","facter","master-less","puppet","puppetmasterd","servers","varnish"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.streppone.it\/cosimo\/blog\/2010\/08\/puppet-custom-facts-and-master-less-puppet-deployment\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.streppone.it\/cosimo\/blog\/2010\/08\/puppet-custom-facts-and-master-less-puppet-deployment\/","url":"https:\/\/www.streppone.it\/cosimo\/blog\/2010\/08\/puppet-custom-facts-and-master-less-puppet-deployment\/","name":"Puppet custom facts, and master-less puppet deployment - Random hacking","isPartOf":{"@id":"https:\/\/www.streppone.it\/cosimo\/blog\/#website"},"datePublished":"2010-08-03T19:01:51+00:00","dateModified":"2010-08-03T19:01:51+00:00","breadcrumb":{"@id":"https:\/\/www.streppone.it\/cosimo\/blog\/2010\/08\/puppet-custom-facts-and-master-less-puppet-deployment\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.streppone.it\/cosimo\/blog\/2010\/08\/puppet-custom-facts-and-master-less-puppet-deployment\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.streppone.it\/cosimo\/blog\/2010\/08\/puppet-custom-facts-and-master-less-puppet-deployment\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.streppone.it\/cosimo\/blog\/"},{"@type":"ListItem","position":2,"name":"Puppet custom facts, and master-less puppet deployment"}]},{"@type":"WebSite","@id":"https:\/\/www.streppone.it\/cosimo\/blog\/#website","url":"https:\/\/www.streppone.it\/cosimo\/blog\/","name":"Random hacking","description":"Assume nothing. Code defensively. Keep it simple, stupid!","publisher":{"@id":"https:\/\/www.streppone.it\/cosimo\/blog\/#\/schema\/person\/c443bedbf6ecf99550d6395620801df1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.streppone.it\/cosimo\/blog\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.streppone.it\/cosimo\/blog\/#\/schema\/person\/c443bedbf6ecf99550d6395620801df1","name":"cosimo","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.streppone.it\/cosimo\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/cb1d938720df45a2720724aae99e3bfc?s=96&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/cb1d938720df45a2720724aae99e3bfc?s=96&r=g","caption":"cosimo"},"logo":{"@id":"https:\/\/www.streppone.it\/cosimo\/blog\/#\/schema\/person\/image\/"},"url":"https:\/\/www.streppone.it\/cosimo\/blog\/author\/cosimo\/"}]}},"_links":{"self":[{"href":"https:\/\/www.streppone.it\/cosimo\/blog\/wp-json\/wp\/v2\/posts\/475"}],"collection":[{"href":"https:\/\/www.streppone.it\/cosimo\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.streppone.it\/cosimo\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.streppone.it\/cosimo\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.streppone.it\/cosimo\/blog\/wp-json\/wp\/v2\/comments?post=475"}],"version-history":[{"count":0,"href":"https:\/\/www.streppone.it\/cosimo\/blog\/wp-json\/wp\/v2\/posts\/475\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.streppone.it\/cosimo\/blog\/wp-json\/wp\/v2\/media?parent=475"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.streppone.it\/cosimo\/blog\/wp-json\/wp\/v2\/categories?post=475"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.streppone.it\/cosimo\/blog\/wp-json\/wp\/v2\/tags?post=475"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}