Terraform, sua infraestrutura como código.
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
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 modelos equivalentes.
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 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.
Último vídeo
Novidades via inbox
Fique por dentro no meu Boletim digital toda semana um conteúdo novo