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 o 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 é crítico e algumas empresas levam a sério como bancos os níveis e credenciais de acesso a infraestrutura e níveis de funções como em ambiente de desenvolvimento.
Terraform é uma ferramenta para construir, alterar e infraestrutura de versões com segurança e eficiência em forma de código simples.
O Terraform pode gerenciar varios provedores de serviços em cloud, hibridos e baremetal populares, tais 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.
O interessante é que você tem os versionamentos de mudanças da infraestrutura. Nos ambientes onde são feitos o Gerenciamento de Mudanças você pode ter acesso ao histórico da ações via 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 e inteligente ferramenta.
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-nuvem 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 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 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 muti-nuvem, híbrido e baremetal. Ele tem compatibilidade com vários sistema operacionais.
https://www.terraform.io/downloads.html

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.

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

Leia atentamente as instruções da maquina virtual do Marketplace.
Complete as instruções de usuário e senha, localidade, nome da maquina e grupo de recursos do Azure.
Neste passo é sugerido este modelo de maquina virtual do Terraform, então mantenha ou veja outros modelos.Confirme os parâmetro de provisionamento e aguarde as instalações do Terraform.
Agora só aguardar.
Maquina instalada com sucesso e vamos acessar.
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.
Este é o modelo criado acima: terraformazurevm.tf
O modelo tem todos os parâmetros para a criação da máquina 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.

