<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Shane Milton ☁️</title>
    <description>The latest articles on DEV Community by Shane Milton ☁️ (@jaxidian).</description>
    <link>https://dev.to/jaxidian</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F23511%2F07b4d860-8eca-450d-925a-8672d5466f83.jpeg</url>
      <title>DEV Community: Shane Milton ☁️</title>
      <link>https://dev.to/jaxidian</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jaxidian"/>
    <language>en</language>
    <item>
      <title>Test 230826</title>
      <dc:creator>Shane Milton ☁️</dc:creator>
      <pubDate>Sat, 26 Aug 2023 04:24:44 +0000</pubDate>
      <link>https://dev.to/jaxidian/test-230826-1gb3</link>
      <guid>https://dev.to/jaxidian/test-230826-1gb3</guid>
      <description>&lt;p&gt;230826.0024&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Hello, Terraform (on Azure)</title>
      <dc:creator>Shane Milton ☁️</dc:creator>
      <pubDate>Fri, 17 Jan 2020 22:22:13 +0000</pubDate>
      <link>https://dev.to/jaxidian/hello-terraform-on-azure-3f1f</link>
      <guid>https://dev.to/jaxidian/hello-terraform-on-azure-3f1f</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gwJElHGG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://res.cloudinary.com/jax/image/upload/c_lfill%2Ce_sharpen%2Ch_400%2Cw_760%2Cr_50/v1579295366/photo-of-man-and-woman-looking-at-the-sky-732894_ktrm0m.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gwJElHGG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://res.cloudinary.com/jax/image/upload/c_lfill%2Ce_sharpen%2Ch_400%2Cw_760%2Cr_50/v1579295366/photo-of-man-and-woman-looking-at-the-sky-732894_ktrm0m.jpg" width="760" height="400"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Hi Friends,&lt;/p&gt;

&lt;p&gt;One of the exciting new (to me) technologies I've started working with recently is a software called &lt;a href="https://www.terraform.io/"&gt;Terraform&lt;/a&gt; (by HashiCorp). This is an Infrastructure-as-Code (IaC) platform that greatly simplifies the process of provisioning cloud-based infrastructure in a reliable, predictable, and scalable way. Not only can you run this across different environments but it's code that can be committed to source control allowing you to also version your infrastructure design!&lt;/p&gt;

&lt;p&gt;I will be writing a multi-part series working with Terraform, specifically in the context of Azure. This post will just be an introduction to Terraform. In the next post, we'll make it actually do things! But first thing's first, we'll have a fairly lengthy post here covering the basics. I apologize for the wall of text here, but I wanted a single post to cover all of these basics for easy future reference.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Terraform?
&lt;/h2&gt;

&lt;p&gt;Okay, that's great. It automates stuff, but what is it really?&lt;/p&gt;

&lt;h3&gt;
  
  
  Flavors
&lt;/h3&gt;

&lt;p&gt;So there are a &lt;a href="https://www.hashicorp.com/products/terraform/pricing/"&gt;few different flavors of Terraform&lt;/a&gt;. Terraform Cloud is a fairly new offering (I believe it was just released last September) that offers a few niceties, but everything I'll be looking at in this series will be focused on the free offering.&lt;/p&gt;

&lt;h3&gt;
  
  
  Free as in beer?
&lt;/h3&gt;

&lt;p&gt;Nope! Free as in speech.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/hashicorp/terraform"&gt;open source offering that anybody can use&lt;/a&gt; is what we'll be using (licensed via the &lt;a href="https://github.com/hashicorp/terraform/blob/master/LICENSE"&gt;Mozilla Public License 2.0&lt;/a&gt; copyleft license). The paid options have some managed services that allow you to centralize things in a certain way and avoid console windows a bit more, but we'll use Azure Blob storage for our centralization and we'll just use the CLI to run our code. Don't worry, the CLI is easy pretty easy to work with.&lt;/p&gt;

&lt;h3&gt;
  
  
  But really, what is it?
&lt;/h3&gt;

&lt;p&gt;So if you download and install Terraform, well, you've already failed. Terraform doesn't have an installer. The downloads are just simple binaries that you execute. The Windows &lt;code&gt;.exe&lt;/code&gt; (which is what I use) is a 16MB &lt;code&gt;.zip&lt;/code&gt; file with a 16MB &lt;code&gt;.exe&lt;/code&gt; file inside of it. You put it where you want and manage your &lt;code&gt;PATH&lt;/code&gt; however you want so you can call it.&lt;/p&gt;

&lt;p&gt;This &lt;code&gt;.exe&lt;/code&gt; file executes scripts called &lt;strong&gt;HCL&lt;/strong&gt; (this stands for &lt;em&gt;HashiCorp Configuration Language&lt;/em&gt;). HCL is a custom markup language that appears very similar to JSON at first glance, but is a bit different. I believe you can even use JSON but we'll be using HCL in this series.&lt;/p&gt;

&lt;p&gt;HCL scripts (I'm not sure if "scripts" is the proper term here but I'm gonna go with it - remember, I'm new to this tech, so I can make mistakes!) contain configuration information about dependencies, connections, and structure. Terraform uses these to make changes to your infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Basics of Terraform
&lt;/h2&gt;

&lt;p&gt;HashiCorp has a pretty good &lt;a href="https://learn.hashicorp.com/terraform/getting-started/install.html"&gt;Getting Started guide&lt;/a&gt;. Unfortunately, everything there focuses on AWS and not Azure. Feel free to use that guide as well, but I will additionally address some Azure concerns that you would otherwise have to piece together from other sources.&lt;/p&gt;

&lt;h3&gt;
  
  
  Providers
&lt;/h3&gt;

&lt;p&gt;These are independently developed and maintained packages that provide functionality. You see, Terraform by itself doesn't know how to build infrastructure. It's just the engine to run these providers who know how to actually &lt;strong&gt;do stuff&lt;/strong&gt; (sometimes it's a connector to do cloud things, sometimes it's an RNG).&lt;/p&gt;

&lt;p&gt;There is a &lt;a href="https://www.terraform.io/docs/providers/index.html"&gt;public repository of Providers&lt;/a&gt; that you can use, but there are also private third-party providers out there as well. The AzureRM (Azure Resource Manager) provider will be one of the most important ones we use during this series.&lt;/p&gt;

&lt;h3&gt;
  
  
  Resources
&lt;/h3&gt;

&lt;p&gt;These are the things you're managing. A VM? A VNET? An IP? A password? A Key Vault? These are just a few examples of resources.&lt;/p&gt;

&lt;h3&gt;
  
  
  State
&lt;/h3&gt;

&lt;p&gt;Consider a few examples:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;If I have HCL that tries to create a VM and I run that twice, it would be nice for it to not create a second VM but instead realize that the VM it's managing already exists and doesn't try again. Idempotency is good for our sanity!&lt;/li&gt;
&lt;li&gt;If I have HCL create a VM then I edit that HCL to also put a NIC on that VM, it would be nice for Terraform to realize on the next execution that the VM exists but is missing a NIC that needs to be added.&lt;/li&gt;
&lt;li&gt;If I do the above and commit my HCL to git before somebody else (on a different dev workstation) takes that HCL and removes the NIC, it would be nice for Terraform on the next execution to be aware that the HCL previously was managing a NIC that has since been deleted from the HCL, so it knows it needs to also remove the NIC from the VM in Azure.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;All of these things require some level of knowledge of the state of the infrastructure, the &lt;strong&gt;history&lt;/strong&gt; of the state, all while coordinating across multiple machines. Terraform's State information allows us to do this. In a best-practice scenario, this state is centrally stored, locked, synced, and versioned. Once you add version control, CI/CD servers, and multiple environments based on your company's topology (Prod/Staging/QA/Test/Dev/etc), state management becomes a critical piece of the puzzle!&lt;/p&gt;

&lt;h3&gt;
  
  
  Input Variables
&lt;/h3&gt;

&lt;p&gt;If you're a software developer, you can probably guess what these are by the name. These are used throughout the execution of the HCL and only actually affect infrastructure if the HCL chooses to use a variable to do so. They can be used for passing configuration/information around and for abstracting things to make them reusable (just like a function or constructor has in most coding languages).&lt;/p&gt;

&lt;h3&gt;
  
  
  Data Sources
&lt;/h3&gt;

&lt;p&gt;These are like "unmanaged Resources". They can represent things in your infrastructure but your HCL does not manage these things. Instead, they can query the state of certain infrastructure things and store that state in a Data Source.&lt;/p&gt;

&lt;p&gt;For example, if I'm provisioning a VM and putting it on an existing network, my VM and NIC would be examples of resources but I might need to query an existing VNET to get some DNS and subnet information to configure my VM and NIC to use.&lt;/p&gt;

&lt;h3&gt;
  
  
  Output Variables
&lt;/h3&gt;

&lt;p&gt;If you were able to guess what an input variable is, you can also guess what an output variable is. You put information into these and it gets passed out for other things to use. Sometimes they're very important for functional purposes (i.e. an RNG needs to output the generated number) and other times they're just informational and not terribly important most of the time (i.e. something might output the duration it took to finish provisioning some infrastructure component).&lt;/p&gt;

&lt;h3&gt;
  
  
  Other stuff
&lt;/h3&gt;

&lt;p&gt;We'll ignore most of the other things &lt;em&gt;for now&lt;/em&gt;. We'll introduce the more advanced topics (such as workspaces, modules, and more) once we've mastered these basics.&lt;/p&gt;

&lt;h2&gt;
  
  
  In the next edition of this series, we'll learn the following things:
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;How to authenticate and connect to Azure.&lt;/li&gt;
&lt;li&gt;How to build up a Key Vault and SQL database, using a random SA password stored securely in the Key Vault.&lt;/li&gt;
&lt;li&gt;How to tear down that server, database, and vault.&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;Sources:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cover Image: Photo by &lt;a href="https://www.pexels.com/photo/photo-of-man-and-woman-looking-at-the-sky-732894/"&gt;Jake Young from Pexels&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>terraform</category>
      <category>azure</category>
    </item>
    <item>
      <title>New Year, New Things!</title>
      <dc:creator>Shane Milton ☁️</dc:creator>
      <pubDate>Fri, 17 Jan 2020 20:06:33 +0000</pubDate>
      <link>https://dev.to/jaxidian/new-year-new-things-18dm</link>
      <guid>https://dev.to/jaxidian/new-year-new-things-18dm</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kL1jryst--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://res.cloudinary.com/jax/image/upload/c_lfill%2Ce_sharpen%2Ch_400%2Cw_760%2Cr_50/v1579285695/photo-of-2020-on-pink-background-3401900_h2gdhb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kL1jryst--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://res.cloudinary.com/jax/image/upload/c_lfill%2Ce_sharpen%2Ch_400%2Cw_760%2Cr_50/v1579285695/photo-of-2020-on-pink-background-3401900_h2gdhb.png" width="760" height="400"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Hi Friends,&lt;/p&gt;

&lt;p&gt;I hope the new year is going well for you! With this new year, I now have a new blog and, more excitingly, an exciting new job!&lt;/p&gt;

&lt;h2&gt;
  
  
  My new friends at &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Vcg7Ru4l--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://res.cloudinary.com/jax/image/upload/c_lfill%2Ch_30%2Cw_70/v1579289056/CleanSlate-Logo-for-Blog_q7uh7d.png" alt="CleanSlate Logo" width="70" height="30"&gt;CleanSlate
&lt;/h2&gt;

&lt;p&gt;So first, the exciting thing. I have now been a Technical Architect (I think that's my title) at CleanSlate Technology Group (you'll see me refer to them as either &lt;em&gt;CleanSlate&lt;/em&gt; or &lt;em&gt;CSTG&lt;/em&gt;). I'm going to be doing many of the same things I've done before with cloud-hosted enterprise systems (and more!), but I will be doing this with some really talented people at CleanSlate.&lt;/p&gt;

&lt;p&gt;One of the many things I'm excited about is that I will help to begin growing CleanSlate's Azure practice in 2020. The company has been doing some really great things the past couple years in the AWS space but have been lacking in experience in Azure. This is a big reason why I'm here! I hope to write about some of the great things we learn during this process!&lt;/p&gt;

&lt;p&gt;By the way, did I mention that there are some great people here? I have now only billed ~20 hours towards a legitimate project yet I have learned so many things already from the team I'm surrounded with! One of the technologies I'm quickly learning is Terraform - I'll soon have a series of posts on using this in Azure!&lt;/p&gt;

&lt;p&gt;One more thing: I plan to be posting on here quite regularly. I know I've said this before but this is actually a part of my job at CleanSlate that I have time set aside to do precisely this, which is incredibly badass!&lt;/p&gt;

&lt;h2&gt;
  
  
  New Blog
&lt;/h2&gt;

&lt;p&gt;If you haven't noticed, this is a new blog! Welcome to &lt;a href="https://words.Jax.io"&gt;words.Jax.io&lt;/a&gt;! I might change this domain a bit in the next week or so, but welcome nonetheless!&lt;/p&gt;

&lt;p&gt;I don't yet have my history imported but that's mostly because I've been struggling with getting it in with the correct metadata (I don't want 100 posts all showing up as having been published today!). I've been waiting to post this until I got that all in here but I finally decided to just go ahead and move forward with the new content and deal with the old content some other time.&lt;/p&gt;

&lt;p&gt;I'll make a detailed post about the tech stack I'm using for this but for now, the short version is that it involves &lt;a href="https://github.com/"&gt;Github&lt;/a&gt;, &lt;a href="https://dev.to/"&gt;Dev.to&lt;/a&gt;, &lt;a href="https://www.stackbit.com/"&gt;StackBit&lt;/a&gt;, &lt;a href="https://www.netlify.com/"&gt;Netlify&lt;/a&gt;, &lt;a href="https://cloudinary.com/"&gt;Cloudinary&lt;/a&gt; and some static site generators &amp;amp; themes. I want to shuffle things around a little bit but this is good enough to start moving with! If you can't wait, then check out these two posts (&lt;a href="https://dev.to/connecting-with-stackbit"&gt;1&lt;/a&gt;, &lt;a href="https://johnpapa.net/how-i-write-online-articles/"&gt;2&lt;/a&gt;) and that'll get you started in the direction I'm going.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cheers! Here's to a great 2020 for us all! 🥂
&lt;/h3&gt;




&lt;p&gt;Sources:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cover Image: Photo by &lt;a href="https://www.pexels.com/photo/photo-of-2020-on-pink-background-3401900/"&gt;cottonbro from Pexels&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devrel</category>
      <category>markdown</category>
      <category>career</category>
      <category>blog</category>
    </item>
  </channel>
</rss>
