{"id":513614,"date":"2020-02-11T09:01:02","date_gmt":"2020-02-11T08:01:02","guid":{"rendered":"https:\/\/www.devoteam.com\/expert-view\/ansible-and-terraform-episode-3\/"},"modified":"2020-02-11T09:01:02","modified_gmt":"2020-02-11T08:01:02","slug":"ansible-and-terraform-episode-3","status":"publish","type":"expert-view","link":"https:\/\/devoteam.info\/be\/expert-view\/ansible-and-terraform-episode-3\/","title":{"rendered":"Ansible and Terraform: Episode 3"},"content":{"rendered":"<h2>The magic explained<\/h2>\n<p><span data-contrast=\"none\">In the <a href=\"https:\/\/belgium.devoteam.com\/blog\/anisble-and-terraform-episode-2\/\">previous episode<\/a>, we<\/span><span data-contrast=\"none\">&nbsp;cloned<\/span><span data-contrast=\"none\">&nbsp;the code from&nbsp;<\/span><span data-contrast=\"none\">Github<\/span><span data-contrast=\"none\">,<\/span><span data-contrast=\"none\">&nbsp;<\/span><span data-contrast=\"none\">modified some variables and <\/span><span data-contrast=\"none\">provisioned<\/span><span data-contrast=\"none\">&nbsp;and<\/span><span data-contrast=\"none\"> deployed two servers on AWS<\/span><span data-contrast=\"none\">.&nbsp;<\/span><span data-contrast=\"none\">In this final episode we will explain what was going on behind the scenes and discuss the Terraform and Ansible part.<\/span><\/p>\n<h3>1. The Terraform part<span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:140,&quot;335559740&quot;:384}\"><\/span><\/h3>\n<p><span data-contrast=\"none\">The most important files of the&nbsp;<\/span><span data-contrast=\"none\">Terrafo<\/span><span data-contrast=\"none\">r<\/span><span data-contrast=\"none\">m<\/span><span data-contrast=\"none\">&nbsp;code can be broken down into two files<\/span><span data-contrast=\"none\">.<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:140,&quot;335559740&quot;:384}\">&nbsp;<\/span><\/p>\n<h4><strong><i>a. The main.tf file<\/i>.<\/strong><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:140,&quot;335559740&quot;:384}\"><\/span><\/h4>\n<p><span data-contrast=\"none\">In this file, all things that need to be done by Terraform are configured.<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:140,&quot;335559740&quot;:384}\">&nbsp;<\/span><\/p>\n<p><span data-contrast=\"none\">First<\/span><span data-contrast=\"none\">,<\/span><span data-contrast=\"none\">&nbsp;we need to declare all the variable used in this file.<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:140,&quot;335559740&quot;:384}\">&nbsp;<\/span><\/p>\n<pre><span data-contrast=\"none\">variable<\/span><span data-contrast=\"none\">&nbsp;<\/span><span data-contrast=\"none\">\"<\/span><span data-contrast=\"none\">aws_region<\/span><span data-contrast=\"none\">\"<\/span><span data-contrast=\"none\">&nbsp;{}<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">variable<\/span><span data-contrast=\"none\">&nbsp;<\/span><span data-contrast=\"none\">\"profile\"<\/span><span data-contrast=\"none\">&nbsp;{}<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">variable<\/span><span data-contrast=\"none\">&nbsp;<\/span><span data-contrast=\"none\">\"<\/span><span data-contrast=\"none\">server_port<\/span><span data-contrast=\"none\">\"<\/span><span data-contrast=\"none\">&nbsp;{}<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">variable<\/span><span data-contrast=\"none\">&nbsp;<\/span><span data-contrast=\"none\">\"<\/span><span data-contrast=\"none\">key_name<\/span><span data-contrast=\"none\">\"<\/span><span data-contrast=\"none\">&nbsp;{}<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">variable<\/span><span data-contrast=\"none\">&nbsp;<\/span><span data-contrast=\"none\">\"<\/span><span data-contrast=\"none\">public_key<\/span><span data-contrast=\"none\">\"<\/span><span data-contrast=\"none\">&nbsp;{}<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">variable<\/span><span data-contrast=\"none\">&nbsp;<\/span><span data-contrast=\"none\">\"<\/span><span data-contrast=\"none\">private_key<\/span><span data-contrast=\"none\">\"<\/span><span data-contrast=\"none\">&nbsp;{}<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">variable<\/span><span data-contrast=\"none\">&nbsp;<\/span><span data-contrast=\"none\">\"<\/span><span data-contrast=\"none\">aws_access_key_id<\/span><span data-contrast=\"none\">\"<\/span><span data-contrast=\"none\">&nbsp;{}<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">variable<\/span><span data-contrast=\"none\">&nbsp;<\/span><span data-contrast=\"none\">\"<\/span><span data-contrast=\"none\">aws_secret_access_key<\/span><span data-contrast=\"none\">\"<\/span><span data-contrast=\"none\">&nbsp;{}<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">variable<\/span><span data-contrast=\"none\">&nbsp;<\/span><span data-contrast=\"none\">\"<\/span><span data-contrast=\"none\">aws_availability_zone<\/span><span data-contrast=\"none\">\"<\/span><span data-contrast=\"none\">&nbsp;{}<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">variable<\/span><span data-contrast=\"none\">&nbsp;<\/span><span data-contrast=\"none\">\"<\/span><span data-contrast=\"none\">aws_ami_id<\/span><span data-contrast=\"none\">\"<\/span><span data-contrast=\"none\">&nbsp;{}<\/span><span data-ccp-props=\"{}\">&nbsp;\n\n<\/span><\/pre>\n<p><span data-contrast=\"none\">Let&nbsp;<\/span><span data-contrast=\"none\">Terraform<\/span><span data-contrast=\"none\">&nbsp;know we will use the&nbsp;<\/span><span data-contrast=\"none\">aws<\/span><span data-contrast=\"none\">-provider.<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:140,&quot;335559740&quot;:384}\">&nbsp;<\/span><\/p>\n<pre><span data-contrast=\"none\">provider<\/span><span data-contrast=\"none\">&nbsp;<\/span><span data-contrast=\"none\">\"<\/span><span data-contrast=\"none\">aws<\/span><span data-contrast=\"none\">\"<\/span><span data-contrast=\"none\">&nbsp;<\/span><span data-contrast=\"none\">{<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp; profile =&nbsp;<\/span><span data-contrast=\"none\">var.profile<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp; region =&nbsp;<\/span><span data-contrast=\"none\">var.aws_region<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;<\/span><span data-contrast=\"none\">access_key<\/span><span data-contrast=\"none\">&nbsp;=&nbsp;<\/span><span data-contrast=\"none\">var.aws_access_key_id<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;<\/span><span data-contrast=\"none\">secret_key<\/span><span data-contrast=\"none\">&nbsp;=&nbsp;<\/span><span data-contrast=\"none\">var.aws_secret_access_key<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">}<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span><\/pre>\n<p><span data-contrast=\"none\">Add<\/span><span data-contrast=\"none\">&nbsp;a public key to&nbsp;<\/span><span data-contrast=\"none\">aws<\/span><span data-contrast=\"none\">&nbsp;for&nbsp;ssh&nbsp;access<\/span><span data-contrast=\"none\">.<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:140,&quot;335559740&quot;:384}\">&nbsp;<\/span><\/p>\n<pre><span data-contrast=\"none\">resource<\/span><span data-contrast=\"none\">&nbsp;<\/span><span data-contrast=\"none\">\"<\/span><span data-contrast=\"none\">aws_key_pair<\/span><span data-contrast=\"none\">\"<\/span><span data-contrast=\"none\">&nbsp;<\/span><span data-contrast=\"none\">\"deployer\"<\/span><span data-contrast=\"none\">&nbsp;<\/span><span data-contrast=\"none\">{<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;<\/span><span data-contrast=\"none\">key_name<\/span><span data-contrast=\"none\">&nbsp;=&nbsp;<\/span><span data-contrast=\"none\">var.key_name<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;<\/span><span data-contrast=\"none\">public_key<\/span><span data-contrast=\"none\">&nbsp;=&nbsp;<\/span><span data-contrast=\"none\">var.public<\/span><span data-contrast=\"none\">_key<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">}<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span><\/pre>\n<p><span data-contrast=\"none\">C<\/span><span data-contrast=\"none\">onfigure the firewall with some inbound(ingress) and outbound(egress) rules<\/span><span data-contrast=\"none\">.<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:140,&quot;335559740&quot;:384}\">&nbsp;<\/span><\/p>\n<pre><span data-contrast=\"none\">resource<\/span><span data-contrast=\"none\">&nbsp;<\/span><span data-contrast=\"none\">\"<\/span><span data-contrast=\"none\">aws_security_group<\/span><span data-contrast=\"none\">\"<\/span><span data-contrast=\"none\">&nbsp;<\/span><span data-contrast=\"none\">\"<\/span><span data-contrast=\"none\">devotest<\/span><span data-contrast=\"none\">\"<\/span><span data-contrast=\"none\">&nbsp;<\/span><span data-contrast=\"none\">{<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp; name = \"terraform-example-instance\"<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp; ingress {<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span data-contrast=\"none\">from_port<\/span><span data-contrast=\"none\">&nbsp;=&nbsp;<\/span><span data-contrast=\"none\">var.server<\/span><span data-contrast=\"none\">_port<\/span><span data-contrast=\"none\">&nbsp;<\/span><b><span data-contrast=\"none\">(A variable used as&nbsp;port&nbsp;from the world&nbsp;<\/span><\/b><b><span data-contrast=\"none\">accessable<\/span><\/b><b><span data-contrast=\"none\">)<\/span><\/b><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span data-contrast=\"none\">to_port<\/span><span data-contrast=\"none\">&nbsp;=&nbsp;<\/span><span data-contrast=\"none\">var.server<\/span><span data-contrast=\"none\">_port<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp; protocol = \"<\/span><span data-contrast=\"none\">tcp<\/span><span data-contrast=\"none\">\"<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span data-contrast=\"none\">cidr_blocks<\/span><span data-contrast=\"none\">&nbsp;= [\"0.0.0.0\/0\"]<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp; }<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp; ingress {<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span data-contrast=\"none\">from_port<\/span><span data-contrast=\"none\">&nbsp;=&nbsp;<\/span><span data-contrast=\"none\">22&nbsp;&nbsp;<\/span><b><span data-contrast=\"none\">(<\/span><\/b><b><span data-contrast=\"none\">Port 22 ingress from the world&nbsp;<\/span><\/b><b><span data-contrast=\"none\">accessable<\/span><\/b><b><span data-contrast=\"none\">)<\/span><\/b><span data-ccp-props=\"{}\">&nbsp;<\/span><\/pre>\n<pre><span data-contrast=\"none\">&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span data-contrast=\"none\">to_port<\/span><span data-contrast=\"none\">&nbsp;= 22<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp; protocol = \"<\/span><span data-contrast=\"none\">tcp<\/span><span data-contrast=\"none\">\"<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span data-contrast=\"none\">cidr_blocks<\/span><span data-contrast=\"none\">&nbsp;= [\"0.0.0.0\/0\"]<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp; }<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp; egress {<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span data-contrast=\"none\">from_port<\/span><span data-contrast=\"none\">&nbsp;=&nbsp;<\/span><span data-contrast=\"none\">80&nbsp;&nbsp;<\/span><b><span data-contrast=\"none\">(<\/span><\/b><b><span data-contrast=\"none\">Port 80 to egress)<\/span><\/b><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span data-contrast=\"none\">to_port<\/span><span data-contrast=\"none\">&nbsp;= 80<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp; protocol = \"<\/span><span data-contrast=\"none\">tcp<\/span><span data-contrast=\"none\">\"<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span data-contrast=\"none\">cidr_blocks<\/span><span data-contrast=\"none\">&nbsp;= [\"0.0.0.0\/0\"]<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp; }<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp; egress {<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span data-contrast=\"none\">from_port<\/span><span data-contrast=\"none\">&nbsp;= 443&nbsp;<\/span><b><span data-contrast=\"none\">(Port 443 to egress)<\/span><\/b><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span data-contrast=\"none\">to_port<\/span><span data-contrast=\"none\">&nbsp;= 443<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp; protocol = \"<\/span><span data-contrast=\"none\">tcp<\/span><span data-contrast=\"none\">\"<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span data-contrast=\"none\">cidr_blocks<\/span><span data-contrast=\"none\">&nbsp;= [\"0.0.0.0\/0\"]<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp; }<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">}<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span><\/pre>\n<p><span data-contrast=\"none\">We will create&nbsp;<\/span><span data-contrast=\"none\">two<\/span><span data-contrast=\"none\">&nbsp;centos 7.7 machine instance type t<\/span><span data-contrast=\"none\">2.micro<\/span><span data-contrast=\"none\">.<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:140,&quot;335559740&quot;:384}\">&nbsp;<\/span><span data-contrast=\"none\">T<\/span><span data-contrast=\"none\">2.micro<\/span><span data-contrast=\"none\">&nbsp;is a machine with 1 vCPU, 6CPU credits\/hour and 1GiB memory.&nbsp;<\/span><span data-contrast=\"none\">The var&nbsp;<\/span><span data-contrast=\"none\">aws_ami_id<\/span><span data-contrast=\"none\">&nbsp;gives us the centos 7.7 machines<\/span><span data-contrast=\"none\">.<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:140,&quot;335559740&quot;:384}\">&nbsp;<\/span><span data-contrast=\"none\">One is called&nbsp;<\/span><span data-contrast=\"none\">devotest_web<\/span><span data-contrast=\"none\">, the other <\/span><span data-contrast=\"none\">devotest_db<\/span><span data-contrast=\"none\">.<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:140,&quot;335559740&quot;:384}\">&nbsp;<\/span><\/p>\n<pre><span data-contrast=\"none\">resource<\/span><span data-contrast=\"none\">&nbsp;<\/span><span data-contrast=\"none\">\"<\/span><span data-contrast=\"none\">aws_instance<\/span><span data-contrast=\"none\">\"<\/span><span data-contrast=\"none\">&nbsp;<\/span><span data-contrast=\"none\">\"<\/span><span data-contrast=\"none\">devotest_web<\/span><span data-contrast=\"none\">\"<\/span><span data-contrast=\"none\">&nbsp;<\/span><span data-contrast=\"none\">{<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;<\/span><span data-contrast=\"none\">ami<\/span><span data-contrast=\"none\">&nbsp;=&nbsp;<\/span><span data-contrast=\"none\">var.aws_ami_id<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;<\/span><span data-contrast=\"none\">instance_type<\/span><span data-contrast=\"none\">&nbsp;= \"t<\/span><span data-contrast=\"none\">2.micro<\/span><span data-contrast=\"none\">\"<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;<\/span><span data-contrast=\"none\">key_name<\/span><span data-contrast=\"none\">&nbsp;=&nbsp;<\/span><span data-contrast=\"none\">var.key_name<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;<\/span><span data-contrast=\"none\">vpc_security_group_ids<\/span><span data-contrast=\"none\">&nbsp;= [aws_security_group.devotest.id]<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp; tags = {<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp; Name = \"terraform-<\/span><span data-contrast=\"none\">devotest<\/span><span data-contrast=\"none\">\"<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp; }<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;<\/span><span data-contrast=\"none\">root_block_device<\/span><span data-contrast=\"none\">&nbsp;{<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span data-contrast=\"none\">delete_on_termination<\/span><span data-contrast=\"none\">&nbsp;= true&nbsp;<\/span><b><span data-contrast=\"none\">(Delete also the volume when deleting the instance)<\/span><\/b><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp; }<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">}<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">resource<\/span><span data-contrast=\"none\">&nbsp;<\/span><span data-contrast=\"none\">\"<\/span><span data-contrast=\"none\">aws_instance<\/span><span data-contrast=\"none\">\"<\/span><span data-contrast=\"none\">&nbsp;<\/span><span data-contrast=\"none\">\"<\/span><span data-contrast=\"none\">devotest_db<\/span><span data-contrast=\"none\">\"<\/span><span data-contrast=\"none\">&nbsp;<\/span><span data-contrast=\"none\">{<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span><\/pre>\n<pre><span data-contrast=\"none\">&nbsp;&nbsp;<\/span><span data-contrast=\"none\">ami<\/span><span data-contrast=\"none\">&nbsp;=&nbsp;<\/span><span data-contrast=\"none\">var.aws_ami_id<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;<\/span><span data-contrast=\"none\">instance_type<\/span><span data-contrast=\"none\">&nbsp;= \"t<\/span><span data-contrast=\"none\">2.micro<\/span><span data-contrast=\"none\">\"<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;<\/span><span data-contrast=\"none\">key_name<\/span><span data-contrast=\"none\">&nbsp;=&nbsp;<\/span><span data-contrast=\"none\">var.key_name<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;<\/span><span data-contrast=\"none\">vpc_security_group_ids<\/span><span data-contrast=\"none\">&nbsp;= [aws_security_group.devotest.id]<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp; tags = {<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp; Name = \"terraform-<\/span><span data-contrast=\"none\">devotest<\/span><span data-contrast=\"none\">\"<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp; }<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;<\/span><span data-contrast=\"none\">root_block_device<\/span><span data-contrast=\"none\">&nbsp;{<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span data-contrast=\"none\">delete_on_termination<\/span><span data-contrast=\"none\">&nbsp;= true&nbsp;<\/span><b><span data-contrast=\"none\">(Delete also the volume when deleting the instance)<\/span><\/b><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp; }<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">}<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span><\/pre>\n<p><span data-contrast=\"none\">After the deployment of the machines<\/span><span data-contrast=\"none\">,<\/span><span data-contrast=\"none\">&nbsp;<\/span><span data-contrast=\"none\">we want to get back some information as variables<\/span><span data-contrast=\"none\">.<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:140,&quot;335559740&quot;:384}\">&nbsp;<\/span><\/p>\n<pre><b><span data-contrast=\"none\">public_ip_web<\/span><\/b><b><span data-contrast=\"none\">, the public&nbsp;<\/span><\/b><b><span data-contrast=\"none\">ip<\/span><\/b><b><span data-contrast=\"none\">&nbsp;of the&nbsp;<\/span><\/b><b><span data-contrast=\"none\">webserver.<\/span><\/b><span data-ccp-props=\"{&quot;201341983&quot;:2,&quot;335559740&quot;:285}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">output<\/span><span data-contrast=\"none\">&nbsp;<\/span><span data-contrast=\"none\">\"<\/span><span data-contrast=\"none\">public_ip_web<\/span><span data-contrast=\"none\">\"<\/span><span data-contrast=\"none\">&nbsp;<\/span><span data-contrast=\"none\">{<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">value =&nbsp;<\/span><span data-contrast=\"none\">aws_<\/span><span data-contrast=\"none\">instance.devotest<\/span><span data-contrast=\"none\">_web.public_ip<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">description = \"The public IP of the web server\"<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">}<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span><\/pre>\n<pre><b><span data-contrast=\"none\">name_web<\/span><\/b><b><span data-contrast=\"none\">, the name of the webserver<\/span><\/b><span data-ccp-props=\"{&quot;201341983&quot;:2,&quot;335559740&quot;:285}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">output<\/span><span data-contrast=\"none\">&nbsp;<\/span><span data-contrast=\"none\">\"<\/span><span data-contrast=\"none\">name_web<\/span><span data-contrast=\"none\">\"<\/span><span data-contrast=\"none\">&nbsp;<\/span><span data-contrast=\"none\">{<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp; value =&nbsp;<\/span><span data-contrast=\"none\">aws_<\/span><span data-contrast=\"none\">instance.devotest<\/span><span data-contrast=\"none\">_web.tags.Name<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp; description = \"The Name of the web server\"<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">}<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span><\/pre>\n<pre><b><span data-contrast=\"auto\">state_web<\/span><\/b><b><span data-contrast=\"auto\">, the state of the webserver instance<\/span><\/b><span data-ccp-props=\"{&quot;201341983&quot;:2,&quot;335559740&quot;:285}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">output<\/span><span data-contrast=\"none\">&nbsp;<\/span><span data-contrast=\"none\">\"<\/span><span data-contrast=\"none\">state_web<\/span><span data-contrast=\"none\">\"<\/span><span data-contrast=\"none\">&nbsp;<\/span><span data-contrast=\"none\">{<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp; value =&nbsp;<\/span><span data-contrast=\"none\">aws_<\/span><span data-contrast=\"none\">instance.devotest<\/span><span data-contrast=\"none\">_web.instance_state<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp; description = \"The state of the web server\"<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">}<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<b><span data-contrast=\"none\">public_ip_db<\/span><\/b><b><span data-contrast=\"none\">, the&nbsp;<\/span><\/b><b><span data-contrast=\"none\">ip<\/span><\/b><b><span data-contrast=\"none\">&nbsp;of the database instance<\/span><\/b><span data-ccp-props=\"{&quot;201341983&quot;:2,&quot;335559740&quot;:285}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">output<\/span><span data-contrast=\"none\">&nbsp;<\/span><span data-contrast=\"none\">\"<\/span><span data-contrast=\"none\">public_ip_db<\/span><span data-contrast=\"none\">\"<\/span><span data-contrast=\"none\">&nbsp;<\/span><span data-contrast=\"none\">{<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp; value =&nbsp;<\/span><span data-contrast=\"none\">aws_<\/span><span data-contrast=\"none\">instance.devotest<\/span><span data-contrast=\"none\">_db.public_ip<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp; description = \"The public IP of the&nbsp;<\/span><span data-contrast=\"none\">db<\/span><span data-contrast=\"none\">&nbsp;server\"<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">}<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<b><span data-contrast=\"none\">name_db<\/span><\/b><b><span data-contrast=\"none\">, the name of the database instance<\/span><\/b><span data-ccp-props=\"{&quot;201341983&quot;:2,&quot;335559740&quot;:285}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">output<\/span><span data-contrast=\"none\">&nbsp;<\/span><span data-contrast=\"none\">\"<\/span><span data-contrast=\"none\">name_db<\/span><span data-contrast=\"none\">\"<\/span><span data-contrast=\"none\">&nbsp;<\/span><span data-contrast=\"none\">{<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp; value =&nbsp;<\/span><span data-contrast=\"none\">aws_<\/span><span data-contrast=\"none\">instance.devotest<\/span><span data-contrast=\"none\">_db.tags.Name<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp; description = \"The Name of the&nbsp;<\/span><span data-contrast=\"none\">db<\/span><span data-contrast=\"none\">&nbsp;server\"<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">}<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<b><span data-contrast=\"auto\">state_de<\/span><\/b><b><span data-contrast=\"auto\">, the state of the database instance<\/span><\/b><span data-ccp-props=\"{&quot;201341983&quot;:2,&quot;335559740&quot;:285}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">output<\/span><span data-contrast=\"none\">&nbsp;<\/span><span data-contrast=\"none\">\"<\/span><span data-contrast=\"none\">state_db<\/span><span data-contrast=\"none\">\"<\/span><span data-contrast=\"none\">&nbsp;<\/span><span data-contrast=\"none\">{<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp; value =&nbsp;<\/span><span data-contrast=\"none\">aws_<\/span><span data-contrast=\"none\">instance.devotest<\/span><span data-contrast=\"none\">_db.instance_state<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp; description = \"The state of the&nbsp;<\/span><span data-contrast=\"none\">db<\/span><span data-contrast=\"none\">&nbsp;server\"<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">}<\/span><\/pre>\n<h4>b. Theterraform.tfvarsfile.<\/h4>\n<p><span data-contrast=\"none\">This file will be created from an Ansible template which makes it possible to pass Ansible variables to the <\/span><span data-contrast=\"none\">Terraform<\/span><span data-contrast=\"none\">&nbsp;part.<\/span><\/p>\n<p><span data-contrast=\"none\">This is the content of the&nbsp;<\/span><span data-contrast=\"none\">roles\/terra-provision\/templates\/terraform.tfvars.j<\/span><span data-contrast=\"none\">2 file, the template used to create the terraform\/<\/span><span data-contrast=\"none\">terraform.tfvars<\/span><span data-contrast=\"none\">&nbsp;file. The variables between \u201c<\/span><span data-contrast=\"none\">{{ }<\/span><span data-contrast=\"none\">}\u201d are Ansible variables and will be replaced with the values from&nbsp;<\/span><span data-contrast=\"none\">group_vars<\/span><span data-contrast=\"none\">\/all\/<\/span><span data-contrast=\"none\">vars.yml<\/span><span data-contrast=\"none\">&nbsp;and&nbsp;<\/span><span data-contrast=\"none\">group_vars<\/span><span data-contrast=\"none\">\/all\/<\/span><span data-contrast=\"none\">vault.yml<\/span><span data-contrast=\"none\">.<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:140,&quot;335559740&quot;:240}\">&nbsp;<\/span><\/p>\n<pre><span data-contrast=\"none\"># the location of the private key for connection to the servers<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559685&quot;:709,&quot;335559739&quot;:140,&quot;335559740&quot;:240}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">private_key<\/span><span data-contrast=\"none\">&nbsp;=\"~\/ansible-terraform-keys\/<\/span><span data-contrast=\"none\">id_rsa<\/span><span data-contrast=\"none\">\"<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559685&quot;:709,&quot;335559739&quot;:140,&quot;335559740&quot;:240}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">server_port<\/span><span data-contrast=\"none\">&nbsp;= 80<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559685&quot;:709,&quot;335559739&quot;:140,&quot;335559740&quot;:240}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">key_name<\/span><span data-contrast=\"none\">&nbsp;= \"<\/span><span data-contrast=\"none\">aws_deployer<\/span><span data-contrast=\"none\">\"<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559685&quot;:709,&quot;335559739&quot;:140,&quot;335559740&quot;:240}\">&nbsp;<\/span>\n<span data-contrast=\"none\"># public key,&nbsp;<\/span><span data-contrast=\"none\">aws_access_key_id<\/span><span data-contrast=\"none\">,&nbsp;<\/span><span data-contrast=\"none\">aws_secret_access_key<\/span><span data-contrast=\"none\">&nbsp;will be overwritten from ansible vault var<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559685&quot;:709,&quot;335559739&quot;:140,&quot;335559740&quot;:240}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">public_key<\/span><span data-contrast=\"none\">&nbsp;= \"<\/span><span data-contrast=\"none\">{{&nbsp;<\/span><span data-contrast=\"none\">public<\/span><span data-contrast=\"none\">_key<\/span><span data-contrast=\"none\">&nbsp;}}\"<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559685&quot;:709,&quot;335559739&quot;:140,&quot;335559740&quot;:240}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">aws_access_key_id<\/span><span data-contrast=\"none\">&nbsp;= \"<\/span><span data-contrast=\"none\">{{&nbsp;<\/span><span data-contrast=\"none\">aws<\/span><span data-contrast=\"none\">_access_key_id<\/span><span data-contrast=\"none\">&nbsp;}}\"<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559685&quot;:709,&quot;335559739&quot;:140,&quot;335559740&quot;:240}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">aws_secret_access_key<\/span><span data-contrast=\"none\">&nbsp;= \"<\/span><span data-contrast=\"none\">{{&nbsp;<\/span><span data-contrast=\"none\">aws<\/span><span data-contrast=\"none\">_secret_access_key<\/span><span data-contrast=\"none\">&nbsp;}}\"<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559685&quot;:709,&quot;335559739&quot;:140,&quot;335559740&quot;:240}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">profile = \"<\/span><span data-contrast=\"none\">{{&nbsp;<\/span><span data-contrast=\"none\">aws<\/span><span data-contrast=\"none\">_profile<\/span><span data-contrast=\"none\">&nbsp;}}\"<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559685&quot;:709,&quot;335559739&quot;:140,&quot;335559740&quot;:240}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">#&nbsp;<\/span><span data-contrast=\"none\">aws_ami_id<\/span><span data-contrast=\"none\">,&nbsp;<\/span><span data-contrast=\"none\">aws_region<\/span><span data-contrast=\"none\">&nbsp;will be overwritten from ansible var<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559685&quot;:709,&quot;335559739&quot;:140,&quot;335559740&quot;:240}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">aws_ami_id<\/span><span data-contrast=\"none\">&nbsp;= \"<\/span><span data-contrast=\"none\">{{&nbsp;<\/span><span data-contrast=\"none\">aws<\/span><span data-contrast=\"none\">_ami_id<\/span><span data-contrast=\"none\">&nbsp;}}\"<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559685&quot;:709,&quot;335559739&quot;:140,&quot;335559740&quot;:240}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">aws_region<\/span><span data-contrast=\"none\">&nbsp;= \"eu-west-1\"<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559685&quot;:709,&quot;335559739&quot;:140,&quot;335559740&quot;:240}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">aws_availability_zone<\/span><span data-contrast=\"none\">&nbsp;= \"eu-west-1a\"<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559685&quot;:709,&quot;335559739&quot;:140,&quot;335559740&quot;:240}\">&nbsp;<\/span><\/pre>\n<h3>2. The Ansible part.<span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:140,&quot;335559740&quot;:240}\"><\/span><\/h3>\n<p><span data-contrast=\"none\">The job of Ansible playbook is divided into 3 plays.<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:140,&quot;335559740&quot;:240}\">&nbsp;<\/span><\/p>\n<h4><b><i><span data-contrast=\"none\">a. First play use Terraform to deploy the machines<\/span><\/i><\/b><span data-contrast=\"none\">.<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:140,&quot;335559740&quot;:384}\"><\/span><\/h4>\n<pre><span data-contrast=\"none\">-&nbsp;<\/span><span data-contrast=\"none\">hosts<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">localhost&nbsp;&nbsp;<\/span><b><span data-contrast=\"none\">(<\/span><\/b><b><span data-contrast=\"none\">we run this playbook on our local machine)<\/span><\/b><span>&nbsp;\n<\/span><span data-contrast=\"none\">&nbsp; connection<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">local<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;<\/span><span data-contrast=\"none\">gather_facts<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">no<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp; tasks<\/span><span data-contrast=\"none\">:&nbsp;<\/span><b><span data-contrast=\"none\">The different tasks&nbsp;follow after&nbsp;this parameter.<\/span><\/b><span data-ccp-props=\"{}\">&nbsp;<\/span><\/pre>\n<p><span data-contrast=\"none\">First task:<\/span><span data-contrast=\"none\">&nbsp;<\/span><span data-contrast=\"none\">we create the variable file for Terraform from a template (see above)<\/span><span data-contrast=\"none\">.<\/span><span data-contrast=\"none\">&nbsp;This&nbsp;<\/span><span data-contrast=\"none\">can<\/span><span data-contrast=\"none\">&nbsp;be done via<\/span><span data-contrast=\"none\">&nbsp;<\/span><span data-contrast=\"none\">the terra-provision role.<\/span><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:140,&quot;335559740&quot;:240}\">&nbsp;<\/span><\/p>\n<pre><span data-contrast=\"none\">&nbsp; -&nbsp;<\/span><span data-contrast=\"none\">name<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">create&nbsp;<\/span><span data-contrast=\"none\">teraform.tfvars<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span data-contrast=\"none\">include_role<\/span><span data-contrast=\"none\">:<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp; name<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">terra-provision<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span><\/pre>\n<p><span data-contrast=\"none\">If the&nbsp;<\/span><span data-contrast=\"none\">T<\/span><span data-contrast=\"none\">erraform does not exist<\/span><span data-contrast=\"none\">,<\/span><span data-contrast=\"none\">&nbsp;we run&nbsp;<\/span><span data-contrast=\"none\">the&nbsp;<\/span><span data-contrast=\"none\">Terrafrom<\/span><span data-contrast=\"none\">&nbsp;<\/span><span data-contrast=\"none\">init<\/span><span data-contrast=\"none\">&nbsp;command to initialise&nbsp;<\/span><span data-contrast=\"none\">T<\/span><span data-contrast=\"none\">erraform<\/span><span data-contrast=\"none\">.&nbsp;<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span><\/p>\n<pre><span data-contrast=\"none\">&nbsp; -&nbsp;<\/span><span data-contrast=\"none\">name<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">init<\/span><span data-contrast=\"none\">&nbsp;the terraform&nbsp;<\/span><span data-contrast=\"none\">if .terraform<\/span><span data-contrast=\"none\">&nbsp;is not there<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp; shell<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">terraform&nbsp;<\/span><span data-contrast=\"none\">init<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span data-contrast=\"none\">args<\/span><span data-contrast=\"none\">:<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span data-contrast=\"none\">chdir<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">\"<\/span><span data-contrast=\"none\">{{&nbsp;<\/span><span data-contrast=\"none\">playbook<\/span><span data-contrast=\"none\">_dir<\/span><span data-contrast=\"none\">&nbsp;}}\/terraform\/\"<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp; creates<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">\"<\/span><span data-contrast=\"none\">{{&nbsp;<\/span><span data-contrast=\"none\">playbook<\/span><span data-contrast=\"none\">_dir<\/span><span data-contrast=\"none\">&nbsp;}}\/terraform\/.terraform\/\"<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span><\/pre>\n<p><span data-contrast=\"none\">We run the Terraform script. This will read the terraform\/main.tf file and deploys whatever is configured.<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span><\/p>\n<pre><span data-contrast=\"none\">-&nbsp;<\/span><span data-contrast=\"none\">name<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">run the terraform script<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp; terraform<\/span><span data-contrast=\"none\">:<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span data-contrast=\"none\">project_path<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">\"<\/span><span data-contrast=\"none\">{{&nbsp;<\/span><span data-contrast=\"none\">playbook<\/span><span data-contrast=\"none\">_dir<\/span><span data-contrast=\"none\">&nbsp;}}\/terraform\/\"<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp; state<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">\"<\/span><span data-contrast=\"none\">{{&nbsp;<\/span><span data-contrast=\"none\">aws<\/span><span data-contrast=\"none\">_instance_state<\/span><span data-contrast=\"none\">&nbsp;}}\"<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp; variables<\/span><span data-contrast=\"none\">:<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span data-contrast=\"none\">aws_region<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">\"<\/span><span data-contrast=\"none\">{{&nbsp;<\/span><span data-contrast=\"none\">aws<\/span><span data-contrast=\"none\">_region<\/span><span data-contrast=\"none\">&nbsp;}}\"<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span data-contrast=\"none\">aws_access_key_id<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">\"<\/span><span data-contrast=\"none\">{{&nbsp;<\/span><span data-contrast=\"none\">aws<\/span><span data-contrast=\"none\">_access_key_id<\/span><span data-contrast=\"none\">&nbsp;}}\"<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span data-contrast=\"none\">aws_secret_access_key<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">\"<\/span><span data-contrast=\"none\">{{&nbsp;<\/span><span data-contrast=\"none\">aws<\/span><span data-contrast=\"none\">_secret_access_key<\/span><span data-contrast=\"none\">&nbsp;}}\"<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span data-contrast=\"none\">aws_ami_id<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">\"<\/span><span data-contrast=\"none\">{{&nbsp;<\/span><span data-contrast=\"none\">aws<\/span><span data-contrast=\"none\">_ami_id<\/span><span data-contrast=\"none\">&nbsp;}}\"<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span data-contrast=\"none\">public_key<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">\"<\/span><span data-contrast=\"none\">{{&nbsp;<\/span><span data-contrast=\"none\">public<\/span><span data-contrast=\"none\">_key<\/span><span data-contrast=\"none\">&nbsp;}}\"<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp; register<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">terra_result<\/span><span data-contrast=\"none\">&nbsp;<\/span><b><span data-contrast=\"none\">(The output will be added to the&nbsp;<\/span><\/b><b><span data-contrast=\"none\">terra_result<\/span><\/b><b><span data-contrast=\"none\">&nbsp;variable)<\/span><\/b><span data-ccp-props=\"{}\">&nbsp;<\/span><\/pre>\n<p><span data-contrast=\"none\">For debug we show the result from the previous&nbsp;<\/span><span data-contrast=\"none\">T<\/span><span data-contrast=\"none\">erraform command.<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span><\/p>\n<pre><span data-contrast=\"none\">-&nbsp;<\/span><span data-contrast=\"none\">name<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">show&nbsp;<\/span><span data-contrast=\"none\">terra_result<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp; debug<\/span><span data-contrast=\"none\">:<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp; var<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">terra_result<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span><\/pre>\n<p><span data-contrast=\"none\">Out of the result<\/span><span data-contrast=\"none\">,<\/span><span data-contrast=\"none\">&nbsp;we retrieve the&nbsp;<\/span><span data-contrast=\"none\">ip<\/span><span data-contrast=\"none\">&nbsp;address form the web- and database<\/span><span data-contrast=\"none\">&nbsp;<\/span><span data-contrast=\"none\">server.<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span><\/p>\n<pre><span data-contrast=\"none\">-&nbsp;<\/span><span data-contrast=\"none\">name<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">set&nbsp;<\/span><span data-contrast=\"none\">vm_ip<\/span><span data-contrast=\"none\">&nbsp;\/ name<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;<\/span><span data-contrast=\"none\">set_fact<\/span><span data-contrast=\"none\">:<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span data-contrast=\"none\">vm_ip_web<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">\"<\/span><span data-contrast=\"none\">{{&nbsp;<\/span><span data-contrast=\"none\">terra<\/span><span data-contrast=\"none\">_result.outputs.public_ip_web.value<\/span><span data-contrast=\"none\">&nbsp;}}\"<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span data-contrast=\"none\">vm_ip_db<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">\"<\/span><span data-contrast=\"none\">{{&nbsp;<\/span><span data-contrast=\"none\">terra<\/span><span data-contrast=\"none\">_result.outputs.public_ip_db.value<\/span><span data-contrast=\"none\">&nbsp;}}\"<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp; when<\/span><span data-contrast=\"none\">:<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp; -&nbsp;<\/span><span data-contrast=\"none\">terra_<\/span><span data-contrast=\"none\">result.outputs<\/span><span data-contrast=\"none\">.state_web<\/span><span data-contrast=\"none\">&nbsp;is defined<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">-&nbsp;<\/span><span data-contrast=\"none\">terra_<\/span><span data-contrast=\"none\">result.outputs<\/span><span data-contrast=\"none\">.state_db<\/span><span data-contrast=\"none\">&nbsp;is defined<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span><\/pre>\n<p><span data-contrast=\"none\">In the next block<\/span><span data-contrast=\"none\">,<\/span><span data-contrast=\"none\">&nbsp;we create a dynamic inventory from the&nbsp;<\/span><span data-contrast=\"none\">T<\/span><span data-contrast=\"none\">erraform result, the&nbsp;<\/span><span data-contrast=\"none\">ip\u2019s<\/span><span data-contrast=\"none\">&nbsp;will be stored in the&nbsp;<\/span><span data-contrast=\"none\">A<\/span><span data-contrast=\"none\">nsible inventory so it can be used in the next plays.<\/span><span data-contrast=\"none\">&nbsp;<\/span><span data-contrast=\"none\">We create an inventory for the webserver and another for the <\/span><span data-contrast=\"none\">database server<\/span><span data-contrast=\"none\">.<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span><\/p>\n<pre><span data-contrast=\"none\">-&nbsp;<\/span><span data-contrast=\"none\">name<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">create the dynamic inventory<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp; block<\/span><span data-contrast=\"none\">:<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp; -&nbsp;<\/span><span data-contrast=\"none\">name<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">remove&nbsp;old&nbsp;dynamic&nbsp;<\/span><span data-contrast=\"none\">group_vars<\/span><span data-contrast=\"none\">&nbsp;file<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; file<\/span><span data-contrast=\"none\">:<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; path<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">\"<\/span><span data-contrast=\"none\">{{ item<\/span><span data-contrast=\"none\">&nbsp;}}\"<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; state<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">absent<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span data-contrast=\"none\">with_items<\/span><span data-contrast=\"none\">:<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&nbsp;<\/span><span data-contrast=\"none\">group_vars<\/span><span data-contrast=\"none\">\/<\/span><span data-contrast=\"none\">dynamic_web.yml<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&nbsp;<\/span><span data-contrast=\"none\">group_vars<\/span><span data-contrast=\"none\">\/<\/span><span data-contrast=\"none\">dynamic_db.yml<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp; -&nbsp;<\/span><span data-contrast=\"none\">name<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">create&nbsp;new&nbsp;centos&nbsp;<\/span><span data-contrast=\"none\">group_vars<\/span><span data-contrast=\"none\">&nbsp;file<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; file<\/span><span data-contrast=\"none\">:<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; path<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">\"<\/span><span data-contrast=\"none\">{{ item<\/span><span data-contrast=\"none\">&nbsp;}}\"<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; state<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">touch<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span data-contrast=\"none\">with_items<\/span><span data-contrast=\"none\">:<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&nbsp;<\/span><span data-contrast=\"none\">group_vars<\/span><span data-contrast=\"none\">\/<\/span><span data-contrast=\"none\">dynamic_web.yml<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&nbsp;<\/span><span data-contrast=\"none\">group_vars<\/span><span data-contrast=\"none\">\/<\/span><span data-contrast=\"none\">dynamic_db.yml<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">-&nbsp;<\/span><span data-contrast=\"none\">name<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">create the inventory directory<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp; file<\/span><span data-contrast=\"none\">:<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp; path<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">inventory\/<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp; state<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">directory<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span><\/pre>\n<pre><span data-contrast=\"none\">-&nbsp;<\/span><span data-contrast=\"none\">name<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">remove&nbsp;old&nbsp;dynamic host file<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp; file<\/span><span data-contrast=\"none\">:<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp; path<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">inventory\/hosts<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp; state<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">absent<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">-&nbsp;<\/span><span data-contrast=\"none\">name<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">create&nbsp;new&nbsp;dynamic host file<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp; file<\/span><span data-contrast=\"none\">:<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp; path<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">inventory\/hosts<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span><\/pre>\n<pre><span data-contrast=\"none\">&nbsp;&nbsp;&nbsp; state<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">touch<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">-&nbsp;<\/span><span data-contrast=\"none\">name<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">add&nbsp;retrieved&nbsp;IP to file<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;<\/span><span data-contrast=\"none\">blockinfile<\/span><span data-contrast=\"none\">:<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp; path<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">group_vars<\/span><span data-contrast=\"none\">\/<\/span><span data-contrast=\"none\">dynamic_web.yml<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp; marker<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">\"\"<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp; block<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">|<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ---<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span><\/pre>\n<pre><span data-contrast=\"none\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span data-contrast=\"none\">ansible_host<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">{{&nbsp;<\/span><span data-contrast=\"none\">vm<\/span><span data-contrast=\"none\">_ip_web<\/span><span data-contrast=\"none\">&nbsp;}}<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span data-contrast=\"none\">ansible_user<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">{{&nbsp;<\/span><span data-contrast=\"none\">remote<\/span><span data-contrast=\"none\">_user<\/span><span data-contrast=\"none\">[hypervisor] }}<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span data-contrast=\"none\">become_user<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">{{&nbsp;<\/span><span data-contrast=\"none\">remote<\/span><span data-contrast=\"none\">_user<\/span><span data-contrast=\"none\">[hypervisor] }}<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span data-contrast=\"none\">remote_user<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">{{&nbsp;<\/span><span data-contrast=\"none\">remote<\/span><span data-contrast=\"none\">_user<\/span><span data-contrast=\"none\">[hypervisor] }}<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span data-contrast=\"none\">become:<\/span><span data-contrast=\"none\">&nbsp;true<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span><\/pre>\n<pre><span data-contrast=\"none\">-&nbsp;<\/span><span data-contrast=\"none\">name<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">add&nbsp;retrieved&nbsp;IP to file<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;<\/span><span data-contrast=\"none\">blockinfile<\/span><span data-contrast=\"none\">:<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp; path<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">group_vars<\/span><span data-contrast=\"none\">\/<\/span><span data-contrast=\"none\">dynamic_db.yml<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp; marker<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">\"\"<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp; block<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">|<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ---<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span data-contrast=\"none\">ansible_host<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">{{&nbsp;<\/span><span data-contrast=\"none\">vm<\/span><span data-contrast=\"none\">_ip_db<\/span><span data-contrast=\"none\">&nbsp;}}<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span data-contrast=\"none\">ansible_user<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">{{&nbsp;<\/span><span data-contrast=\"none\">remote<\/span><span data-contrast=\"none\">_user<\/span><span data-contrast=\"none\">[hypervisor] }}<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span data-contrast=\"none\">become_user<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">{{&nbsp;<\/span><span data-contrast=\"none\">remote<\/span><span data-contrast=\"none\">_user<\/span><span data-contrast=\"none\">[hypervisor] }}<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span data-contrast=\"none\">remote_user<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">{{&nbsp;<\/span><span data-contrast=\"none\">remote<\/span><span data-contrast=\"none\">_user<\/span><span data-contrast=\"none\">[hypervisor] }}<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span data-contrast=\"none\">become:<\/span><span data-contrast=\"none\">&nbsp;true<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...<\/span><span data-ccp-props=\"{}\">&nbsp;\n<\/span>\n<span data-contrast=\"none\">-&nbsp;<\/span><span data-contrast=\"none\">name<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">add&nbsp;retrieved&nbsp;IP to file<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;<\/span><span data-contrast=\"none\">blockinfile<\/span><span data-contrast=\"none\">:<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp; path<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">\"inventory\/hosts\"<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp; marker<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">\"\"<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp; block<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">|<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [<\/span><span data-contrast=\"none\">dynamic_web<\/span><span data-contrast=\"none\">]<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span data-contrast=\"none\">{{&nbsp;<\/span><span data-contrast=\"none\">vm<\/span><span data-contrast=\"none\">_ip_web<\/span><span data-contrast=\"none\">&nbsp;}}<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n<span data-contrast=\"auto\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [<\/span><span data-contrast=\"none\">dynamic_db<\/span><span data-contrast=\"none\">]<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span data-contrast=\"none\">{{&nbsp;<\/span><span data-contrast=\"none\">vm<\/span><span data-contrast=\"none\">_ip_db<\/span><span data-contrast=\"none\">&nbsp;}}<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n<span data-contrast=\"auto\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span><\/pre>\n<pre><span data-contrast=\"none\">-&nbsp;<\/span><span data-contrast=\"none\">name<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">Add&nbsp;host<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;<\/span><span data-contrast=\"none\">add_host<\/span><span data-contrast=\"none\">:<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp; hostname<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">\"<\/span><span data-contrast=\"none\">{{&nbsp;<\/span><span data-contrast=\"none\">vm<\/span><span data-contrast=\"none\">_ip_web<\/span><span data-contrast=\"none\">&nbsp;}}\"<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span data-contrast=\"none\">groupname<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">dynamic_web<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span data-contrast=\"none\">remote_user<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">\"<\/span><span data-contrast=\"none\">{{&nbsp;<\/span><span data-contrast=\"none\">remote<\/span><span data-contrast=\"none\">_user<\/span><span data-contrast=\"none\">[hypervisor] }}\"<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">-&nbsp;<\/span><span data-contrast=\"none\">name<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">Add&nbsp;host<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;<\/span><span data-contrast=\"none\">add_host<\/span><span data-contrast=\"none\">:<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp; hostname<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">\"<\/span><span data-contrast=\"none\">{{&nbsp;<\/span><span data-contrast=\"none\">vm<\/span><span data-contrast=\"none\">_ip_db<\/span><span data-contrast=\"none\">&nbsp;}}\"<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span data-contrast=\"none\">groupname<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">dynamic_db<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span data-contrast=\"none\">remote_user<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">\"<\/span><span data-contrast=\"none\">{{&nbsp;<\/span><span data-contrast=\"none\">remote<\/span><span data-contrast=\"none\">_user<\/span><span data-contrast=\"none\">[hypervisor] }}\"<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp; when<\/span><span data-contrast=\"none\">:<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span><\/pre>\n<pre><span data-contrast=\"none\">&nbsp;&nbsp;&nbsp; -&nbsp;<\/span><span data-contrast=\"none\">terra_<\/span><span data-contrast=\"none\">result.outputs<\/span><span data-contrast=\"none\">.state_web<\/span><span data-contrast=\"none\">&nbsp;is defined<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp; -&nbsp;<\/span><span data-contrast=\"none\">terra_<\/span><span data-contrast=\"none\">result.outputs<\/span><span data-contrast=\"none\">.state_db<\/span><span data-contrast=\"none\">&nbsp;is defined<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n\n<span data-contrast=\"none\">-&nbsp;<\/span><span data-contrast=\"none\">name<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">Collect facts again<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp; setup<\/span><span data-contrast=\"none\">:<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span><\/pre>\n<p><i><span data-contrast=\"none\">As a last step<\/span><\/i><i><span data-contrast=\"none\">,<\/span><\/i><i><span data-contrast=\"none\">&nbsp;we will check if we can access the webserver via&nbsp;ssh.<\/span><\/i><span data-ccp-props=\"{}\">&nbsp;<\/span><\/p>\n<pre><span data-contrast=\"none\">################################<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\"># pause #<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">################################<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">-&nbsp;<\/span><span data-contrast=\"none\">name<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">Wait 300 seconds for port 22 to become open and contains the string \"OpenSSH\"<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;<\/span><span data-contrast=\"none\">wait_for<\/span><span data-contrast=\"none\">:<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp; port<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">22<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp; host<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">'<\/span><span data-contrast=\"none\">{{&nbsp;<\/span><span data-contrast=\"none\">vm<\/span><span data-contrast=\"none\">_ip_web<\/span><span data-contrast=\"none\">&nbsp;}}'<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;<\/span><span data-contrast=\"none\">search_regex<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">OpenSSH<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp; delay<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">10<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp; vars<\/span><span data-contrast=\"none\">:<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;<\/span><span data-contrast=\"none\">ansible_connection<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">local<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">when<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">vm_ip_web<\/span><span data-contrast=\"none\">&nbsp;is defined<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span><\/pre>\n<h4><b><i><span data-contrast=\"none\">b. A second play installs the software on the webserver, configure it and start it.<\/span><\/i><\/b><span data-ccp-props=\"{&quot;201341983&quot;:0,&quot;335559739&quot;:140,&quot;335559740&quot;:384}\"><\/span><\/h4>\n<p>Use the&nbsp;dynamic_web&nbsp;inventory<\/p>\n<pre><span data-contrast=\"none\">-&nbsp;<\/span><span data-contrast=\"none\">hosts<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">dynamic_web<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span><\/pre>\n<p>Load the role webserver.<\/p>\n<pre><span data-contrast=\"none\">&nbsp; tasks<\/span><span data-contrast=\"none\">:<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp; -&nbsp;<\/span><span data-contrast=\"none\">name<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">create a website<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span data-contrast=\"none\">include_role<\/span><span data-contrast=\"none\">:<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span>\n\n<span data-contrast=\"none\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name<\/span><span data-contrast=\"none\">:&nbsp;<\/span><span data-contrast=\"none\">webserver<\/span><span data-ccp-props=\"{}\">&nbsp;<\/span><\/pre>\n<p>The content of the webserver role can be found in roles\/webserver\/tasks\/main.yml<\/p>\n<p>You will see that this role does a yum update (which&nbsp;can take some time), installs the apache webserver (httpd), creates a website configuration file in \u2018\/etc\/httpd\/conf.d\/\u2019, creates a html page to serve, and finally restarts the webserver.<\/p>\n<p>This was the last episode of the&nbsp;<a href=\"https:\/\/belgium.devoteam.com\/blog\/ansible-and-terraform-the-best-of-both-worlds\/\">Ansible Terraform series<\/a>. You can try to extend the code by trying the following:<\/p>\n<ul>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"1\" data-aria-posinset=\"1\" data-aria-level=\"1\">database server:\n<ul>\n<li>add a password for the root user.<\/li>\n<li>create some tables with content in the&nbsp;Devoteam&nbsp;database.<\/li>\n<li>open ports for connection from webserver to&nbsp;database&nbsp;server on port 3306.<\/li>\n<\/ul>\n<\/li>\n<li data-leveltext=\"\uf0b7\" data-font=\"Symbol\" data-listid=\"1\" data-aria-posinset=\"1\" data-aria-level=\"1\">webserver:\n<ul>\n<li>create a connection to the database server and show some content of it on the webpage.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<div class=\"block-fullwidth-dark\">\n<h3>If you have any questions or need help with your tools, don&#8217;t hesitate to contact Hans Neefs via <a href=\"mailto:hans.neefs@devoteam.com\">mail<\/a> or <a href=\"tel:+32(0)477 99 65 44\">phone<\/a>.<\/h3>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>The magic explained In the previous episode, we&nbsp;cloned&nbsp;the code from&nbsp;Github,&nbsp;modified some variables and provisioned&nbsp;and deployed two servers on AWS.&nbsp;In this final episode we will explain what was going on behind the scenes and discuss the Terraform and Ansible part. 1. The Terraform part The most important files of the&nbsp;Terraform&nbsp;code can be broken down into two [&hellip;]<\/p>\n","protected":false},"featured_media":136907,"template":"","categories":[1060],"tags":[1715,1728],"industry":[],"class_list":["post-513614","expert-view","type-expert-view","status-publish","has-post-thumbnail","hentry","category-cloud-native-architecture","tag-belgium-be","tag-cloud-native-architecture-be"],"acf":[],"cards":"\n\t<div class=\"single-post-card\">\n\n\t\t<figure class=\"wp-block-post-featured-image\"><a href=\"https:\/\/devoteam.info\/be\/expert-view\/ansible-and-terraform-episode-3\/\" target=\"_self\" ><img width=\"2560\" height=\"1440\" src=\"https:\/\/devoteam.info\/wp-content\/uploads\/2024\/11\/Ansible-Terraform-image_BW-scaled-1.png\" class=\"attachment-post-thumbnail size-post-thumbnail wp-post-image\" alt=\"Ansible and Terraform: Episode 3\" style=\"aspect-ratio:4\/3;width:100%;object-fit:cover;\" decoding=\"async\" loading=\"lazy\" srcset=\"https:\/\/devoteam.info\/wp-content\/uploads\/2024\/11\/Ansible-Terraform-image_BW-scaled-1.png 2560w, https:\/\/devoteam.info\/wp-content\/uploads\/2024\/11\/Ansible-Terraform-image_BW-scaled-1-300x169.png 300w, https:\/\/devoteam.info\/wp-content\/uploads\/2024\/11\/Ansible-Terraform-image_BW-scaled-1-1024x576.png 1024w, https:\/\/devoteam.info\/wp-content\/uploads\/2024\/11\/Ansible-Terraform-image_BW-scaled-1-768x432.png 768w, https:\/\/devoteam.info\/wp-content\/uploads\/2024\/11\/Ansible-Terraform-image_BW-scaled-1-1536x864.png 1536w, https:\/\/devoteam.info\/wp-content\/uploads\/2024\/11\/Ansible-Terraform-image_BW-scaled-1-2048x1152.png 2048w\" sizes=\"auto, (max-width: 2560px) 100vw, 2560px\" \/><\/a><\/figure>\n\n\t\t\n\t\t<div class=\"wp-block-group is-vertical is-layout-flex wp-container-core-group-is-layout-43282307 wp-block-group-is-layout-flex\">\n\t<p style=\"font-style:normal;font-weight:700\" class=\"has-link-color wp-elements-1 wp-block-lp-post-type has-text-color has-primary-color has-small-font-size\">Expert View<\/p>\n\n\t\t\n\t\t<h3 style=\"font-style:normal;font-weight:400\" class=\"wp-block-post-title has-base-font-size\"><a href=\"https:\/\/devoteam.info\/be\/expert-view\/ansible-and-terraform-episode-3\/\" target=\"_self\" >Ansible and Terraform: Episode 3<\/a><\/h3><\/div>\n\t\t\n\t<\/div>\n\n","yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v28.4 (Yoast SEO v28.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Ansible and Terraform: Episode 3 | Devoteam<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/devoteam.info\/be\/expert-view\/ansible-and-terraform-episode-3\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Ansible and Terraform: Episode 3\" \/>\n<meta property=\"og:description\" content=\"The magic explained In the previous episode, we&nbsp;cloned&nbsp;the code from&nbsp;Github,&nbsp;modified some variables and provisioned&nbsp;and deployed two servers on AWS.&nbsp;In this final episode we will explain what was going on behind the scenes and discuss the Terraform and Ansible part. 1. The Terraform part The most important files of the&nbsp;Terraform&nbsp;code can be broken down into two [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/devoteam.info\/be\/expert-view\/ansible-and-terraform-episode-3\/\" \/>\n<meta property=\"og:site_name\" content=\"Devoteam\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"14 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/devoteam.info\\\/be\\\/expert-view\\\/ansible-and-terraform-episode-3\\\/\",\"url\":\"https:\\\/\\\/devoteam.info\\\/be\\\/expert-view\\\/ansible-and-terraform-episode-3\\\/\",\"name\":\"Ansible and Terraform: Episode 3 | Devoteam\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/devoteam.info\\\/be\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/devoteam.info\\\/be\\\/expert-view\\\/ansible-and-terraform-episode-3\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/devoteam.info\\\/be\\\/expert-view\\\/ansible-and-terraform-episode-3\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/devoteam.info\\\/wp-content\\\/uploads\\\/2024\\\/11\\\/Ansible-Terraform-image_BW-scaled-1.png\",\"datePublished\":\"2020-02-11T08:01:02+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/devoteam.info\\\/be\\\/expert-view\\\/ansible-and-terraform-episode-3\\\/#breadcrumb\"},\"inLanguage\":\"en-BE\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/devoteam.info\\\/be\\\/expert-view\\\/ansible-and-terraform-episode-3\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-BE\",\"@id\":\"https:\\\/\\\/devoteam.info\\\/be\\\/expert-view\\\/ansible-and-terraform-episode-3\\\/#primaryimage\",\"url\":\"https:\\\/\\\/devoteam.info\\\/wp-content\\\/uploads\\\/2024\\\/11\\\/Ansible-Terraform-image_BW-scaled-1.png\",\"contentUrl\":\"https:\\\/\\\/devoteam.info\\\/wp-content\\\/uploads\\\/2024\\\/11\\\/Ansible-Terraform-image_BW-scaled-1.png\",\"width\":2560,\"height\":1440},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/devoteam.info\\\/be\\\/expert-view\\\/ansible-and-terraform-episode-3\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/devoteam.info\\\/be\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Expert View\",\"item\":\"https:\\\/\\\/devoteam.info\\\/be\\\/expert-view\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Ansible and Terraform: Episode 3\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/devoteam.info\\\/be\\\/#website\",\"url\":\"https:\\\/\\\/devoteam.info\\\/be\\\/\",\"name\":\"Devoteam\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/devoteam.info\\\/be\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-BE\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Ansible and Terraform: Episode 3 | Devoteam","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:\/\/devoteam.info\/be\/expert-view\/ansible-and-terraform-episode-3\/","og_locale":"en_US","og_type":"article","og_title":"Ansible and Terraform: Episode 3","og_description":"The magic explained In the previous episode, we&nbsp;cloned&nbsp;the code from&nbsp;Github,&nbsp;modified some variables and provisioned&nbsp;and deployed two servers on AWS.&nbsp;In this final episode we will explain what was going on behind the scenes and discuss the Terraform and Ansible part. 1. The Terraform part The most important files of the&nbsp;Terraform&nbsp;code can be broken down into two [&hellip;]","og_url":"https:\/\/devoteam.info\/be\/expert-view\/ansible-and-terraform-episode-3\/","og_site_name":"Devoteam","twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"14 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/devoteam.info\/be\/expert-view\/ansible-and-terraform-episode-3\/","url":"https:\/\/devoteam.info\/be\/expert-view\/ansible-and-terraform-episode-3\/","name":"Ansible and Terraform: Episode 3 | Devoteam","isPartOf":{"@id":"https:\/\/devoteam.info\/be\/#website"},"primaryImageOfPage":{"@id":"https:\/\/devoteam.info\/be\/expert-view\/ansible-and-terraform-episode-3\/#primaryimage"},"image":{"@id":"https:\/\/devoteam.info\/be\/expert-view\/ansible-and-terraform-episode-3\/#primaryimage"},"thumbnailUrl":"https:\/\/devoteam.info\/wp-content\/uploads\/2024\/11\/Ansible-Terraform-image_BW-scaled-1.png","datePublished":"2020-02-11T08:01:02+00:00","breadcrumb":{"@id":"https:\/\/devoteam.info\/be\/expert-view\/ansible-and-terraform-episode-3\/#breadcrumb"},"inLanguage":"en-BE","potentialAction":[{"@type":"ReadAction","target":["https:\/\/devoteam.info\/be\/expert-view\/ansible-and-terraform-episode-3\/"]}]},{"@type":"ImageObject","inLanguage":"en-BE","@id":"https:\/\/devoteam.info\/be\/expert-view\/ansible-and-terraform-episode-3\/#primaryimage","url":"https:\/\/devoteam.info\/wp-content\/uploads\/2024\/11\/Ansible-Terraform-image_BW-scaled-1.png","contentUrl":"https:\/\/devoteam.info\/wp-content\/uploads\/2024\/11\/Ansible-Terraform-image_BW-scaled-1.png","width":2560,"height":1440},{"@type":"BreadcrumbList","@id":"https:\/\/devoteam.info\/be\/expert-view\/ansible-and-terraform-episode-3\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/devoteam.info\/be\/"},{"@type":"ListItem","position":2,"name":"Expert View","item":"https:\/\/devoteam.info\/be\/expert-view\/"},{"@type":"ListItem","position":3,"name":"Ansible and Terraform: Episode 3"}]},{"@type":"WebSite","@id":"https:\/\/devoteam.info\/be\/#website","url":"https:\/\/devoteam.info\/be\/","name":"Devoteam","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/devoteam.info\/be\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-BE"}]}},"uagb_featured_image_src":{"full":["https:\/\/devoteam.info\/wp-content\/uploads\/2024\/11\/Ansible-Terraform-image_BW-scaled-1.png",2560,1440,false],"thumbnail":["https:\/\/devoteam.info\/wp-content\/uploads\/2024\/11\/Ansible-Terraform-image_BW-scaled-1-150x150.png",150,150,true],"medium":["https:\/\/devoteam.info\/wp-content\/uploads\/2024\/11\/Ansible-Terraform-image_BW-scaled-1-300x169.png",300,169,true],"medium_large":["https:\/\/devoteam.info\/wp-content\/uploads\/2024\/11\/Ansible-Terraform-image_BW-scaled-1-768x432.png",768,432,true],"large":["https:\/\/devoteam.info\/wp-content\/uploads\/2024\/11\/Ansible-Terraform-image_BW-scaled-1-1024x576.png",1024,576,true],"1536x1536":["https:\/\/devoteam.info\/wp-content\/uploads\/2024\/11\/Ansible-Terraform-image_BW-scaled-1-1536x864.png",1536,864,true],"2048x2048":["https:\/\/devoteam.info\/wp-content\/uploads\/2024\/11\/Ansible-Terraform-image_BW-scaled-1-2048x1152.png",2048,1152,true]},"uagb_author_info":{"display_name":"wcraye","author_link":"https:\/\/devoteam.info\/be\/author\/"},"uagb_comment_info":0,"uagb_excerpt":"The magic explained In the previous episode, we&nbsp;cloned&nbsp;the code from&nbsp;Github,&nbsp;modified some variables and provisioned&nbsp;and deployed two servers on AWS.&nbsp;In this final episode we will explain what was going on behind the scenes and discuss the Terraform and Ansible part. 1. The Terraform part The most important files of the&nbsp;Terraform&nbsp;code can be broken down into two&hellip;","_links":{"self":[{"href":"https:\/\/devoteam.info\/be\/wp-json\/wp\/v2\/expert-view\/513614","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devoteam.info\/be\/wp-json\/wp\/v2\/expert-view"}],"about":[{"href":"https:\/\/devoteam.info\/be\/wp-json\/wp\/v2\/types\/expert-view"}],"version-history":[{"count":0,"href":"https:\/\/devoteam.info\/be\/wp-json\/wp\/v2\/expert-view\/513614\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devoteam.info\/be\/wp-json\/wp\/v2\/media\/136907"}],"wp:attachment":[{"href":"https:\/\/devoteam.info\/be\/wp-json\/wp\/v2\/media?parent=513614"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devoteam.info\/be\/wp-json\/wp\/v2\/categories?post=513614"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devoteam.info\/be\/wp-json\/wp\/v2\/tags?post=513614"},{"taxonomy":"industry","embeddable":true,"href":"https:\/\/devoteam.info\/be\/wp-json\/wp\/v2\/industry?post=513614"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}