{"id":11114,"date":"2026-05-03T08:08:21","date_gmt":"2026-05-03T08:08:21","guid":{"rendered":"https:\/\/www.devopsschool.com\/blog\/?p=11114"},"modified":"2026-05-03T08:08:23","modified_gmt":"2026-05-03T08:08:23","slug":"terraform-provisioners-tutorials-and-complete-guide","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/terraform-provisioners-tutorials-and-complete-guide\/","title":{"rendered":"Terraform provisioners Tutorials and Complete Guide"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"515\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2023\/09\/image-454-1024x515.png\" alt=\"\" class=\"wp-image-39909\" srcset=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2023\/09\/image-454-1024x515.png 1024w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2023\/09\/image-454-300x151.png 300w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2023\/09\/image-454-768x386.png 768w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2023\/09\/image-454.png 1093w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Terraform provisioners are used to execute scripts or shell commands on a local or remote machine as part of resource creation\/deletion. They are similar to \u201cEC2 instance user data\u201d scripts that only run once on the creation and if it fails terraform marks it tainted.<\/p>\n\n\n\n<p>Terraform includes a number of built-in provisioners, such as:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>file:<\/strong>&nbsp;Copies files or directories from the machine running Terraform to the newly created resource.<\/li>\n\n\n\n<li><strong>remote-exec:<\/strong>&nbsp;Executes a command on the newly created resource.<\/li>\n\n\n\n<li><strong>local-exec:<\/strong>&nbsp;Executes a command on the machine running Terraform.<\/li>\n<\/ul>\n\n\n\n<p>Provisioners can also be used to implement custom logic, such as:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Installing and configuring software<\/li>\n\n\n\n<li>Creating and configuring user accounts<\/li>\n\n\n\n<li>Starting and stopping services<\/li>\n\n\n\n<li>Performing health checks<\/li>\n<\/ul>\n\n\n\n<p>Provisioners should be used as a last resort. There are better alternatives for most situations, such as using Terraform modules or a configuration management tool like Ansible or Chef. However, provisioners can be useful for certain tasks, such as configuring resources that are not supported by Terraform modules or for integrating Terraform with other tools.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">resource <span class=\"hljs-string\">\"aws_instance\"<\/span> <span class=\"hljs-string\">\"web\"<\/span> {\n  ami           = <span class=\"hljs-string\">\"ami-053b0d53c279acc90\"<\/span>\n  instance_type = <span class=\"hljs-string\">\"t3.micro\"<\/span>\n  key_name \t\t= <span class=\"hljs-string\">\"aws-hl-training\"<\/span>\n\n  tags = {\n    Name = <span class=\"hljs-string\">\"HelloWorld-rajesh\"<\/span>\n  }\n  \n  connection {\n      type     = <span class=\"hljs-string\">\"ssh\"<\/span>\n      user     = <span class=\"hljs-string\">\"ubuntu\"<\/span>\n      private_key = file(<span class=\"hljs-string\">\"aws-hl-training.pem\"<\/span>)\n      <span class=\"hljs-comment\">#host = aws_instance.web.public_ip<\/span>\n      host = <span class=\"hljs-keyword\">self<\/span>.public_ip\n  } \n  \n  provisioner <span class=\"hljs-string\">\"local-exec\"<\/span> {\n    command = <span class=\"hljs-string\">\"mkdir devopsschool-local\"<\/span>\n  }\n  \n provisioner <span class=\"hljs-string\">\"remote-exec\"<\/span> {\n    inline = &#91;\n\t  <span class=\"hljs-string\">\"sudo apt-get update\"<\/span>,\n      <span class=\"hljs-string\">\"sudo apt-get install apache2 -y\"<\/span>,\n\t  <span class=\"hljs-string\">\"sudo systemctl start apache2\"<\/span>,\n    ]\n  }\n  \n  provisioner <span class=\"hljs-string\">\"file\"<\/span> {\n    source      = <span class=\"hljs-string\">\"terraform.tfstate.backup\"<\/span>\n    destination = <span class=\"hljs-string\">\"\/tmp\/\"<\/span>\n  } \n  \n  \n}\n\noutput <span class=\"hljs-string\">\"instance_public_ip\"<\/span> {\n  value = aws_instance.web.public_ip\n}\n\noutput <span class=\"hljs-string\">\"instance_public_sg\"<\/span> {\n  value = aws_instance.web.security_groups\n}\n\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">LOCAL-EXEC \u2014 Real Production Use Cases (10)<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>#<\/th><th>Real Use Case<\/th><th>Real Project Scenario<\/th><th>Typical Tool\/Command Used<\/th><\/tr><\/thead><tbody><tr><td>1<\/td><td>Register DNS entries<\/td><td>After creating VM\/EC2, register hostname\/IP into enterprise DNS (Infoblox\/Bind)<\/td><td>Python or curl API call to DNS system<\/td><\/tr><tr><td>2<\/td><td>Trigger CI\/CD post-deployment step<\/td><td>Notify Jenkins\/GitLab that infrastructure provisioning completed<\/td><td>curl webhook to CI\/CD<\/td><\/tr><tr><td>3<\/td><td>Generate dynamic inventory<\/td><td>Build Ansible inventory after VM creation<\/td><td>Bash script writing inventory file<\/td><\/tr><tr><td>4<\/td><td>Update CMDB records<\/td><td>Send newly created resource details into ServiceNow\/CMDB<\/td><td>REST API call<\/td><\/tr><tr><td>5<\/td><td>Notify Slack\/Teams<\/td><td>Send success\/failure notifications to operations channel<\/td><td>Slack webhook curl<\/td><\/tr><tr><td>6<\/td><td>Run security scan locally<\/td><td>Scan Terraform resources using Checkov\/tfsec<\/td><td>checkov \/ tfsec CLI<\/td><\/tr><tr><td>7<\/td><td>Generate TLS certificates<\/td><td>Create certificates locally before pushing to remote systems<\/td><td>openssl commands<\/td><\/tr><tr><td>8<\/td><td>Register monitoring targets<\/td><td>Add new servers into Datadog\/Zabbix monitoring<\/td><td>Python\/REST script<\/td><\/tr><tr><td>9<\/td><td>Trigger smoke testing<\/td><td>Validate deployed services externally after creation<\/td><td>curl \/ custom test scripts<\/td><\/tr><tr><td>10<\/td><td>Export Terraform outputs to external tools<\/td><td>Save infrastructure metadata for external automation tools<\/td><td>Bash export or file write<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">FILE \u2014 Real Production Use Cases (10)<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>#<\/th><th>Real Use Case<\/th><th>Real Project Scenario<\/th><th>Typical File Transferred<\/th><\/tr><\/thead><tbody><tr><td>1<\/td><td>Upload application config<\/td><td>Deploy application configuration to VM<\/td><td>app.conf<\/td><\/tr><tr><td>2<\/td><td>Upload SSH authorized keys<\/td><td>Add public keys to server for access<\/td><td>authorized_keys<\/td><\/tr><tr><td>3<\/td><td>Upload SSL certificates<\/td><td>Install TLS certificates on web servers<\/td><td>cert.pem \/ key.pem<\/td><\/tr><tr><td>4<\/td><td>Upload database initialization script<\/td><td>Initialize DB schemas on new database server<\/td><td>init.sql<\/td><\/tr><tr><td>5<\/td><td>Upload Docker Compose files<\/td><td>Deploy microservices stack<\/td><td>docker-compose.yml<\/td><\/tr><tr><td>6<\/td><td>Upload monitoring configuration<\/td><td>Configure Datadog\/Prometheus agent<\/td><td>datadog.yaml<\/td><\/tr><tr><td>7<\/td><td>Upload OS hardening scripts<\/td><td>Apply CIS hardening policies<\/td><td>hardening.sh<\/td><\/tr><tr><td>8<\/td><td>Upload Kubernetes kubeconfig<\/td><td>Enable cluster administration access<\/td><td>kubeconfig<\/td><\/tr><tr><td>9<\/td><td>Upload custom application binaries<\/td><td>Deploy compiled services to server<\/td><td>binary executable<\/td><\/tr><tr><td>10<\/td><td>Upload logging configurations<\/td><td>Configure centralized logging agents<\/td><td>rsyslog.conf<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">REMOTE-EXEC \u2014 Real Production Use Cases (10)<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>#<\/th><th>Real Use Case<\/th><th>Real Project Scenario<\/th><th>Typical Command Executed<\/th><\/tr><\/thead><tbody><tr><td>1<\/td><td>Install required packages<\/td><td>Install NGINX, Docker, or dependencies on new VM<\/td><td>apt\/yum install<\/td><\/tr><tr><td>2<\/td><td>Configure web server<\/td><td>Enable and start NGINX\/Apache services<\/td><td>systemctl start nginx<\/td><\/tr><tr><td>3<\/td><td>Initialize database<\/td><td>Execute DB schema initialization<\/td><td>mysql &lt; init.sql<\/td><\/tr><tr><td>4<\/td><td>Install monitoring agent<\/td><td>Install Datadog\/NewRelic agents<\/td><td>curl install script<\/td><\/tr><tr><td>5<\/td><td>Configure firewall rules<\/td><td>Open required service ports<\/td><td>firewall-cmd \/ iptables<\/td><\/tr><tr><td>6<\/td><td>Join Kubernetes cluster<\/td><td>Add worker nodes to cluster<\/td><td>kubeadm join<\/td><\/tr><tr><td>7<\/td><td>Deploy containerized application<\/td><td>Launch containers after setup<\/td><td>docker-compose up<\/td><\/tr><tr><td>8<\/td><td>Apply OS hardening<\/td><td>Run security scripts on remote system<\/td><td>bash hardening.sh<\/td><\/tr><tr><td>9<\/td><td>Configure logging agents<\/td><td>Setup centralized log forwarding<\/td><td>systemctl restart rsyslog<\/td><\/tr><tr><td>10<\/td><td>Validate system readiness<\/td><td>Perform system health checks<\/td><td>df -h, free -m<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>These tables reflect <strong>actual real-world Terraform usage patterns<\/strong> seen in:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>AWS EC2 deployments<\/li>\n\n\n\n<li>Kubernetes\/EKS provisioning<\/li>\n\n\n\n<li>DevOps CI\/CD pipelines<\/li>\n\n\n\n<li>Security hardening workflows<\/li>\n\n\n\n<li>Enterprise infrastructure automation<\/li>\n\n\n\n<li>Monitoring and logging setups<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">List of connection types in Terraform remote-exec provisioner?<\/h2>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><strong>SSH (Secure Shell)<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Type<\/strong>: <code>\"ssh\"<\/code><\/li>\n\n\n\n<li><strong>Description<\/strong>: Used for connecting to Unix-based operating systems, including Linux and macOS.<\/li>\n\n\n\n<li><strong>Commonly Used With<\/strong>: Linux and Unix-based cloud instances.<\/li>\n\n\n\n<li><strong>Example<\/strong>:<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">connection {\n  type        = <span class=\"hljs-string\">\"ssh\"<\/span>\n  user        = <span class=\"hljs-string\">\"your_username\"<\/span>\n  private_key = file(<span class=\"hljs-string\">\"~\/.ssh\/your_private_key.pem\"<\/span>)\n  host        = aws_instance.example.public_ip\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><strong>WinRM (Windows Remote Management)<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Type<\/strong>: <code>\"winrm\"<\/code><\/li>\n\n\n\n<li><strong>Description<\/strong>: Used for connecting to Windows-based operating systems.<\/li>\n\n\n\n<li><strong>Commonly Used With<\/strong>: Windows cloud instances.<\/li>\n\n\n\n<li><strong>Example<\/strong>:<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">connection {\n  type     = <span class=\"hljs-string\">\"winrm\"<\/span>\n  host     = aws_instance.example.private_ip\n  user     = <span class=\"hljs-string\">\"Administrator\"<\/span>\n  password = <span class=\"hljs-string\">\"your_password\"<\/span>\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>To establish a WinRM connection over HTTPS with SSL and ignore certificate validation, you can modify the connection block as follows:<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">connection {\n  type        = <span class=\"hljs-string\">\"winrm\"<\/span>\n  host        = aws_instance.example.private_ip\n  user        = <span class=\"hljs-string\">\"Administrator\"<\/span>\n  password    = <span class=\"hljs-string\">\"your_password\"<\/span>\n  https       = <span class=\"hljs-keyword\">true<\/span>  <span class=\"hljs-comment\"># Enable HTTPS<\/span>\n  insecure    = <span class=\"hljs-keyword\">true<\/span>  <span class=\"hljs-comment\"># Ignore SSL certificate validation (for testing purposes, not recommended in production)<\/span>\n  port        = <span class=\"hljs-number\">5986<\/span>  <span class=\"hljs-comment\"># Use the default HTTPS port for WinRM<\/span>\n  cacert      = <span class=\"hljs-string\">\"\/path\/to\/ca.crt\"<\/span>  <span class=\"hljs-comment\"># Optional path to a CA certificate file (if required)<\/span>\n  cert        = <span class=\"hljs-string\">\"\/path\/to\/client.crt\"<\/span>  <span class=\"hljs-comment\"># Optional path to a client certificate file (if required)<\/span>\n  key         = <span class=\"hljs-string\">\"\/path\/to\/client.key\"<\/span>  <span class=\"hljs-comment\"># Optional path to the client certificate's private key file (if required)<\/span>\n  timeout     = <span class=\"hljs-string\">\"5m\"<\/span>  <span class=\"hljs-comment\"># Set a timeout for the WinRM connection<\/span>\n  max_retries = <span class=\"hljs-number\">3<\/span>     <span class=\"hljs-comment\"># Maximum number of connection retries<\/span>\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>Explanation of the options:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>https<\/code>: Set to <code>true<\/code> to enable HTTPS for the WinRM connection.<\/li>\n\n\n\n<li><code>insecure<\/code>: Set to <code>true<\/code> to ignore SSL certificate validation. This option is typically used for testing and debugging but is not recommended for production due to security concerns.<\/li>\n\n\n\n<li><code>port<\/code>: Use <code>5986<\/code> as the default port for HTTPS WinRM connections.<\/li>\n\n\n\n<li><code>cacert<\/code>: Optional path to a CA certificate file. Use this if your WinRM server&#8217;s certificate is signed by a custom CA.<\/li>\n\n\n\n<li><code>cert<\/code>: Optional path to a client certificate file. Use this if client certificate authentication is required.<\/li>\n\n\n\n<li><code>key<\/code>: Optional path to the private key file corresponding to the client certificate.<\/li>\n\n\n\n<li><code>timeout<\/code>: Set a timeout for the WinRM connection (e.g., <code>\"5m\"<\/code> for 5 minutes).<\/li>\n\n\n\n<li><code>max_retries<\/code>: Maximum number of connection retries in case of failures.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Basic Terraform Code \u2014 Local Exec Provisioner Demo<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">terraform {\n  required_version = <span class=\"hljs-string\">\"&gt;= 1.0\"<\/span>\n}\n\n<span class=\"hljs-comment\"># Dummy resource just to trigger local-exec<\/span>\nresource <span class=\"hljs-string\">\"null_resource\"<\/span> <span class=\"hljs-string\">\"local_exec_demo\"<\/span> {\n\n  provisioner <span class=\"hljs-string\">\"local-exec\"<\/span> {\n\n    command = &lt;&lt;EOT\n\n<span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Creating directory...\"<\/span>\nmkdir -p terraform_localexec_demo\n\n<span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Checking system memory...\"<\/span>\n\n<span class=\"hljs-comment\"># Linux memory check<\/span>\n<span class=\"hljs-keyword\">if<\/span> command -v free &gt;\/dev\/<span class=\"hljs-keyword\">null<\/span> <span class=\"hljs-number\">2<\/span>&gt;&amp;<span class=\"hljs-number\">1<\/span>; then\n  free -h &gt; terraform_localexec_demo\/memory.txt\nfi\n\n<span class=\"hljs-comment\"># macOS memory check (for MacBook users)<\/span>\n<span class=\"hljs-keyword\">if<\/span> command -v vm_stat &gt;\/dev\/<span class=\"hljs-keyword\">null<\/span> <span class=\"hljs-number\">2<\/span>&gt;&amp;<span class=\"hljs-number\">1<\/span>; then\n  vm_stat &gt; terraform_localexec_demo\/memory.txt\nfi\n\n<span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Memory details saved to terraform_localexec_demo\/memory.txt\"<\/span>\n\nEOT\n\n    interpreter = &#91;<span class=\"hljs-string\">\"\/bin\/bash\"<\/span>, <span class=\"hljs-string\">\"-c\"<\/span>]\n  }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<figure class=\"wp-block-embed is-type-wp-embed is-provider-embed wp-block-embed-embed\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"nK0JbUXT62\"><a href=\"https:\/\/www.devopsschool.com\/blog\/how-to-run-provisioners-code-after-resources-is-created-in-terraform\/\">Terraform: run code after resources is created using using remote-exec provisioners<\/a><\/blockquote><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; visibility: hidden;\" title=\"&#8220;Terraform: run code after resources is created using using remote-exec provisioners&#8221; &#8212; \" src=\"https:\/\/www.devopsschool.com\/blog\/how-to-run-provisioners-code-after-resources-is-created-in-terraform\/embed\/#?secret=asav2qXf01#?secret=nK0JbUXT62\" data-secret=\"nK0JbUXT62\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>\n\n\n\n<figure class=\"wp-block-embed is-type-wp-embed is-provider-embed wp-block-embed-embed\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"BpLFHeD8qq\"><a href=\"https:\/\/www.devopsschool.com\/blog\/understanding-local-exec-provisioner-in-terraform\/\">Understanding local-exec provisioner in terraform<\/a><\/blockquote><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; visibility: hidden;\" title=\"&#8220;Understanding local-exec provisioner in terraform&#8221; &#8212; \" src=\"https:\/\/www.devopsschool.com\/blog\/understanding-local-exec-provisioner-in-terraform\/embed\/#?secret=N0KxSvqo4e#?secret=BpLFHeD8qq\" data-secret=\"BpLFHeD8qq\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>\n\n\n\n<figure class=\"wp-block-embed is-type-wp-embed is-provider-embed wp-block-embed-embed\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"WDmKwlOBUI\"><a href=\"https:\/\/www.devopsschool.com\/blog\/terrafrom-example-code-for-aws-ec2-instance-and-remote-exec-provisioner\/\">Terrafrom Tutorials &#8211; remote-exec provisioner using AWS &#038; Azure providers<\/a><\/blockquote><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; visibility: hidden;\" title=\"&#8220;Terrafrom Tutorials &#8211; remote-exec provisioner using AWS &#038; Azure providers&#8221; &#8212; \" src=\"https:\/\/www.devopsschool.com\/blog\/terrafrom-example-code-for-aws-ec2-instance-and-remote-exec-provisioner\/embed\/#?secret=jMqryW8gIi#?secret=WDmKwlOBUI\" data-secret=\"WDmKwlOBUI\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>\n\n\n\n<figure class=\"wp-block-embed is-type-wp-embed is-provider-embed wp-block-embed-embed\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"HbbJHOZquB\"><a href=\"https:\/\/www.devopsschool.com\/blog\/terrafrom-example-code-for-remote-exec-provisioner\/\">Terrafrom &#8211; Example Code for remote-exec, local-exec &#038; file provisioner<\/a><\/blockquote><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; visibility: hidden;\" title=\"&#8220;Terrafrom &#8211; Example Code for remote-exec, local-exec &#038; file provisioner&#8221; &#8212; \" src=\"https:\/\/www.devopsschool.com\/blog\/terrafrom-example-code-for-remote-exec-provisioner\/embed\/#?secret=jQqLtLGuVs#?secret=HbbJHOZquB\" data-secret=\"HbbJHOZquB\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>\n\n\n\n<figure class=\"wp-block-embed is-type-wp-embed is-provider-embed wp-block-embed-embed\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"WAgkoJOTw6\"><a href=\"https:\/\/www.devopsschool.com\/blog\/terraform-example-program-for-aws_security_group-aws_instance-and-provisioner\/\">Terraform example program for aws_security_group, aws_instance and provisioner<\/a><\/blockquote><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; visibility: hidden;\" title=\"&#8220;Terraform example program for aws_security_group, aws_instance and provisioner&#8221; &#8212; \" src=\"https:\/\/www.devopsschool.com\/blog\/terraform-example-program-for-aws_security_group-aws_instance-and-provisioner\/embed\/#?secret=zIJzM8vyCV#?secret=WAgkoJOTw6\" data-secret=\"WAgkoJOTw6\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>\n\n\n<div class=\"epyt-gallery\" data-currpage=\"1\" id=\"epyt_gallery_98482\"><figure class=\"wp-block-embed wp-block-embed-youtube is-type-video is-provider-youtube epyt-figure\"><div class=\"wp-block-embed__wrapper\"><iframe loading=\"lazy\"  id=\"_ytid_39203\"  width=\"760\" height=\"427\"  data-origwidth=\"760\" data-origheight=\"427\" src=\"https:\/\/www.youtube.com\/embed\/?enablejsapi=1&#038;autoplay=0&#038;cc_load_policy=0&#038;cc_lang_pref=&#038;iv_load_policy=1&#038;loop=0&#038;rel=1&#038;fs=1&#038;playsinline=0&#038;autohide=2&#038;theme=dark&#038;color=red&#038;controls=1&#038;disablekb=0&#038;\" class=\"__youtube_prefs__  no-lazyload\" title=\"YouTube player\"  data-epytgalleryid=\"epyt_gallery_98482\"  allow=\"fullscreen; accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen data-no-lazy=\"1\" data-skipgform_ajax_framebjll=\"\"><\/iframe><\/div><\/figure><div class=\"epyt-gallery-list\"><div>Sorry, there was a YouTube error.<\/div><\/div><\/div>\n\n\n<p>Below are <strong>real, production-grade use cases<\/strong> for <strong>Terraform provisioners<\/strong> based on how they are actually used in enterprise\/cloud\/DevOps projects (not toy examples).<br>You\u2019ll recognize many patterns from <strong>AWS, EKS, CI\/CD, security hardening, and migration projects<\/strong> like the ones you typically work on.<\/p>\n\n\n\n<p>I\u2019ll give:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>10 REAL Local-Exec use cases<\/strong><\/li>\n\n\n\n<li><strong>10 REAL File provisioner use cases<\/strong><\/li>\n\n\n\n<li><strong>10 REAL Remote-Exec use cases<\/strong><\/li>\n<\/ul>\n\n\n\n<p>All based on <strong>real infrastructure workflows<\/strong>, not hypothetical lab-only scenarios.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">LOCAL-EXEC \u2014 10 Real Production Use Cases<\/h1>\n\n\n\n<p><strong>Runs commands on the Terraform runner machine (CI\/CD or laptop).<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">1. Register DNS Records After Infrastructure Creation<\/h1>\n\n\n\n<p><strong>Real scenario:<\/strong><br>After creating an EC2 instance, register its IP into an external DNS system (Infoblox \/ Route53 script \/ corporate DNS).<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">provisioner <span class=\"hljs-string\">\"local-exec\"<\/span> {\n  command = <span class=\"hljs-string\">\"python register_dns.py ${aws_instance.app.private_ip}\"<\/span>\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Used in:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Enterprise data center automation<\/li>\n\n\n\n<li>Hybrid cloud onboarding<\/li>\n\n\n\n<li>Internal DNS automation<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">2. Notify Slack or Teams After Deployment<\/h1>\n\n\n\n<p><strong>Real scenario:<\/strong><br>Send deployment notifications to Slack after Terraform apply.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">provisioner <span class=\"hljs-string\">\"local-exec\"<\/span> {\n  command = &lt;&lt;EOT\ncurl -X POST -H <span class=\"hljs-string\">'Content-type: application\/json'<\/span> \\\n--data <span class=\"hljs-string\">'{\"text\":\"Infrastructure deployed successfully\"}'<\/span> \\\n$SLACK_WEBHOOK\nEOT\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Used in:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>CI\/CD pipelines<\/li>\n\n\n\n<li>DevOps release workflows<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">3. Generate Inventory for Ansible<\/h1>\n\n\n\n<p><strong>Real scenario:<\/strong><br>After VM creation, generate dynamic inventory.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">provisioner <span class=\"hljs-string\">\"local-exec\"<\/span> {\n  command = &lt;&lt;EOT\n<span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"&#91;web]\"<\/span> &gt; inventory.ini\n<span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"${aws_instance.web.private_ip}\"<\/span> &gt;&gt; inventory.ini\nEOT\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Used in:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Terraform \u2192 Ansible workflows<\/li>\n\n\n\n<li>Hybrid provisioning models<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">4. Trigger External Configuration Tool<\/h1>\n\n\n\n<p><strong>Real scenario:<\/strong><br>Trigger Ansible playbook after infra creation.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">provisioner <span class=\"hljs-string\">\"local-exec\"<\/span> {\n  command = <span class=\"hljs-string\">\"ansible-playbook site.yml -i inventory.ini\"<\/span>\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Used in:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Enterprise Linux automation<\/li>\n\n\n\n<li>VM configuration<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">5. Validate Security Compliance<\/h1>\n\n\n\n<p><strong>Real scenario:<\/strong><br>Run security validation tools like:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>terraform-compliance<\/code><\/li>\n\n\n\n<li><code>checkov<\/code><\/li>\n<\/ul>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">provisioner <span class=\"hljs-string\">\"local-exec\"<\/span> {\n  command = <span class=\"hljs-string\">\"checkov -d .\"<\/span>\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Used in:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Security pipelines<\/li>\n\n\n\n<li>DevSecOps workflows<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">6. Store Outputs to External Systems<\/h1>\n\n\n\n<p><strong>Real scenario:<\/strong><br>Send resource metadata to CMDB.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">provisioner <span class=\"hljs-string\">\"local-exec\"<\/span> {\n  command = &lt;&lt;EOT\ncurl -X POST https:<span class=\"hljs-comment\">\/\/cmdb.company.com\/api \\<\/span>\n-d <span class=\"hljs-string\">\"ip=${aws_instance.app.private_ip}\"<\/span>\nEOT\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Used in:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Enterprise asset tracking<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">7. Generate TLS Certificates<\/h1>\n\n\n\n<p><strong>Real scenario:<\/strong><br>Generate certificates locally.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">provisioner <span class=\"hljs-string\">\"local-exec\"<\/span> {\n  command = &lt;&lt;EOT\nopenssl req -x509 -newkey rsa:<span class=\"hljs-number\">4096<\/span> \\\n-keyout key.pem \\\n-out cert.pem -days <span class=\"hljs-number\">365<\/span> -nodes\nEOT\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Used in:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Private cluster deployments<\/li>\n\n\n\n<li>Internal services<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">8. Backup Terraform State Metadata<\/h1>\n\n\n\n<p><strong>Real scenario:<\/strong><br>Backup state metadata after apply.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-13\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">provisioner <span class=\"hljs-string\">\"local-exec\"<\/span> {\n  command = <span class=\"hljs-string\">\"cp terraform.tfstate backup\/\"<\/span>\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Used in:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Disaster recovery<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">9. Trigger Monitoring Registration<\/h1>\n\n\n\n<p><strong>Real scenario:<\/strong><br>Register instances in monitoring system.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-14\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">provisioner <span class=\"hljs-string\">\"local-exec\"<\/span> {\n  command = <span class=\"hljs-string\">\"python register_datadog.py\"<\/span>\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-14\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Used in:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Datadog<\/li>\n\n\n\n<li>Zabbix<\/li>\n\n\n\n<li>Prometheus automation<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">10. Run Smoke Tests After Deployment<\/h1>\n\n\n\n<p><strong>Real scenario:<\/strong><br>Test deployed services.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-15\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">provisioner <span class=\"hljs-string\">\"local-exec\"<\/span> {\n  command = <span class=\"hljs-string\">\"curl http:\/\/${aws_instance.web.public_ip}\"<\/span>\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-15\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Used in:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Production release validation<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">FILE PROVISIONER \u2014 10 Real Production Use Cases<\/h1>\n\n\n\n<p><strong>Copies files from local machine \u2192 remote machine.<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">1. Upload SSH Keys<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-16\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">provisioner <span class=\"hljs-string\">\"file\"<\/span> {\n  source      = <span class=\"hljs-string\">\"~\/.ssh\/id_rsa.pub\"<\/span>\n  destination = <span class=\"hljs-string\">\"\/home\/ec2-user\/.ssh\/authorized_keys\"<\/span>\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-16\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Used in:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Secure server access<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">2. Upload Application Configuration Files<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-17\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">provisioner <span class=\"hljs-string\">\"file\"<\/span> {\n  source      = <span class=\"hljs-string\">\"app.conf\"<\/span>\n  destination = <span class=\"hljs-string\">\"\/etc\/myapp\/app.conf\"<\/span>\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-17\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Used in:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>App deployments<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">3. Upload Kubernetes kubeconfig<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-18\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">provisioner <span class=\"hljs-string\">\"file\"<\/span> {\n  source      = <span class=\"hljs-string\">\"kubeconfig\"<\/span>\n  destination = <span class=\"hljs-string\">\"\/home\/ubuntu\/.kube\/config\"<\/span>\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-18\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Used in:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Cluster management<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">4. Upload SSL Certificates<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-19\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">provisioner <span class=\"hljs-string\">\"file\"<\/span> {\n  source      = <span class=\"hljs-string\">\"cert.pem\"<\/span>\n  destination = <span class=\"hljs-string\">\"\/etc\/ssl\/certs\/cert.pem\"<\/span>\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-19\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Used in:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>TLS-enabled services<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">5. Upload Docker Compose Files<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-20\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">provisioner <span class=\"hljs-string\">\"file\"<\/span> {\n  source      = <span class=\"hljs-string\">\"docker-compose.yml\"<\/span>\n  destination = <span class=\"hljs-string\">\"\/home\/ubuntu\/docker-compose.yml\"<\/span>\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-20\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Used in:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Microservices deployment<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">6. Upload Monitoring Agent Config<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-21\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">provisioner <span class=\"hljs-string\">\"file\"<\/span> {\n  source      = <span class=\"hljs-string\">\"datadog.yaml\"<\/span>\n  destination = <span class=\"hljs-string\">\"\/etc\/datadog-agent\/datadog.yaml\"<\/span>\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-21\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Used in:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Observability setups<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">7. Upload Application Binaries<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-22\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">provisioner <span class=\"hljs-string\">\"file\"<\/span> {\n  source      = <span class=\"hljs-string\">\"myapp\"<\/span>\n  destination = <span class=\"hljs-string\">\"\/usr\/local\/bin\/myapp\"<\/span>\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-22\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Used in:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Custom application deployment<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">8. Upload Database Initialization Scripts<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-23\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">provisioner <span class=\"hljs-string\">\"file\"<\/span> {\n  source      = <span class=\"hljs-string\">\"init.sql\"<\/span>\n  destination = <span class=\"hljs-string\">\"\/tmp\/init.sql\"<\/span>\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-23\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Used in:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>DB bootstrapping<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">9. Upload Cloud-init Overrides<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-24\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">provisioner <span class=\"hljs-string\">\"file\"<\/span> {\n  source      = <span class=\"hljs-string\">\"user-data.sh\"<\/span>\n  destination = <span class=\"hljs-string\">\"\/tmp\/user-data.sh\"<\/span>\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-24\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Used in:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Custom provisioning<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">10. Upload Security Hardening Scripts<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-25\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">provisioner <span class=\"hljs-string\">\"file\"<\/span> {\n  source      = <span class=\"hljs-string\">\"hardening.sh\"<\/span>\n  destination = <span class=\"hljs-string\">\"\/tmp\/hardening.sh\"<\/span>\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-25\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Used in:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>CIS hardening workflows<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">REMOTE-EXEC \u2014 10 Real Production Use Cases<\/h1>\n\n\n\n<p><strong>Runs commands directly on remote machines.<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">1. Install Required Packages<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-26\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">provisioner <span class=\"hljs-string\">\"remote-exec\"<\/span> {\n  inline = &#91;\n    <span class=\"hljs-string\">\"sudo yum update -y\"<\/span>,\n    <span class=\"hljs-string\">\"sudo yum install nginx -y\"<\/span>\n  ]\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-26\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Used in:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Server bootstrapping<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">2. Configure Web Server<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-27\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">inline = &#91;\n  <span class=\"hljs-string\">\"sudo systemctl enable nginx\"<\/span>,\n  <span class=\"hljs-string\">\"sudo systemctl start nginx\"<\/span>\n]\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-27\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Used in:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Production web setup<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">3. Initialize Database<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-28\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">inline = &#91;\n  <span class=\"hljs-string\">\"mysql &lt; \/tmp\/init.sql\"<\/span>\n]\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-28\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Used in:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>DB provisioning<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">4. Install Monitoring Agents<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-29\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">inline = &#91;\n  <span class=\"hljs-string\">\"curl -O https:\/\/agent.install.sh\"<\/span>,\n  <span class=\"hljs-string\">\"sudo bash agent.install.sh\"<\/span>\n]\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-29\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Used in:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Observability setup<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">5. Configure Firewall Rules<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-30\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">inline = &#91;\n  <span class=\"hljs-string\">\"sudo firewall-cmd --add-port=80\/tcp\"<\/span>\n]\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-30\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Used in:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Security configuration<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">6. Join Node to Kubernetes Cluster<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-31\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">inline = &#91;\n  <span class=\"hljs-string\">\"sudo kubeadm join ...\"<\/span>\n]\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-31\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Used in:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Kubernetes cluster scaling<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">7. Deploy Application Using Docker<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-32\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">inline = &#91;\n  <span class=\"hljs-string\">\"docker-compose up -d\"<\/span>\n]\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-32\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Used in:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Container deployment<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">8. Apply OS Hardening<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-33\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">inline = &#91;\n  <span class=\"hljs-string\">\"bash \/tmp\/hardening.sh\"<\/span>\n]\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-33\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Used in:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Security compliance<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">9. Configure Logging Agent<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-34\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">inline = &#91;\n  <span class=\"hljs-string\">\"sudo systemctl restart rsyslog\"<\/span>\n]\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-34\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Used in:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Centralized logging<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">10. Run System Validation Checks<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-35\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">inline = &#91;\n  <span class=\"hljs-string\">\"df -h\"<\/span>,\n  <span class=\"hljs-string\">\"free -m\"<\/span>\n]\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-35\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Used in:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Post-provision validation<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">REAL-WORLD SUMMARY (Industry Practice)<\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Provisioner<\/th><th>Real Purpose<\/th><\/tr><\/thead><tbody><tr><td>local-exec<\/td><td>Integration with external systems<\/td><\/tr><tr><td>file<\/td><td>Transfer configs\/scripts<\/td><\/tr><tr><td>remote-exec<\/td><td>Configure servers<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Important Reality (Production Best Practice)<\/h1>\n\n\n\n<p>Most <strong>mature Terraform projects avoid heavy use of provisioners<\/strong>.<\/p>\n\n\n\n<p>Instead they prefer:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>cloud-init<\/li>\n\n\n\n<li>userdata<\/li>\n\n\n\n<li>configuration management tools<\/li>\n\n\n\n<li>immutable infrastructure<\/li>\n<\/ul>\n\n\n\n<p>Provisioners are mainly used for:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Bootstrapping<\/li>\n\n\n\n<li>Integration hooks<\/li>\n\n\n\n<li>Transitional automation<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">If You Want Enterprise-Level Understanding<\/h1>\n\n\n\n<p>Next useful topics would be:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Provisioner lifecycle (<code>create<\/code>, <code>destroy<\/code>)<\/li>\n\n\n\n<li>Connection blocks (SSH, WinRM)<\/li>\n\n\n\n<li><code>null_resource<\/code> orchestration patterns<\/li>\n\n\n\n<li>When NOT to use provisioners<\/li>\n\n\n\n<li>Enterprise alternatives (cloud-init vs Ansible vs Packer)<\/li>\n<\/ul>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Terraform provisioners are used to execute scripts or shell commands on a local or remote machine as part of resource creation\/deletion. They are similar to \u201cEC2 instance&#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[5129],"tags":[],"class_list":["post-11114","post","type-post","status-publish","format-standard","hentry","category-terraform"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/11114","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=11114"}],"version-history":[{"count":11,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/11114\/revisions"}],"predecessor-version":[{"id":75336,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/11114\/revisions\/75336"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=11114"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=11114"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=11114"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}