Colocando Infra ágil em prática !
Olá jovens mancebos, como estão ?
Ultimamente tenho focado muito no termo "DevOps", mas afinal, como dizer que você está implementando DevOps efetivamente ?
É complicado afirmar isto sem estar em um ambiente 100% dinâmico, onde há times multidisciplinares que executam de diversas demandas de agilidade e inovação.
Foi aí que encontrei uma resposta para a minha pergunta. Como sou nascido sysadmin, percebi que estou implementando infraestrutura ágil com metodologias aliadas, como SCRUM, KanBan e automatização de recursos e processos.
Me senti auto sabotado quando dei uma palestra em uma universidade sobre DevOps e me encontrei falando só sobre infra, integração entre times e CI/CD.
Por isso decidi trazer para vocês um pouco mais sobre infra ágil e como implementar IaC (Infra as Code) e deixar de lado um pouco o conceito DevOps, transformando-o simplesmente em "Integração entre times".
Pode ser um post mais extenso hoje, mas preferi explicar cada componente além do processo.
Docker Swarm Cluster na GCP com Terraform e Ansible
Caso deseje o código deste post, o mesmo se encontra no meu github.Terraform
Para o pessoal que não está familiarizado, Terraform é uma ferramenta da HashiCorp que viabiliza a "scriptação" de criação e configuração de componentes de recursos de uma cloud (as quatro principais pelo menos) através da linguagem HCL.Ou seja, o Terraform te permite programar a infraestrutura de uma cloud, criando as máquinas, firewalls, endpoints de apps e etc..
Ansible
Seguindo na linha de explicações, vamos falar de Ansible !Para quem não conhece, Ansible é uma ferramenta adquirida pela falecida Red Hat (comprada pela IBM ontem :'( ) que permite a gerência de configuração via SSH.
Ou seja, você possui 50 servidores Linux e precisa alterar o timezone de todos. Vai fazer na mão um por um ? Claro que não né Jamelão ! Você vai utilizar o Ansible, criando um script em YAML, com uma sintaxe bem simples e com um inventário (lista de hosts que sofrerão as alterações). O Ansible irá se conectar via SSH com as credenciais que você disponibilizou em um arquivo de variáveis dele e executar o que seu script YAML ordena que ele faça.
Docker Swarm
O Docker Swarm é um ORQUESTRADOR de containers, ou seja, um orquestrador de Docker, assim como o Kubernetes. Ele é responsável por gerenciar as diversas máquinas incluídas em um cluster swarm (master e nodes) e distribuir os containers criados entre eles em alta disponibilidade.O Docker Swarm encara os containers como serviços, permitindo gerar réplicas destes containers entre os nodes.
Mão Na Massa !
O nosso deploy (entrega) será feito na seguinte ordem:- [Terraform] Deploy da infraestrutura na cloud Google (regras de firewall e criação das máquinas)
- [Terraform] Criar um arquivo de inventário Ansible de acordo com as máquinas criadas
- [Ansible] Instalar Docker e Configurar o Swarm
Download Terraform
Execute os comandos abaixo para ter sucesso:
cd /opt wget https://releases.hashicorp.com/terraform/0.11.10/terraform_0.11.10_linux_amd64.zip unzip terraform_0.11.10_linux_amd64.zip sudo ln -s /opt/terraform /usr/bin/terraform
Download Ansible
Basta realizar o comando do seu gerenciador de pacotes para instalar Ansible.
Scripts Terraform
Crie os arquivos 01-gce-infra.tf 02-create-inv.tf variables.tfVamos montar o arquivo variables.tf que será o arquivo onde o Terraform lerá certas variáveis utilizadas nos demais arquivos para configuração dos ambientes:
##Variáveis Gerais ##Variável do Usuário SSH para as máquinas variable "ssh_user" { default = "ubuntu" } ##Variável para incluir dentro das máquinas criadas a chave de acesso SSH para conexão variable "public_key_path" { default = "/home/keep.linux/.ssh/id_rsa.pub" } ##Variável para definir o caminho da chave privada utilizada para conexão variable "private_key_path" { default = "/home/keep.linux/.ssh/id_rsa" } ##Variáveis Específicas Google Cloud
##Variável de contagem de quantos master Swarm desejo variable "gce_master_count" { default = 1 }##Variável de contagem de quantos nodes Swarm desejo variable "gce_worker_count" { default = 2 } ##Variável apontando para o path onde está o arquivo JSON de conexão com minha Google Cloud ##Pesquise como gerar um arquivo JSON com a chave do projeto dentro do Console Google Cloud variable "gce_creds_path" { default = "/home/keep.linux/cred_gcp.json" } ##Variável para definir o ID do projeto já criado na GCP variable "gce_project" { default = "keep-terraform" } ##Variável para definir a região que serão criadas as máquinas variable "gce_region" { default = "us-central1" } ##Variável para definir o tamanho (flavor) das máquinas variable "gce_instance_size" { default = "n1-standard-1" }
Feito isso, precisamos criar o arquivo 01-gce-infra.tf que irá ler os arquivos de variáveis, conectar em nosso projeto na GCP e criar as máquinas e regras de firewall:
##Definindo Credenciais GCP provider "google" { credentials = "${file("${var.gce_creds_path}")}" project = "${var.gce_project}" region = "${var.gce_region}" } ##Criando regras de firewall resource "google_compute_firewall" "swarm_sg" { name = "swarm-sg" network = "default" allow { protocol = "udp" ports = ["7946"] } allow { protocol = "tcp" ports = ["22", "2377", "7946", "4789"] } } ##Criando Máquina Master Swarm resource "google_compute_instance" "gce-swarm-masters" { depends_on = ["google_compute_firewall.swarm_sg"] name = "swarm-masters-${count.index}" machine_type = "${var.gce_instance_size}" zone = "${var.gce_region}-a" count = "${var.gce_master_count}" boot_disk { initialize_params { image = "ubuntu-os-cloud/ubuntu-1604-lts" } } scratch_disk { } network_interface { network = "default" access_config = {} } metadata { ssh-keys = "ubuntu:${file("${var.public_key_path}")}" } } ##Criando Máquinas Nodes Swarm resource "google_compute_instance" "gce-swarm-members" { depends_on = ["google_compute_firewall.swarm_sg"] name = "swarm-member-${count.index}" machine_type = "${var.gce_instance_size}" zone = "${var.gce_region}-a" count = "${var.gce_worker_count}" boot_disk { initialize_params { image = "ubuntu-os-cloud/ubuntu-1604-lts" } } scratch_disk { } network_interface { network = "default" access_config = {} } ##Definindo chave SSH para conexão do Ansible metadata { ssh-keys = "ubuntu:${file("${var.public_key_path}")}" } }
No script acima nós criamos 2 tipos de máquinas, master e nodes, lembrando que a quantidade é definida no nosso arquivo de variáveis.
Além disso criamos também as regras de firewall para possibilitar a comunicação entre as máquinas.
Agora vamos criar o script 02-create-inv.tf que irá criar o inventário para o Ansible de acordo com os IP's públicos e nomes das máquinas criadas automaticamente:
resource "null_resource" "ansible-provision" { depends_on = ["google_compute_instance.gce-swarm-masters", "google_compute_instance.gce-swarm-members"] provisioner "local-exec" { command = "echo \"[swarm-master]\" >> swarm-inventory" } provisioner "local-exec" { command = "echo \"${join("\n",formatlist("%s ansible_ssh_user=%s", google_compute_instance.gce-swarm-masters.*.network_interface.0.access_config.0.assigned_nat_ip, var.ssh_user))}\" >> swarm-inventory" } provisioner "local-exec" { command = "echo \"[swarm-nodes]\" >> swarm-inventory" } provisioner "local-exec" { command = "echo \"${join("\n",formatlist("%s ansible_ssh_user=%s", google_compute_instance.gce-swarm-members.*.network_interface.0.access_config.0.assigned_nat_ip, var.ssh_user))}\" >> swarm-inventory" } provisioner "local-exec" { command = "echo \"[all:vars]\" >> swarm-inventory" } provisioner "local-exec" { command = "echo \"ansible_ssh_user=ubuntu\" >> swarm-inventory" } provisioner "local-exec" { command = "echo \"ansible_ssh_private_key_file=./keys/id_rsa\" >> swarm-inventory" } }
Implantando o IaC
Agora que já temos nossos scripts Terraform criados e devidamente configurados, vamos por em prática a infraestrutura como código e ver a mágica acontecer!Execute o comando terraform init dentro da pasta onde estão os scripts, para que o terraform identifique os plugins necessários (provider google) e realize a preparação da ferramenta para que a mágica aconteça.
Em seguida, execute o comando terraform apply para ver a mágica acontecer e suas máquinas serem criadas em seu projeto na Google Cloud Platform.
Caso ocorra algum erro por configuração, execute o comando terraform destroy para realizar o rollback.
Para confirmar, verifique se existe o arquivo swarm-inventory. Nele estarão contidos os dados para o Ansible conectar nas máquinas.
Configurando Docker Swarm !
Agora que temos nossa infraestrutura criada, vamos configurá-la para ter o Docker Swarm !Crie o arquivo swarm.yml:
- name: Install Ansible Prereqs hosts: swarm-master:swarm-nodes gather_facts: no become: yes tasks: - raw: "apt-get update && DEBIAN_FRONTEND=noninteractive && apt-get install -y python-minimal python-pip" - name: Install Docker Prereqs hosts: swarm-master:swarm-nodes gather_facts: yes become: yes tasks: - package: name: "{{item}}" state: latest with_items: - apt-transport-https - ca-certificates - curl - software-properties-common - apt_key: url: "https://download.docker.com/linux/ubuntu/gpg" state: present - apt_repository: repo: "deb [arch=amd64] https://download.docker.com/linux/ubuntu xenial stable" state: present - name: Install Docker hosts: swarm-master:swarm-nodes gather_facts: yes become: yes tasks: - package: name: "docker-ce" state: latest - user: name: "{{ ansible_ssh_user }}" groups: docker append: yes - name: Initialize Swarm Master hosts: swarm-master gather_facts: yes become: yes tasks: - command: "docker swarm init --advertise-addr {{inventory_hostname}}" - command: "docker swarm join-token -q worker" register: swarm_token - set_fact: swarmtoken="{{swarm_token.stdout}}" - name: Join Swarm Nodes hosts: swarm-nodes gather_facts: yes become: yes tasks: - command: "docker swarm join --advertise-addr {{inventory_hostname}} --token {{hostvars[groups['swarm-master'][0]].swarmtoken}} {{hostvars[groups['swarm-master'][0]].inventory_hostname}}:2377"
Este script Ansible irá conectar nas máquinas contidas no arquivo swarm-inventory e instalar o Docker e configurar o Docker Swarm.
Complete o setup configurando o ansible para que ignore os avisos de "novo host" inserindo a chave ansible_host_key_checking=false dentro do arquivo /etc/ansible/ansible.cfg
Agora execute o comando Ansible para efetuar as configurações nos nodes docker:
ansible-playbook -i swarm-inventory swarm.yml
E pronto ! Temos nosso cluster Docker Swarm configurado na Google Cloud !
Caso queira fazer um teste com serviços, conecte-se via SSH com a chave informada nas variáveis na máquina MASTER do docker swarm e execute os comandos:
# Irá listar os nodes presentes neste Docker Swarm docker node ls # Irá criar um serviço com a imagem Linux alpine realizando o comando "ping google.com" com 5 réplicas de serviços dentro do Swarm com o nome de helloworld docker service create --replicas 5 --name helloworld alpine ping google.com # Irá listar o serviço helloworld e suas réplicas docker service ps helloworld
0 comentários :
Postar um comentário