Now from last year, I had the list of friends and their respective addresses in a CSV file that looks like this:

name,street,zip,city,country Julenissen,Julenissens postkontor,1440,Drøbak,Norway Santa Claus,Santa Claus's Main Post Office,96930,Napapiiri,Finland Father Christmas,Santa's Grotto,XM4 5HQ,Reindeerland,United Kingdom An den Weihnachtsmann,Weihnachtspostfiliale,16798,Himmelpfort,Germany

I then quickly put together a Christmas card template file that looks like the following:

${name} ${street} %{ if country == "United Kingdom" }${city} ${zip}%{ else }${zip} ${city}%{ endif } ${country} Dear ${name}, Merry Christmas and a Happy New Year!

The Brits are a bit peculiar about how they address mail compared to the rest of us, and I therefore had to add an if directive in the template.

In order to actually generate some Christmas cards, I decided to write all the cards to disk using the local_file resource in Terraform in combination with the new for_each resource meta-argument and the new for expression (these features were added to Terraform in version 0.12.0 and 0.12.6 respectively). Combine all that with the templatefile expression, and you end up with this Terraform "one-liner":

resource "local_file" "christmascard" { for_each = { for address in csvdecode(file( " $ { path . module } /addresses.csv" )) : address.country = > address } content = templatefile( " $ { path . module } /card.tmpl" , each.value) filename = " $ { path . module } /cards/ $ { each . key } .txt" }

Whys is this cool you might ask? Well, there a lots of features in Terraform that allow you to do stuff that you can't do with any of the other infrastructure as code tools out there. Here's a brief list of features that come in handy on a regular basis when working with Terraform:

Built-in functions that let you do anything from math to crypto

Miscellaneous Providers that let you do anything from generating TLS certificates to random passwords. These are all non-cloud related resources really.

Source code

If you're keen on running this example on your laptop, do the following: