{"id":377,"date":"2020-01-21T01:17:05","date_gmt":"2020-01-21T01:17:05","guid":{"rendered":"https:\/\/bootstrap-it.com\/blog\/?p=377"},"modified":"2020-01-21T01:17:05","modified_gmt":"2020-01-21T01:17:05","slug":"how-to-use-ansible-to-manage-your-aws-resources","status":"publish","type":"post","link":"https:\/\/bootstrap-it.com\/blog\/?p=377","title":{"rendered":"How to Use Ansible to Manage Your AWS Resources"},"content":{"rendered":"<div id=\"s-share-buttons\" class=\"horizontal-w-c-circular s-share-w-c\"><a href=\"http:\/\/www.facebook.com\/sharer.php?u=https:\/\/bootstrap-it.com\/blog\/?p=377\" target=\"_blank\" title=\"Share to Facebook\" class=\"s3-facebook hint--top\"><\/a><a href=\"http:\/\/twitter.com\/intent\/tweet?text=How to Use Ansible to Manage Your AWS Resources&url=https:\/\/bootstrap-it.com\/blog\/?p=377\" target=\"_blank\"  title=\"Share to Twitter\" class=\"s3-twitter hint--top\"><\/a><a href=\"http:\/\/reddit.com\/submit?url=https:\/\/bootstrap-it.com\/blog\/?p=377&title=How to Use Ansible to Manage Your AWS Resources\" target=\"_blank\" title=\"Share to Reddit\" class=\"s3-reddit hint--top\"><\/a><a href=\"http:\/\/www.linkedin.com\/shareArticle?mini=true&url=https:\/\/bootstrap-it.com\/blog\/?p=377\" target=\"_blank\" title=\"Share to LinkedIn\" class=\"s3-linkedin hint--top\"><\/a><a href=\"mailto:?Subject=How%20to%20Use%20Ansible%20to%20Manage%20Your%20AWS%20Resources&Body=Here%20is%20the%20link%20to%20the%20article:%20https:\/\/bootstrap-it.com\/blog\/?p=377\" title=\"Email this article\" class=\"s3-email hint--top\"><\/a><\/div>\n<p>Wouldn&#8217;t you love to be able to simply wave a wand and layers of resources in your AWS account would suddenly &#8211; and magically &#8211; spring to perfectly configured life, ready to meet your complex infrastructure needs?<\/p>\n\n\n\n<p>If you already have experience with AWS, then you know how much of a pain it can be to work through web page after web page in the Amazon management console as you manually provision services. And even the AWS CLI &#8211; which is a huge step up &#8211; can add its own complexity and effort to the mix.<\/p>\n\n\n\n<p>That&#8217;s not to say that AWS itself doesn&#8217;t address the problem with their own class of powerful orchestration tools, including CloudFormation and their Elastic Kubernetes Service (something I address at length in&nbsp;<a href=\"https:\/\/pluralsight.pxf.io\/nZgKx\">my &#8220;Using Docker on AWS&#8221; course at Pluralsight<\/a>). But neither of those options lives quite so close to your existing infrastructure &#8211; or uses as familiar a way of operating &#8211; as Ansible.<\/p>\n\n\n\n<p>If you&#8217;re already using Ansible for your on-premises operations, plugging it into your AWS account can sometimes be the quickest and most painless way to migrate operations to the cloud.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"understanding-the-ansible-aws-advantage\">Understanding the Ansible\/AWS Advantage<\/h3>\n\n\n\n<p>My book &#8220;<a href=\"https:\/\/www.amazon.com\/gp\/product\/B07YK42ZH1\/ref=as_li_tl?ie=UTF8&amp;camp=1789&amp;creative=9325&amp;creativeASIN=B07YK42ZH1&amp;linkCode=as2&amp;tag=projemun-20&amp;linkId=d90b5a553223444f00992afa4c8f8d16\">Manage AWS Resources Using Ansible<\/a>&#8221; &#8211; from which this article is excerpted &#8211; is designed to quickly introduce you to applying Ansible&#8217;s&nbsp;<em>declarative<\/em>&nbsp;approach to working with AWS resources. Being able to &#8220;declare&#8221; the precise configuration results you want and then produce them by getting Ansible to read a playbook is Ansible&#8217;s magic wand. When properly planned, it&#8217;s amazing how simple it can be to execute complex, layered AWS deployments.<\/p>\n\n\n\n<p>Before we launch a simple &#8220;Hello World&#8221; Ansible playbook, let&#8217;s first make sure you&#8217;ve got a properly-configured working environment through which Ansible can communicate with all its new friends in your AWS account.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"preparing-a-local-environment\">Preparing a Local Environment<\/h3>\n\n\n\n<p>As you probably already know, Ansible is an orchestration tool that lets you write plain-text&nbsp;<em>playbook<\/em>&nbsp;files that&nbsp;<em>declare<\/em>&nbsp;the software profile and ideal state you&#8217;d like applied to a target server. Those servers &#8211; known as hosts &#8211; can be provisioned for just about any digital workload you can imagine, using just about any combination of application software, and running on just about any platform.<\/p>\n\n\n\n<p>In the good old days, when a playbook was run against a physical server, Ansible would employ an existing SSH connection to securely login to the remote host and go about building your application. But that won&#8217;t work for AWS workloads. You see, because the EC2 instances and other infrastructure you want to launch don&#8217;t yet exist, there can be no &#8220;existing&#8221; SSH connections. Instead, Ansible will use Boto 3 &#8211; the software development kit (or SDK) used by AWS that allows Python code to communicate with the AWS API.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"using-the-aws-cli-to-connect-ansible\">Using the AWS CLI to Connect Ansible<\/h3>\n\n\n\n<p>You don&#8217;t have to know how all that works, but it has to be there so it&nbsp;<em>can<\/em>&nbsp;work. For that reason you&#8217;re going to install the AWS command line interface (CLI). We won&#8217;t be using the CLI itself for anything important, but installing it will give us all the dependencies we&#8217;ll need. You can find out how to make this work on the latest version of whatever OS you&#8217;re using from the&nbsp;<a href=\"https:\/\/docs.aws.amazon.com\/cli\/latest\/userguide\/cli-chap-install.html\">AWS documentation page<\/a>.<\/p>\n\n\n\n<p>Working with the Python package manager, PIP, is a popular way to get all this done. Here&#8217;s how you would install PIP itself and then the AWS CLI on an Ubuntu machine:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt update\nsudo apt install python3-pip\npip3 install awscli<\/code><\/pre>\n\n\n\n<p>I should note that, as I write this, Python 2 is still alive&#8230;but only just. So there might sometimes still be separate Python 2 and Python 3 versions installed on your system. Since Python 2 will soon be fully deprecated, you probably won&#8217;t have to worry about specifying python3 or pip3 with your commands: that should be automatic.<\/p>\n\n\n\n<p>Once the CLI is installed, run&nbsp;<code>aws configure<\/code>&nbsp;and enter your AWS access key ID and secret access key.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>aws configure\ncat .aws\/credentials<\/code><\/pre>\n\n\n\n<p>You can get keys from the Your Security Credentials page in the AWS Management Console. Here&#8217;s how those keys will look (don&#8217;t get any naughty ideas, these aren&#8217;t valid):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>AccessKeyId: AKIALNZTQW6H3EFBRLHQ\nSecretAccessKey: f26B8touguUBELGpdyCyc9o0ZDzP2MEUWNC0JNwA<\/code><\/pre>\n\n\n\n<p>Just remember that a pair of keys issued to the root user of your AWS account provides full access to your entire AWS account. Anyone in possession of those credentials would be quickly able to run up six and even seven figure services charges, so be&nbsp;<em>very<\/em>&nbsp;careful how you use and store them. Ideally, you would be better off limiting your risk exposure by creating an admin user in the AWS Identify and Access Management (IAM) service with limited powers and using a key issued to that user.<\/p>\n\n\n\n<p>At any rate, why am I doing this? The value of populating my AWS credentials file is that Ansible is smart enough to look for it and, if no other authentication keys are available in the system environment, it&#8217;ll use these. You&#8217;ll soon see how mighty convenient that will be. However, you should be aware of other ways to manage authentication for Ansible playbooks, like using&nbsp;<em>ansible-vault<\/em>&nbsp;or by creating and then invoking an aws_keys.yml file. But one thing you should definitely NOT do is hardcode the keys in your playbook files &#8211; especially if you plan to push them to an online repository like GitHub. I&#8217;ll quickly test the CLI to make sure we can properly connect to AWS. This simple command will list any S3 buckets I happen to have within this account.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>aws s3 ls<\/code><\/pre>\n\n\n\n<p>We&#8217;re now ready to install ansible. I&#8217;ll go with pip3 for that. I could use the regular Ubuntu apt repository just as easily, but it will most likely install a slightly older version. Depending on your network connection, that&#8217;ll take a minute or two, but I&#8217;ll skip most of that.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ pip3 install ansible\n<\/code><\/pre>\n\n\n\n<p>I&#8217;ll confirm that it&#8217;s properly installed by running ansible &#8211;version. This shows us the version that was built, that configured Ansible modules will, by default, be saved in either one of these two locations in the file system, that other modules would be available here and &#8211; most importantly &#8211; that the Ansible executable is located within the \/local\/bin\/ directory beneath my user&#8217;s home directory. My user here, by the way, is called ubuntu. You can also see that we&#8217;re using a nice, up-to-date version of Python 3.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ ansible --version\nansible 2.8.5\n  config file = None\n  configured module search path = \n    ['\/home\/ubuntu\/.ansible\/plugins\/modules', \n    '\/usr\/share\/ansible\/plugins\/modules']\n  ansible python module location = \n    \/home\/ubuntu\/.local\/lib\/python3.6\/site-packages\/ansible\n  executable location = \/home\/ubuntu\/.local\/bin\/ansible\n  python version = 3.6.8 (default, Aug 20 2019, 17:12:48) [GCC 8.3.0]\n<\/code><\/pre>\n\n\n\n<p>One more step. As I mentioned earlier, Ansible will connect to AWS using the boto SDK. So we&#8217;ll need to install the boto and boto 3 packages. I&#8217;ll go with PIP for this one, too.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ pip3 install boto boto3\n<\/code><\/pre>\n\n\n\n<p>Once that one has been brought on board, we&#8217;ll be ready to get some real stuff done. That&#8217;ll begin in the next section.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"testing-ansible-with-a-simple-playbook\">Testing Ansible with a Simple Playbook<\/h2>\n\n\n\n<p>This is going to be very simple proof of concept demo. I&#8217;ll create a couple of files, walk you through the syntax, and then fire it up. First off, I&#8217;ll use any plain text editor to create a&nbsp;<em>hosts<\/em>&nbsp;file. Normally, the hosts file tells Ansible where it can find the remote servers you want to provision. But since, in the case of AWS, the resources that will be our hosts don&#8217;t yet exist, we&#8217;ll simply point Ansible to localhost and boto will handle connections behind the scenes. Here&#8217;s what the contents of that file will look like:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>[local]\nlocalhost\n<\/code><\/pre>\n\n\n\n<p>Next, I&#8217;ll create a playbook file that I&#8217;ll call test-ansible.yml. The yml extension, of course, indicates that this file must be formatted using YAML markup language syntax. As you can see from the file text I&#8217;ve pasted just below, that&#8217;ll begin with three dashes marking the start of the file and then an indented dash introducing a set of definitions. The value of &#8220;hosts&#8221; could be one or more remote computers but, as I&#8217;ve said, we&#8217;ll leave that up to the local system to figure out. The same goes for our connection.<\/p>\n\n\n\n<p>The next section includes the&nbsp;<em>tasks<\/em>&nbsp;we want Ansible to perform. This one will use the aws_s3 module to&nbsp;<em>create<\/em>&nbsp;a new bucket on Amazon&#8217;s S3 Simple Storage Service in the us-east-1 region. I have to give it this ugly name because S3 buckets require globally unique names &#8211; if a name you choose clashes with any one of the countless millions of names already out there, the operation will fail.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>---\n  - name: Test s3\n    hosts: local\n    connection: local\n\n    tasks:\n      - name: Create new bucket\n        aws_s3:\n          bucket: testme817275b\n          mode: create\n          region: us-east-1\n<\/code><\/pre>\n\n\n\n<p>I run the playbook by calling the ansible-playbook command using -i to specify the hosts file, and then pointing to the test.yml file. Ansible should give us some feedback in just a moment or two. If we&#8217;re successful, you&#8217;ll see &#8220;0&#8221; as the value of &#8220;failed&#8221; and at least &#8220;1&#8221; as the value of &#8220;ok&#8221;.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ ansible-playbook -i hosts test-ansible.yml\nPLAY [Test s3] ******************************************************\n\nTASK [Create new bucket] ********************************************\n\nchanged: [localhost]\n\nPLAY RECAP **********************************************************\nlocalhost: ok=1    changed=1    unreachable=0    failed=0   skipped=0\n    rescued=0    ignored=0 \n<\/code><\/pre>\n\n\n\n<p>If I check my list of buckets once more, I should &#8211; and do &#8211; see the new one:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ aws s3 ls\n2018-12-30 15:19:24 elasticbeanstalk-us-east-1-297972716276\n2018-10-12 04:09:37 mysite548.com\n2019-09-24 15:53:26 testme817275b\n<\/code><\/pre>\n\n\n\n<p>That&#8217;s a very brief intro to setting up an Ansible environment. We saw how using Ansible with Amazon&#8217;s automatically provisioned resources is going to work differently than it would with traditional Ansible hosts. You&#8217;re going to require a different set of authentication and inventory control tools. We walked through the process of setting up an Ansible environment and connecting it to AWS, and then running a simple playbook. Short and sweet.<\/p>\n\n\n\n<p>This article comes from my book &#8220;<a href=\"https:\/\/www.amazon.com\/gp\/product\/B07YK42ZH1\/ref=as_li_tl?ie=UTF8&amp;camp=1789&amp;creative=9325&amp;creativeASIN=B07YK42ZH1&amp;linkCode=as2&amp;tag=projemun-20&amp;linkId=d90b5a553223444f00992afa4c8f8d16\">Manage AWS Resources Using Ansible<\/a>&#8220;. There&#8217;s more technology goodness &#8211; in the form of books, courses, and articles &#8211; available on my&nbsp;<a href=\"https:\/\/bootstrap-it.com\/\">website, bootstrap-it.com<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wouldn&#8217;t you love to be able to simply wave a wand and layers of resources in your AWS account would suddenly &#8211; and magically &#8211; spring to perfectly configured life, ready to meet your complex infrastructure needs? If you already&hellip; <a href=\"https:\/\/bootstrap-it.com\/blog\/?p=377\" class=\"more-link\">Continue Reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":378,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-377","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.2.1 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>How to Use Ansible to Manage Your AWS Resources - Bootstrap IT<\/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:\/\/bootstrap-it.com\/blog\/?p=377\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How to Use Ansible to Manage Your AWS Resources - Bootstrap IT\" \/>\n<meta property=\"og:description\" content=\"Wouldn&#8217;t you love to be able to simply wave a wand and layers of resources in your AWS account would suddenly &#8211; and magically &#8211; spring to perfectly configured life, ready to meet your complex infrastructure needs? If you already&hellip; Continue Reading &rarr;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/bootstrap-it.com\/blog\/?p=377\" \/>\n<meta property=\"og:site_name\" content=\"Bootstrap IT\" \/>\n<meta property=\"article:published_time\" content=\"2020-01-21T01:17:05+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/bootstrap-it.com\/blog\/wp-content\/uploads\/monitoring-1.png\" \/>\n\t<meta property=\"og:image:width\" content=\"640\" \/>\n\t<meta property=\"og:image:height\" content=\"640\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"dbclin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@davidbclinton\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"dbclin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/bootstrap-it.com\/blog\/?p=377\",\"url\":\"https:\/\/bootstrap-it.com\/blog\/?p=377\",\"name\":\"How to Use Ansible to Manage Your AWS Resources - Bootstrap IT\",\"isPartOf\":{\"@id\":\"https:\/\/bootstrap-it.com\/blog\/#website\"},\"datePublished\":\"2020-01-21T01:17:05+00:00\",\"dateModified\":\"2020-01-21T01:17:05+00:00\",\"author\":{\"@id\":\"https:\/\/bootstrap-it.com\/blog\/#\/schema\/person\/ae0fb1d5b3b01558b92b6426d77766ec\"},\"breadcrumb\":{\"@id\":\"https:\/\/bootstrap-it.com\/blog\/?p=377#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/bootstrap-it.com\/blog\/?p=377\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/bootstrap-it.com\/blog\/?p=377#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/bootstrap-it.com\/blog\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How to Use Ansible to Manage Your AWS Resources\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/bootstrap-it.com\/blog\/#website\",\"url\":\"https:\/\/bootstrap-it.com\/blog\/\",\"name\":\"Bootstrap IT\",\"description\":\"Learn technology using technology\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/bootstrap-it.com\/blog\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/bootstrap-it.com\/blog\/#\/schema\/person\/ae0fb1d5b3b01558b92b6426d77766ec\",\"name\":\"dbclin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/bootstrap-it.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/a93785d437350478a7f1dfcbec58d26bc28e0124e405179acbe1b4325c09f90a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/a93785d437350478a7f1dfcbec58d26bc28e0124e405179acbe1b4325c09f90a?s=96&d=mm&r=g\",\"caption\":\"dbclin\"},\"sameAs\":[\"http:\/\/bootstrap-it.com\/\",\"dbclinton\",\"https:\/\/twitter.com\/davidbclinton\"],\"url\":\"https:\/\/bootstrap-it.com\/blog\/?author=1\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"How to Use Ansible to Manage Your AWS Resources - Bootstrap IT","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:\/\/bootstrap-it.com\/blog\/?p=377","og_locale":"en_US","og_type":"article","og_title":"How to Use Ansible to Manage Your AWS Resources - Bootstrap IT","og_description":"Wouldn&#8217;t you love to be able to simply wave a wand and layers of resources in your AWS account would suddenly &#8211; and magically &#8211; spring to perfectly configured life, ready to meet your complex infrastructure needs? If you already&hellip; Continue Reading &rarr;","og_url":"https:\/\/bootstrap-it.com\/blog\/?p=377","og_site_name":"Bootstrap IT","article_published_time":"2020-01-21T01:17:05+00:00","og_image":[{"width":640,"height":640,"url":"https:\/\/bootstrap-it.com\/blog\/wp-content\/uploads\/monitoring-1.png","type":"image\/png"}],"author":"dbclin","twitter_card":"summary_large_image","twitter_creator":"@davidbclinton","twitter_misc":{"Written by":"dbclin","Est. reading time":"9 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/bootstrap-it.com\/blog\/?p=377","url":"https:\/\/bootstrap-it.com\/blog\/?p=377","name":"How to Use Ansible to Manage Your AWS Resources - Bootstrap IT","isPartOf":{"@id":"https:\/\/bootstrap-it.com\/blog\/#website"},"datePublished":"2020-01-21T01:17:05+00:00","dateModified":"2020-01-21T01:17:05+00:00","author":{"@id":"https:\/\/bootstrap-it.com\/blog\/#\/schema\/person\/ae0fb1d5b3b01558b92b6426d77766ec"},"breadcrumb":{"@id":"https:\/\/bootstrap-it.com\/blog\/?p=377#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/bootstrap-it.com\/blog\/?p=377"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/bootstrap-it.com\/blog\/?p=377#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/bootstrap-it.com\/blog"},{"@type":"ListItem","position":2,"name":"How to Use Ansible to Manage Your AWS Resources"}]},{"@type":"WebSite","@id":"https:\/\/bootstrap-it.com\/blog\/#website","url":"https:\/\/bootstrap-it.com\/blog\/","name":"Bootstrap IT","description":"Learn technology using technology","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/bootstrap-it.com\/blog\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/bootstrap-it.com\/blog\/#\/schema\/person\/ae0fb1d5b3b01558b92b6426d77766ec","name":"dbclin","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/bootstrap-it.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/a93785d437350478a7f1dfcbec58d26bc28e0124e405179acbe1b4325c09f90a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/a93785d437350478a7f1dfcbec58d26bc28e0124e405179acbe1b4325c09f90a?s=96&d=mm&r=g","caption":"dbclin"},"sameAs":["http:\/\/bootstrap-it.com\/","dbclinton","https:\/\/twitter.com\/davidbclinton"],"url":"https:\/\/bootstrap-it.com\/blog\/?author=1"}]}},"_links":{"self":[{"href":"https:\/\/bootstrap-it.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/377","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bootstrap-it.com\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/bootstrap-it.com\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/bootstrap-it.com\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/bootstrap-it.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=377"}],"version-history":[{"count":1,"href":"https:\/\/bootstrap-it.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/377\/revisions"}],"predecessor-version":[{"id":379,"href":"https:\/\/bootstrap-it.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/377\/revisions\/379"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/bootstrap-it.com\/blog\/index.php?rest_route=\/wp\/v2\/media\/378"}],"wp:attachment":[{"href":"https:\/\/bootstrap-it.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=377"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/bootstrap-it.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=377"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/bootstrap-it.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=377"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}