I have been playing around with ChatGPT for the last week or so (along with everyone else in the world) and it’s pretty amazing. I have managed to stump it a few times and get some odd answers back but for the most part, no matter the topic, it comes back with interesting, typically well written, and almost always helpful answers. I have given it fairly complex prompts to write Terraform code for Azure – then asked it to modify and expand that code with additional enhancements. It pulled it all off without a hitch. It’s still “basic” code (not dynamic/modular/yada-yada) to be sure but it’s solid and helpful. Ditto with Bash. But the truly impressive thing (to me) was when I asked it to accomplish the same Terraform build but do so with Bash and CURL calls to the Azure API… and then convert that to Python. ChatGPT did all of this without missing a beat -> “mind somewhat blown”.
I also enjoy reading/studying the Bible and theology – turns out it is a decent companion tool for that endeavor as well. It can summarize passages, answer historical questions, even “speculate” a bit and give opposing viewpoints when asked. I must admit this series of interactions had me experiencing the “uncanny valley” phenomenon a bit.
Anyhow, I thought it all so interesting that I just wanted to write about it. But then I realized, what better way to write about ChatGPT then to give it a few prompts about my impressions and have it write a short blog post by itself… in the style of William Shakespeare… because, why not?
I recently purchased an Asus Zephyrus G15 (2021) laptop with a Ryzen 9 5900HS processor and RTX 3070 GPU. I really enjoy the light weight, relatively diminutive size and curiously long battery life of this machine which also packs a performance punch when needed. However, one thing I was not prepared for was Asus and their lackluster firmware/drivers/etc. for basic things like the keyboard. I don’t want to turn this into a long post because if you show up on this page you are probably just looking for the fix. So to keep it short… (more…)
My work frequently involves using remote, ephemeral, containers to run scripts/code/whatever for DevOps type automation. Typically these containers are running some flavor of Linux. My work also frequently involves designing these automations for Azure and using Terraform for IaC. On occasion though, I find the need to drop out of “declarative” mode and utilize scripted imperative actions to make dynamic changes at run time. I frequently lean on either using the remote-exec provisioner with a null resource -or- if I really need my script to run during the Terraform plan phase, I will use the special external data source.
All that said, this article isn’t really focused on Terraform per se’ or the usage of those methods. Perhaps at some point in the future I will have an opportunity to do some write-ups on the topic of using run-time scripts. Rather, this is much more narrowly focused on how to interact and affect changes in Azure using the ARM API using commonly available tools on most runners like BASH and CURL. (more…)
Working with Terraform to build VM’s in Azure for proof-of-concept work, I often opt to use Ubuntu for my Linux systems. Up until 18.04 everything worked fine but when I tried to go to 20.04 or later my Terraform deployment would error out with:
Failure sending request: StatusCode=404 -- Original Error: Code="PlatformImageNotFound" Message="The platform image 'Canonical:UbuntuServer:20.04-lts:latest' is not available. Verify that all fields in the storage profile are correct.
Did Microsoft suddenly fall behind the curve with available OS images for one of the world’s most popular operating systems?
Thankfully, no. The answer is actually pretty simple… they just started breaking out different versions of the popular operating systems under different ‘offer’ families and your Terraform code needs to reflect as much.
Working with the cidrsubnets function in Terraform is a bit of a pain – but it’s so extremely handy for automated networking that it’s worth spending the time to figure it out. Suffice to say, I am not going to dig deep on how to use cidrsubnets; rather I am going to bring up a really handy and (as far as I can tell) “not documented” method for supplying a list of “newbits” values to this function.