{"id":1188,"date":"2022-02-19T12:29:48","date_gmt":"2022-02-18T23:29:48","guid":{"rendered":"https:\/\/blog.wiseowls.co.nz\/?p=1188"},"modified":"2026-03-08T00:48:07","modified_gmt":"2026-03-07T11:48:07","slug":"building-terraform-quick-start-repo-zero-touch-pipeline","status":"publish","type":"post","link":"https:\/\/blog.wiseowls.co.nz\/index.php\/2022\/02\/19\/building-terraform-quick-start-repo-zero-touch-pipeline\/","title":{"rendered":"Building Terraform Quick Start repo part 2 &#8211; Zero touch pipeline"},"content":{"rendered":"<p><em>This is the second part of the series following our humble endeavors to automate Terraform deployment tasks. <a href=\"https:\/\/blog.wiseowls.co.nz\/index.php\/2022\/01\/13\/terraform-quick-start-repo-part-1-azure-remote-state\/\">First part here<\/a>.  With housekeeping out of the way, let&#8217;s get on to the content.<\/em><\/p>\n<p>For purposes of this exercise, it does not matter what we want to deploy. Can be a simple Web App or full fat Landing Zone. The pipeline itself remains unchanged.<\/p>\n<h2 class=\"wp-block-heading\" id=\"sample-infrastructure\">Sample Infrastructure<\/h2>\n<p>Since we want an absolute minimum, we&#8217;ll go with one resource group and one <a href=\"https:\/\/blog.wiseowls.co.nz\/index.php\/2021\/07\/23\/azure-static-web-apps-when-speed-to-market-matters\/\">Static Web App<\/a>:<\/p>\n<pre class=\"wp-block-code\"><code lang=\"json\" class=\"language-json\">#============= main.tf ====================\nterraform {\n  backend \"azurerm\" { }\n\n  required_providers {\n    azurerm = {\n      version = \"~&gt; 2.93\"\n    }\n  }\n}\n\n# Set target subscription for deployment\nprovider \"azurerm\" {\n  features {}\n  subscription_id = var.subscription_id\n}\n#============= infra.tf ==================== \nresource \"azurerm_resource_group\" \"main\" {\n  name = \"${var.prefix}-${var.environment}-${var.location}-workload-rg\"\n  location = var.location\n}\n\nresource \"azurerm_static_site\" \"main\" {\n  name = \"${var.prefix}-${var.environment}-${var.location}-swa\"\n  resource_group_name = azurerm_resource_group.main.name\n  location = var.location\n}<\/code><\/pre>\n<h2 class=\"wp-block-heading\" id=\"we-ll-focus-on-the-pipeline-though\">We&#8217;ll focus on the pipeline though<\/h2>\n<p>Since our goal is to have as little human intervention as possible, we went with multi-stage YAML pipeline. <\/p>\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"410\" src=\"https:\/\/blog.wiseowls.co.nz\/wp-content\/uploads\/2022\/02\/pipeline.drawio-1024x410.png\" alt=\"Zero touch Terraform deployment pipeline flow diagram\" class=\"wp-image-1204\" srcset=\"https:\/\/blog.wiseowls.co.nz\/wp-content\/uploads\/2022\/02\/pipeline.drawio-1024x410.png 1024w, https:\/\/blog.wiseowls.co.nz\/wp-content\/uploads\/2022\/02\/pipeline.drawio-300x120.png 300w, https:\/\/blog.wiseowls.co.nz\/wp-content\/uploads\/2022\/02\/pipeline.drawio-768x308.png 768w, https:\/\/blog.wiseowls.co.nz\/wp-content\/uploads\/2022\/02\/pipeline.drawio-1536x615.png 1536w, https:\/\/blog.wiseowls.co.nz\/wp-content\/uploads\/2022\/02\/pipeline.drawio-1200x481.png 1200w, https:\/\/blog.wiseowls.co.nz\/wp-content\/uploads\/2022\/02\/pipeline.drawio.png 1758w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" \/><\/figure>\n<p>the YAML may look something like that:<\/p>\n<pre class=\"wp-block-code\"><code lang=\"yaml\" class=\"language-yaml\">trigger: none # intended to run manually\nname: Deploy Terraform\n\npool:\n  vmImage: 'ubuntu-latest'\n\nvariables:\n  - group: 'bootstrap-state-variable-grp'\n\nstages:\n- stage: bootstrap_state\n  displayName: 'Bootstrap TF State'\n  jobs:\n  - job: tf_bootstrap\n    steps:\n    - task: AzureResourceManagerTemplateDeployment@3\n      inputs:\n        deploymentScope: 'Subscription'\n        azureResourceManagerConnection: '$(azureServiceConnection)'\n        subscriptionId: '$(targetSubscriptionId)'\n        location: '$(location)'\n        csmFile: '$(Build.SourcesDirectory)\/bicep\/main.bicep' # on dev machine, compile into ARM (az bicep build --file .\\bicep\\main.bicep) and use that instead until agent gets update to 3.199.x\n        deploymentOutputs: 'deploymentOutputs'\n        overrideParameters: '-prefix $(prefix) -location $(location)'\n    - script: |\n        # this script takes output from ARM deployment and makes it available to steps further down the pipeline\n        echo \"##vso[task.setvariable variable=resourceGroupName;isOutput=true]`echo $DEPLOYMENT_OUTPUT | jq -r '.resourceGroupName.value'`\"\n        echo \"##vso[task.setvariable variable=storageAccountName;isOutput=true]`echo $DEPLOYMENT_OUTPUT | jq -r '.storageAccountName.value'`\"\n        echo \"##vso[task.setvariable variable=containerName;isOutput=true]`echo $DEPLOYMENT_OUTPUT | jq -r '.containerName.value'`\"\n        echo \"##vso[task.setvariable variable=storageAccessKey;isOutput=true;isSecret=true]`echo $DEPLOYMENT_OUTPUT | jq -r '.storageAccessKey.value'`\"\n      # https:\/\/docs.microsoft.com\/en-us\/azure\/devops\/pipelines\/process\/variables?view=azure-devops&amp;tabs=yaml%2Cbatch#share-variables-across-pipelines\n      name: armOutputs # giving name to this task is extremely important as we will use it to reference the variables from later stages      \n      env:\n        DEPLOYMENT_OUTPUT: $(deploymentOutputs)\n\n- stage: run_tf_plan # Build stage\n  displayName: 'TF Plan'\n  jobs:\n  - job: tf_plan\n    variables:\n      # to be able to reference outputs from earlier stage, we start hierarchy from stageDependencies and address job outputs by full name: &lt;stage_id&gt;.&lt;job_id&gt;.outputs\n      - name: resourceGroupName\n        value: $[ stageDependencies.bootstrap_state.tf_bootstrap.outputs['armOutputs.resourceGroupName'] ]\n      - name: storageAccountName\n        value: $[ stageDependencies.bootstrap_state.tf_bootstrap.outputs['armOutputs.storageAccountName'] ]\n      - name: containerName\n        value: $[ stageDependencies.bootstrap_state.tf_bootstrap.outputs['armOutputs.containerName'] ]\n      - name: storageAccessKey\n        value: $[ stageDependencies.bootstrap_state.tf_bootstrap.outputs['armOutputs.storageAccessKey'] ]\n    steps:              \n      # check out TF code from git\n      - checkout: self\n        persistCredentials: true\n      # init terraform and point the backend to correct storage account\n      - task: TerraformTaskV2@2 # https:\/\/github.com\/microsoft\/azure-pipelines-extensions\/blob\/master\/Extensions\/Terraform\/Src\/Tasks\/TerraformTask\/TerraformTaskV2\/task.json\n        displayName: terraform init\n        inputs:\n          workingDirectory: '$(System.DefaultWorkingDirectory)\/tf'\n          backendServiceArm: $(azureServiceConnection)\n          backendAzureRmResourceGroupName: $(resourceGroupName)\n          backendAzureRmStorageAccountName: $(storageAccountName)\n          backendAzureRmContainerName: $(containerName)\n          backendAzureRmKey: '$(prefix)\/terraform.tfstate'\n        env:\n          ARM_ACCESS_KEY: $(storageAccessKey)\n      # run terraform plan and store it as a file so we can package it\n      - task: TerraformTaskV2@2\n        displayName: terraform plan\n        inputs:\n          workingDirectory: '$(System.DefaultWorkingDirectory)\/tf'\n          environmentServiceNameAzureRM: $(azureServiceConnection)\n          command: 'plan'\n          # feed tfvars file and set variables for azure backend (see TF files for usage)\n          commandOptions: '-input=false -var-file=terraform.tfvars -var=\"prefix=$(prefix)\" -var=\"location=$(location)\" -var=\"subscription_id=$(targetSubscriptionId)\" -out=$(prefix)-plan.tfplan'\n        env:\n          ARM_ACCESS_KEY: $(storageAccessKey)\n      # package workspace into an artifact so we can publish it\n      - task: ArchiveFiles@2\n        inputs:\n          displayName: 'Create Plan Artifact'\n          rootFolderOrFile: '$(System.DefaultWorkingDirectory)\/tf'\n          includeRootFolder: false                \n          archiveFile: '$(Build.ArtifactStagingDirectory)\/$(Build.BuildId).zip'\n          replaceExistingArchive: true\n      # publish artifact to ADO\n      - task: PublishBuildArtifacts@1\n        inputs:\n          displayName: 'Publish Plan Artifact'\n          PathtoPublish: '$(Build.ArtifactStagingDirectory)'\n          ArtifactName: '$(Build.BuildId)-tfplan'\n          publishLocation: 'Container'          \n\n- stage: run_tf_apply # Deploy stage\n  dependsOn: \n    - bootstrap_state # adding extra dependencies so we can access armOutputs from earlier stages\n    - run_tf_plan # by default next stage would have depended on the previous, but we broke that chain by depending on earlier stages\n  displayName: 'TF Apply'\n  jobs:  \n  - deployment: tf_apply\n    variables:\n      # to be able to reference outputs from earlier stages, we start hierarchy from stageDependencies and address job outputs by full name: &lt;stage_id&gt;.&lt;job_id&gt;.outputs\n      - name: storageAccessKey\n        value: $[ stageDependencies.bootstrap_state.tf_bootstrap.outputs['armOutputs.storageAccessKey'] ]\n    environment: 'dev' # required for deployment jobs. will need to authorise the pipeline to use it at first run\n    strategy:\n        runOnce:\n          deploy:\n            steps:\n            # grab published artifact\n            - task: DownloadBuildArtifacts@0\n              inputs:\n                artifactName: '$(Build.BuildId)-tfplan'\n                displayName: 'Download Plan Artifact'\n            # unpack the archive, we should end up with all necessary files in root of working directory\n            - task: ExtractFiles@1\n              inputs:\n                archiveFilePatterns: '$(System.ArtifactsDirectory)\/$(Build.BuildId)-tfplan\/$(Build.BuildId).zip'\n                destinationFolder: '$(System.DefaultWorkingDirectory)\/'\n                cleanDestinationFolder: false\n                displayName: 'Extract Terraform Plan Artifact'\n            - task: TerraformTaskV2@2\n              displayName: terraform apply\n              inputs:\n                workingDirectory: $(System.DefaultWorkingDirectory)\n                command: 'apply'\n                commandOptions: '-auto-approve -input=false $(prefix)-plan.tfplan'\n                environmentServiceNameAzureRM: $(azureServiceConnection)\n              env:\n                ARM_ACCESS_KEY: $(storageAccessKey)<\/code><\/pre>\n<h2 class=\"wp-block-heading\" id=\"couple-of-notes-regarding-the-pipeline\">Couple of notes regarding the pipeline<\/h2>\n<p>The pipeline is pretty straightforward so instead of going through it line by line, we just wanted to point out a few things that really helped us put this together<\/p>\n<ol class=\"wp-block-list\">\n<li><code>armOutputs<\/code> is where we <a href=\"https:\/\/blog.wiseowls.co.nz\/index.php\/2022\/02\/01\/ado-capturing-outputs-from-arm-deployment-into-yaml-pipeline\/\">capture JSON outputs<\/a> and feed them to pipeline.<\/li>\n<li>Building on top of that, we had to import these variables in subsequent stages using <a href=\"https:\/\/docs.microsoft.com\/en-us\/azure\/devops\/pipelines\/process\/variables?view=azure-devops&amp;tabs=yaml%2Cbatch#use-outputs-in-a-different-stage\">stage dependencies<\/a>. The pipeline can ultimately be represented as a tree containing stages on top level and ending with tasks as leaves. Keywords <code>dependencies<\/code> and <code>stageDependencies<\/code> tell us which level we&#8217;re looking at<\/li>\n<li>For this trick to work, the requesting stage must depend on the stage where variables are exported from. By default, subsequent stages depend on the stages immediately preceding them. But in more complicated scenarios we can use <code>dependsOn<\/code> parameter and specify it ourselves.<\/li>\n<li>Keen-eyed readers may notice we do not perform Terraform Install at all. This is very intentional, as Hosted Agent we&#8217;re using for this build <a href=\"https:\/\/github.com\/actions\/virtual-environments\/blob\/main\/images\/linux\/Ubuntu2004-Readme.md#tools\">already has TF 1.1.5<\/a> installed. It&#8217;s good enough for us but may need an upgrade in your case<\/li>\n<li>The same point applies to using <code>jq<\/code> in our JSON parsing script &#8211; it&#8217;s already in there but your mileage may vary<\/li>\n<\/ol>\n<h2 class=\"wp-block-heading\" id=\"conclusion\">Conclusion<\/h2>\n<p>With the build pipeline sorted, we&#8217;re yet another step closer to our zero-touch Terraform deployment nirvana. We already can grab the code and commit it into a fresh ADO project to give our workflow a boost. I&#8217;m not sharing the code just yet as there are still a couple of things we can do, so watch this space for more content!<\/p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>This is the second part of the series following our humble endeavors to automate Terraform deployment tasks. First part here. With housekeeping out of the way, let&#8217;s get on to the content. For purposes of this exercise, it does not matter what we want to deploy. Can be a simple Web App or full fat &hellip; <a href=\"https:\/\/blog.wiseowls.co.nz\/index.php\/2022\/02\/19\/building-terraform-quick-start-repo-zero-touch-pipeline\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;Building Terraform Quick Start repo part 2 &#8211; Zero touch pipeline&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":1186,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[50,7],"tags":[58,57],"class_list":["post-1188","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-cloud","category-infrastructure","tag-azure-devops","tag-terraform"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Building Terraform Quick Start repo part 2 - Zero touch pipeline - Timur and associates<\/title>\n<meta name=\"description\" content=\"Following up on remote state bootstrapping, we are now in a position to run the build and get Terraform deploy actual infrastructure.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blog.wiseowls.co.nz\/index.php\/2022\/02\/19\/building-terraform-quick-start-repo-zero-touch-pipeline\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Building Terraform Quick Start repo part 2 - Zero touch pipeline - Timur and associates\" \/>\n<meta property=\"og:description\" content=\"Following up on remote state bootstrapping, we are now in a position to run the build and get Terraform deploy actual infrastructure.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blog.wiseowls.co.nz\/index.php\/2022\/02\/19\/building-terraform-quick-start-repo-zero-touch-pipeline\/\" \/>\n<meta property=\"og:site_name\" content=\"Timur and associates\" \/>\n<meta property=\"article:published_time\" content=\"2022-02-18T23:29:48+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-03-07T11:48:07+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blog.wiseowls.co.nz\/wp-content\/uploads\/2022\/02\/rocket-launch-g30a0082b3_1920.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1920\" \/>\n\t<meta property=\"og:image:height\" content=\"563\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"timur\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@TimurKh\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/index.php\\\/2022\\\/02\\\/19\\\/building-terraform-quick-start-repo-zero-touch-pipeline\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/index.php\\\/2022\\\/02\\\/19\\\/building-terraform-quick-start-repo-zero-touch-pipeline\\\/\"},\"author\":{\"name\":\"timur\",\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/#\\\/schema\\\/person\\\/34d0ed30d573b5bc317ea990bd2e0c59\"},\"headline\":\"Building Terraform Quick Start repo part 2 &#8211; Zero touch pipeline\",\"datePublished\":\"2022-02-18T23:29:48+00:00\",\"dateModified\":\"2026-03-07T11:48:07+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/index.php\\\/2022\\\/02\\\/19\\\/building-terraform-quick-start-repo-zero-touch-pipeline\\\/\"},\"wordCount\":389,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/index.php\\\/2022\\\/02\\\/19\\\/building-terraform-quick-start-repo-zero-touch-pipeline\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/wp-content\\\/uploads\\\/2022\\\/02\\\/rocket-launch-g30a0082b3_1920.jpg\",\"keywords\":[\"azure-devops\",\"terraform\"],\"articleSection\":[\"Cloud\",\"Infrastructure\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/blog.wiseowls.co.nz\\\/index.php\\\/2022\\\/02\\\/19\\\/building-terraform-quick-start-repo-zero-touch-pipeline\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/index.php\\\/2022\\\/02\\\/19\\\/building-terraform-quick-start-repo-zero-touch-pipeline\\\/\",\"url\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/index.php\\\/2022\\\/02\\\/19\\\/building-terraform-quick-start-repo-zero-touch-pipeline\\\/\",\"name\":\"Building Terraform Quick Start repo part 2 - Zero touch pipeline - Timur and associates\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/index.php\\\/2022\\\/02\\\/19\\\/building-terraform-quick-start-repo-zero-touch-pipeline\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/index.php\\\/2022\\\/02\\\/19\\\/building-terraform-quick-start-repo-zero-touch-pipeline\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/wp-content\\\/uploads\\\/2022\\\/02\\\/rocket-launch-g30a0082b3_1920.jpg\",\"datePublished\":\"2022-02-18T23:29:48+00:00\",\"dateModified\":\"2026-03-07T11:48:07+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/#\\\/schema\\\/person\\\/34d0ed30d573b5bc317ea990bd2e0c59\"},\"description\":\"Following up on remote state bootstrapping, we are now in a position to run the build and get Terraform deploy actual infrastructure.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/index.php\\\/2022\\\/02\\\/19\\\/building-terraform-quick-start-repo-zero-touch-pipeline\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/blog.wiseowls.co.nz\\\/index.php\\\/2022\\\/02\\\/19\\\/building-terraform-quick-start-repo-zero-touch-pipeline\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/index.php\\\/2022\\\/02\\\/19\\\/building-terraform-quick-start-repo-zero-touch-pipeline\\\/#primaryimage\",\"url\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/wp-content\\\/uploads\\\/2022\\\/02\\\/rocket-launch-g30a0082b3_1920.jpg\",\"contentUrl\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/wp-content\\\/uploads\\\/2022\\\/02\\\/rocket-launch-g30a0082b3_1920.jpg\",\"width\":1920,\"height\":563},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/index.php\\\/2022\\\/02\\\/19\\\/building-terraform-quick-start-repo-zero-touch-pipeline\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Building Terraform Quick Start repo part 2 &#8211; Zero touch pipeline\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/#website\",\"url\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/\",\"name\":\"Timur and associates\",\"description\":\"Notes of an IT contractor\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/blog.wiseowls.co.nz\\\/#\\\/schema\\\/person\\\/34d0ed30d573b5bc317ea990bd2e0c59\",\"name\":\"timur\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/23d55e17d4f0990ee4d12bc6e5dcfb58a292934efd62a185756876379e780b16?s=96&r=pg\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/23d55e17d4f0990ee4d12bc6e5dcfb58a292934efd62a185756876379e780b16?s=96&r=pg\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/23d55e17d4f0990ee4d12bc6e5dcfb58a292934efd62a185756876379e780b16?s=96&r=pg\",\"caption\":\"timur\"},\"sameAs\":[\"https:\\\/\\\/x.com\\\/TimurKh\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Building Terraform Quick Start repo part 2 - Zero touch pipeline - Timur and associates","description":"Following up on remote state bootstrapping, we are now in a position to run the build and get Terraform deploy actual infrastructure.","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:\/\/blog.wiseowls.co.nz\/index.php\/2022\/02\/19\/building-terraform-quick-start-repo-zero-touch-pipeline\/","og_locale":"en_US","og_type":"article","og_title":"Building Terraform Quick Start repo part 2 - Zero touch pipeline - Timur and associates","og_description":"Following up on remote state bootstrapping, we are now in a position to run the build and get Terraform deploy actual infrastructure.","og_url":"https:\/\/blog.wiseowls.co.nz\/index.php\/2022\/02\/19\/building-terraform-quick-start-repo-zero-touch-pipeline\/","og_site_name":"Timur and associates","article_published_time":"2022-02-18T23:29:48+00:00","article_modified_time":"2026-03-07T11:48:07+00:00","og_image":[{"width":1920,"height":563,"url":"https:\/\/blog.wiseowls.co.nz\/wp-content\/uploads\/2022\/02\/rocket-launch-g30a0082b3_1920.jpg","type":"image\/jpeg"}],"author":"timur","twitter_card":"summary_large_image","twitter_creator":"@TimurKh","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blog.wiseowls.co.nz\/index.php\/2022\/02\/19\/building-terraform-quick-start-repo-zero-touch-pipeline\/#article","isPartOf":{"@id":"https:\/\/blog.wiseowls.co.nz\/index.php\/2022\/02\/19\/building-terraform-quick-start-repo-zero-touch-pipeline\/"},"author":{"name":"timur","@id":"https:\/\/blog.wiseowls.co.nz\/#\/schema\/person\/34d0ed30d573b5bc317ea990bd2e0c59"},"headline":"Building Terraform Quick Start repo part 2 &#8211; Zero touch pipeline","datePublished":"2022-02-18T23:29:48+00:00","dateModified":"2026-03-07T11:48:07+00:00","mainEntityOfPage":{"@id":"https:\/\/blog.wiseowls.co.nz\/index.php\/2022\/02\/19\/building-terraform-quick-start-repo-zero-touch-pipeline\/"},"wordCount":389,"commentCount":0,"image":{"@id":"https:\/\/blog.wiseowls.co.nz\/index.php\/2022\/02\/19\/building-terraform-quick-start-repo-zero-touch-pipeline\/#primaryimage"},"thumbnailUrl":"https:\/\/blog.wiseowls.co.nz\/wp-content\/uploads\/2022\/02\/rocket-launch-g30a0082b3_1920.jpg","keywords":["azure-devops","terraform"],"articleSection":["Cloud","Infrastructure"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blog.wiseowls.co.nz\/index.php\/2022\/02\/19\/building-terraform-quick-start-repo-zero-touch-pipeline\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/blog.wiseowls.co.nz\/index.php\/2022\/02\/19\/building-terraform-quick-start-repo-zero-touch-pipeline\/","url":"https:\/\/blog.wiseowls.co.nz\/index.php\/2022\/02\/19\/building-terraform-quick-start-repo-zero-touch-pipeline\/","name":"Building Terraform Quick Start repo part 2 - Zero touch pipeline - Timur and associates","isPartOf":{"@id":"https:\/\/blog.wiseowls.co.nz\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blog.wiseowls.co.nz\/index.php\/2022\/02\/19\/building-terraform-quick-start-repo-zero-touch-pipeline\/#primaryimage"},"image":{"@id":"https:\/\/blog.wiseowls.co.nz\/index.php\/2022\/02\/19\/building-terraform-quick-start-repo-zero-touch-pipeline\/#primaryimage"},"thumbnailUrl":"https:\/\/blog.wiseowls.co.nz\/wp-content\/uploads\/2022\/02\/rocket-launch-g30a0082b3_1920.jpg","datePublished":"2022-02-18T23:29:48+00:00","dateModified":"2026-03-07T11:48:07+00:00","author":{"@id":"https:\/\/blog.wiseowls.co.nz\/#\/schema\/person\/34d0ed30d573b5bc317ea990bd2e0c59"},"description":"Following up on remote state bootstrapping, we are now in a position to run the build and get Terraform deploy actual infrastructure.","breadcrumb":{"@id":"https:\/\/blog.wiseowls.co.nz\/index.php\/2022\/02\/19\/building-terraform-quick-start-repo-zero-touch-pipeline\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.wiseowls.co.nz\/index.php\/2022\/02\/19\/building-terraform-quick-start-repo-zero-touch-pipeline\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/blog.wiseowls.co.nz\/index.php\/2022\/02\/19\/building-terraform-quick-start-repo-zero-touch-pipeline\/#primaryimage","url":"https:\/\/blog.wiseowls.co.nz\/wp-content\/uploads\/2022\/02\/rocket-launch-g30a0082b3_1920.jpg","contentUrl":"https:\/\/blog.wiseowls.co.nz\/wp-content\/uploads\/2022\/02\/rocket-launch-g30a0082b3_1920.jpg","width":1920,"height":563},{"@type":"BreadcrumbList","@id":"https:\/\/blog.wiseowls.co.nz\/index.php\/2022\/02\/19\/building-terraform-quick-start-repo-zero-touch-pipeline\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/blog.wiseowls.co.nz\/"},{"@type":"ListItem","position":2,"name":"Building Terraform Quick Start repo part 2 &#8211; Zero touch pipeline"}]},{"@type":"WebSite","@id":"https:\/\/blog.wiseowls.co.nz\/#website","url":"https:\/\/blog.wiseowls.co.nz\/","name":"Timur and associates","description":"Notes of an IT contractor","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blog.wiseowls.co.nz\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/blog.wiseowls.co.nz\/#\/schema\/person\/34d0ed30d573b5bc317ea990bd2e0c59","name":"timur","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/23d55e17d4f0990ee4d12bc6e5dcfb58a292934efd62a185756876379e780b16?s=96&r=pg","url":"https:\/\/secure.gravatar.com\/avatar\/23d55e17d4f0990ee4d12bc6e5dcfb58a292934efd62a185756876379e780b16?s=96&r=pg","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/23d55e17d4f0990ee4d12bc6e5dcfb58a292934efd62a185756876379e780b16?s=96&r=pg","caption":"timur"},"sameAs":["https:\/\/x.com\/TimurKh"]}]}},"_links":{"self":[{"href":"https:\/\/blog.wiseowls.co.nz\/index.php\/wp-json\/wp\/v2\/posts\/1188","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.wiseowls.co.nz\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.wiseowls.co.nz\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.wiseowls.co.nz\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.wiseowls.co.nz\/index.php\/wp-json\/wp\/v2\/comments?post=1188"}],"version-history":[{"count":10,"href":"https:\/\/blog.wiseowls.co.nz\/index.php\/wp-json\/wp\/v2\/posts\/1188\/revisions"}],"predecessor-version":[{"id":1353,"href":"https:\/\/blog.wiseowls.co.nz\/index.php\/wp-json\/wp\/v2\/posts\/1188\/revisions\/1353"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.wiseowls.co.nz\/index.php\/wp-json\/wp\/v2\/media\/1186"}],"wp:attachment":[{"href":"https:\/\/blog.wiseowls.co.nz\/index.php\/wp-json\/wp\/v2\/media?parent=1188"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.wiseowls.co.nz\/index.php\/wp-json\/wp\/v2\/categories?post=1188"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.wiseowls.co.nz\/index.php\/wp-json\/wp\/v2\/tags?post=1188"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}