Terraform, sua infraestrutura como código.

Last Updated: 03/06/2018By

terraform

Olá pessoal

Estive pesquisando e testando varias ferramentas para agilidade em infraestrutura com enfase em praticas devops.

As ferramentas que tive contato direto e usei foi VSTS no visual Studio que é sensacional, sou suspeito em falar da ferramenta, Ansible que também é sensacional, muito fácil de utilizar.

A grata surpresa foi quando testei a ferramenta da HashiCorp, Terraform.

Minha pesquisa foi por que a administração em ambientes grandes de cloud com acesso a Azure, AWS e Google começa a ter um certo nível de detalhe e camadas de configuração, e até ter um nível bom em segurança da informação para compliances.

Isso é sério e algumas empresas levam a sério como bancos os níveis de acesso e credenciais de acesso a ambientes e níveis de funções como em ambiente de desenvolvimento, em infraestrutura e outros.

Terraform é uma ferramenta para construir, alterar e infra-estrutura de versões com segurança e eficiência em forma de código altamente facil.
O Terraform pode gerenciar varios provedores de serviços em cloud, hibridos e baremetal existentes e populares, como Cloud Computing em Azure, AWS, Google cloud, Oracle Cloud e Digital Ocean, bem como soluções internas personalizadas de datacenter como Openstack, Vmaware e Hyper-V.

O Terraform é capaz de determinar o que mudou e criar planos de execução incremental que podem ser aplicados.

Importante que você tem os versionamentos de mudanças da infraestrutura. Ambientes onde é feito via Gerenciamento de Mudanças você pode criar histórico de relatórios onde a equipe de governança terá total respaldo e controle melhor.

Em tempos de ambientes ágeis o Terraform se torna uma poderosa ferramenta inteligente.

A infraestrutura que o Terraform pode gerenciar inclui componentes de baixo nível, como instâncias de computação, armazenamento e rede, além de componentes de alto nível, como entradas de DNS, recursos de SaaS etc.

Infraestrutura como Código

A infra-estrutura é descrita usando uma sintaxe de configuração de alto nível. Isso permite que um modelo construído do seu data center seja versionado e tratado como você faria com qualquer outro código. Além disso, a infraestrutura pode compartilhada e reutilizada.

Gráfico de recursos

O Terraform constrói um gráfico de todos os seus recursos e paraleliza a criação e modificação de quaisquer recursos não dependentes. Por isso, o Terraform constrói a infraestrutura da maneira mais eficiente possível, e os operadores obtêm insights sobre as dependências de sua infraestrutura.

Automação de Mudança

Os changesets complexos podem ser aplicados à sua infraestrutura com interação humana mínima. Com o plano de execução e o gráfico de recursos mencionados anteriormente, você sabe exatamente o que o Terraform mudará e em que ordem, evitando muitos possíveis erros humanos.

Com um olhar de segurança da informação, seu ambiente de virtualização, hibrido ou em cloud terá o minimo de acesso e o máximo de eficiência e produtividade com segurança.

Terraform vs. concorrentes

O Terraform fornece uma abstração flexível de recursos e provedores. Esse modelo permite representar tudo, desde hardware físico, máquinas virtuais e contêineres, até provedores de e-mail e DNS. Devido a essa flexibilidade, o Terraform pode ser usado para resolver muitos problemas diferentes. Isso significa que existem várias ferramentas existentes que se sobrepõem às capacidades do Terraform. Nós comparamos o Terraform a várias dessas ferramentas, mas deve-se notar que o Terraform não exclusivo com outros sistemas. Pode ser usado para gerenciar um único aplicativo ou o datacenter inteiro.

Veja o comparativo no próprio site do Terraform

https://www.terraform.io/intro/vs/chef-puppet.html

https://www.terraform.io/intro/vs/cloudformation.html

Implantação Multi-Cloud

infraestrutura multi nuven para aumentar a tolerância a falhas. A realização de implantações multi nuvem pode ser muito desafiadora, pois muitas ferramentas existentes para gerenciamento de infraestrutura são específicas da nuvem. O Terraform é agnóstico foi que me interessou e de fácil assimilação, em relação à nuvem e permite que uma única configuração seja usada para gerenciar vários provedores e até mesmo para lidar com dependências entre nuvens. Isso simplifica o gerenciamento e a orquestração, ajudando as operadoras a construir infraestruturas de várias nuvens em grande escala.

Instalação

O Terraform além de ser mutinuvem, hibrido e baremetal ele tem compatibilidade com vários sistema operacionais.

https://www.terraform.io/downloads.html

versoes

Obviamente você utilizará a versão que você mais se familiariza.

Eu vou demonstrar abaixo bem simples no Ubuntu e no Azure que tem pronto no Marketplace.

Ubuntu:

Baixe a versão que está no site

Se não tiver a versão do gunzip e wget ja baixe

apt-get install gunzip wget
wget https://releases.hashicorp.com/terraform/0.11.7/terraform_0.11.7_linux_amd64.zip
unzip terra*

Mova os binários para a pasta /usr/local/bin/
mv terraform /usr/local/bin/
terraform --version

Esta é a forma de usar no ubuntu.

Agora vamos para o Azure.

terraformazure001

Faça a busca do terraform e escolha a maquina virtual.

terraformazure002

Leia atentamente as instruções da maquina virtual do Marketplace.

terraformazure003

Complete as instruções de usuário e senha, localidade, nome da maquina e grupo de recursos do Azure.

terraformazure004

Neste passo é sugerido este modelo de maquina virtual do Terraform, então mantenha ou veja modelos equivalentes.

terraformazure005

Confirme os parâmetro de provisionamento e aguarde as instalações do Terraform.

terraformazure006

Agora só aguardar.

terraformazure007

Maquina instalada com sucesso e vamos acessar.

terraformazure008

Terraform devidamente provisionado e pronto para o uso. Vamos mostrar um modelo de criação de uma maquina no Azure através do Terraform

Para o funcionamento correto do Terraform no Azure instale o pacote do Azure CLI na maquina.

https://docs.microsoft.com/pt-br/cli/azure/install-azure-cli-apt?view=azure-cli-latest

O modelo de template para criação da maquina virtual está aqui abaixo:

variable "resourcename" {
 default = "myResourceGroup"
}

# Configure the Microsoft Azure Provider
provider "azurerm" {
 subscription_id = "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
 client_id = "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
 client_secret = "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
 tenant_id = "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}

# Create a resource group if it doesn’t exist
resource "azurerm_resource_group" "myterraformgroup" {
 name = "myResourceGroup"
 location = "eastus"

tags {
 environment = "Terraform Demo"
 }
}

# Create virtual network
resource "azurerm_virtual_network" "myterraformnetwork" {
 name = "myVnet"
 address_space = ["10.0.0.0/16"]
 location = "eastus"
 resource_group_name = "${azurerm_resource_group.myterraformgroup.name}"

tags {
 environment = "Terraform Demo"
 }
}

# Create subnet
resource "azurerm_subnet" "myterraformsubnet" {
 name = "mySubnet"
 resource_group_name = "${azurerm_resource_group.myterraformgroup.name}"
 virtual_network_name = "${azurerm_virtual_network.myterraformnetwork.name}"
 address_prefix = "10.0.1.0/24"
}

# Create public IPs
resource "azurerm_public_ip" "myterraformpublicip" {
 name = "myPublicIP"
 location = "eastus"
 resource_group_name = "${azurerm_resource_group.myterraformgroup.name}"
 public_ip_address_allocation = "dynamic"

tags {
 environment = "Terraform Demo"
 }
}

# Create Network Security Group and rule
resource "azurerm_network_security_group" "myterraformnsg" {
 name = "myNetworkSecurityGroup"
 location = "eastus"
 resource_group_name = "${azurerm_resource_group.myterraformgroup.name}"

security_rule {
 name = "SSH"
 priority = 1001
 direction = "Inbound"
 access = "Allow"
 protocol = "Tcp"
 source_port_range = "*"
 destination_port_range = "22"
 source_address_prefix = "*"
 destination_address_prefix = "*"
 }

tags {
 environment = "Terraform Demo"
 }
}

# Create network interface
resource "azurerm_network_interface" "myterraformnic" {
 name = "myNIC"
 location = "eastus"
 resource_group_name = "${azurerm_resource_group.myterraformgroup.name}"
 network_security_group_id = "${azurerm_network_security_group.myterraformnsg.id}"

ip_configuration {
 name = "myNicConfiguration"
 subnet_id = "${azurerm_subnet.myterraformsubnet.id}"
 private_ip_address_allocation = "dynamic"
 public_ip_address_id = "${azurerm_public_ip.myterraformpublicip.id}"
 }

tags {
 environment = "Terraform Demo"
 }
}

# Generate random text for a unique storage account name
resource "random_id" "randomId" {
 keepers = {
 # Generate a new ID only when a new resource group is defined
 resource_group = "${azurerm_resource_group.myterraformgroup.name}"
 }

byte_length = 8
}

# Create storage account for boot diagnostics
resource "azurerm_storage_account" "mystorageaccount" {
 name = "diag${random_id.randomId.hex}"
 resource_group_name = "${azurerm_resource_group.myterraformgroup.name}"
 location = "eastus"
 account_tier = "Standard"
 account_replication_type = "LRS"

tags {
 environment = "Terraform Demo"
 }
}

# Create virtual machine
resource "azurerm_virtual_machine" "myterraformvm" {
 name = "myVM"
 location = "eastus"
 resource_group_name = "${azurerm_resource_group.myterraformgroup.name}"
 network_interface_ids = ["${azurerm_network_interface.myterraformnic.id}"]
 vm_size = "Standard_DS1_v2"

storage_os_disk {
 name = "myOsDisk"
 caching = "ReadWrite"
 create_option = "FromImage"
 managed_disk_type = "Premium_LRS"
 }

storage_image_reference {
 publisher = "Canonical"
 offer = "UbuntuServer"
 sku = "16.04.0-LTS"
 version = "latest"
 }

os_profile {
 computer_name = "myvm"
 admin_username = "azureuser"
 }

os_profile_linux_config {
 disable_password_authentication = true
 ssh_keys {
 path = "/home/azureuser/.ssh/authorized_keys"
 key_data = "ssh-rsa AAAAB3Nz{snip}hwhqT9h"
 }
 }

boot_diagnostics {
 enabled = "true"
 storage_uri = "${azurerm_storage_account.mystorageaccount.primary_blob_endpoint}"
 }

tags {
 environment = "Terraform Demo"
 }
}

Acima é um modelo completo de rodar uma maquina através do Terraform.

terraformazure009

Este é o modelo criado acima terraformazurevm.tf

O modelo acima tem todos os parametros para a criação da maquina virtual.

O comando para rodar o terrform é terraform init.

Veja este modelo em baremetal para finalizar em Hyper-V

============================================================================

provider "hyperv" {
 hypervisor = "HV01.contoso.local"
 username = "hv_administrator"
 password = "Password1234!"
}

resource "hyperv_virtual_switch" "application_switch" {
 name = "application_switch"
}

resource "hyperv_virtual_machine" "web" {
 vm_name = "web"
 cpu = 2
 ram_mb = 1024
 switch = "external_switch"
 disable_network_boot = true
 path = "C:\\ClusterStorage\\VMs"

network_adapter {
 name = "inside",
 switch_name = "inside",
 },

storage_disk {
 name = "boot"
 diff_parent_path = "C:\\ClusterStorage\\VHDs\\server2012r2-0.1.0.vhdx"
 }
}

resource "hyperv_virtual_machine" "db" {
 vm_name = "db"
 cpu = 4
 ram_mb = 4096
 switch = "external_switch"
 disable_network_boot = true
 path = "C:\\ClusterStorage\\VMs"

network_adapter {
 name = "inside",
 switch_name = "inside",
 },

storage_disk {
 name = "boot"
 diff_parent_path = "C:\\ClusterStorage\\VHDs\\server2012r2-0.1.0.vhdx"
 }
}

============================================================================

O próximo post iremos entrar mais tecnicamente de como rodar e criar a maquina no azure.

Espero que tenham compreendido como é o Terraform.

Novidades via inbox

Fique por dentro no meu Boletim digital toda semana um conteúdo novo

Leave A Comment