Galeraaa… hoje falaremos de provisionamento ágil de infraestrutura utilizando o conjunto de 2 ferramentas bem práticas que nos ajudarão no desenvolvimento da Stack. Utilizaremos a plataforma Cloud da Digital Ocean para subirmos nosso servidor, utilizando o Vagrant e o provisionamento da infraestrutura será realizado através do Ansible. Neste exemplo iniciaremos um servidor virtual já pré definido com a instalação do Jenkins e do Gitlab.

Um pequeno resumo dos 2 serviços que utilizaremos: 

Vagrant é uma ferramenta de gerência de infraestrutura que auxilia no gerenciamento da infraestrutura e no desenvolvimento de ambientes pré configurados reprodutíveis em várias plataformas de virtualização e nuvens como VirtualBox, VMWare, AWS, Azure, Digital Ocean, etc. Ele tem integração com ferramentas de Gestão de Configuração como Ansible, Puppet, Chef como um provisionador para essas máquinas virtuais. https://www.vagrantup.com/docs/.

Ansible é uma ferramenta Open Source escrita em Python de Gerenciamento de Configuração para automação de TI, que automatiza e garante o estado desejado do seu ambiente. Veja mais em http://docs.ansible.com/.

>> Pré requisitos.

– Servidor Centos7.

– Python ≥ 2 (já é nativo na maioria das distribuições do Linux.)

– Ter uma conta na Digital Ocean.

Mãos a obra!!!

Iniciaremos nosso lab criando a playbook do Ansible e logo após instalaremos o Vagrant, ajustando a configuração para o provisionamento.

>> Instalação e configuração do Ansible

No post anterior abordamos a instalação e configuração da Playbook.

Caso não tenha visto o post ou tenha ficado com alguma dúvida acessa lá 😀 https://churrops.io/2018/02/04/primeiros-passos-com-ansible-configurando-e-gerenciando-nginx/.

~]# yum install epel-release; yum update && yum install ansible -y

Após concluir a instalação do pacote no diretório /etc/ansible/ edite o arquivo hosts incluindo a configuração dos servidores que serão acessados.

~]# vim /etc/ansible/hosts
# Servidores teste
[digitalocean]
localhost ansible_connection=local

Criação da Playbook

No mesmo diretório do hosts entre em /etc/ansible/roles/ e execute o comando abaixo. Obs. Neste diretório é onde você guardará os seus projetos de prod, uat, qa, etc.

~]# ansible-galaxy init projeto_churrops

Após a execução deste comando será criada a árvore de diretórios padrão do Ansible com “defaults, files, handlers, meta, templates, tests e vars”. No diretório /vars adicione no arquivo main.yml o conteúdo abaixo no qual receberá as nossas variáveis de ambiente.

~]# vim main.yml
---
#Gitlab-ce#
path.install.repo.gitlab-ce: /etc/gitlab/gitlab.rpm.sh
package.install.repo.gitlab-ce: https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh
url.externa: http://gitlab.example.com
http_port: 80

#Jenkins#
package.install.repo.jenkins: http://pkg.jenkins-ci.org/redhat/jenkins.repo
path.install.repo.jenkins: /etc/yum.repos.d/jenkins.repo
rpm_import_key: https://jenkins-ci.org/redhat/jenkins-ci.org.key

#Digital Ocean#
api_token: ~ seu token (droplet Digital Ocean)

Agora dentro de /tasks criaremos nossa primeira tarefa para instalação de algumas dependências:

~]# vim dependencies.yml
---
###############################################################
#Configuração do host para a instalação do Jenkins e do GitLab#
###############################################################

- name: Instalação dos pacotes de dependencia entre outros.
  yum: name={{ item }} state=present update_cache=yes 
  with_items:
   - "vim"
   - "wget"
   - "git"
   - "curl"
   - "java"
   - "postfix"
   - "policycoreutils-python" 
   - "libselinux-python"
   - "openssh-server"
   - "epel-release"
---

Ainda dentro de /tasks criaremos a próxima tarefa para instalação do gitlab.

~]# vim install_gitlab.yml
---
#########################
#Instalação do Gitlab-ce#
#########################
# Instalação dos serviços para o GitLab-ce.
  
- name: Checar se a configurações do Gitlab já existe.
  stat: path=/etc/gitlab/gitlab.rb
            
- name: Checando se o Gitlab está instalado.
  stat: path=/usr/bin/gitlab-ctl
  register: gitlab_file

- name: Iniciando o serviço SSHD
  service: name=sshd enabled=yes state=restarted
  when: (gitlab_file.stat.exists == false)

- name: Habilitando acesso http no firewall
  firewalld: port={{ http_port }}/tcp
  permanent: true enabled=yes state=present 
  imediate: yes
  notify: reload firewalld
  when: (gitlab_file.stat.exists == false)

- name: Download do repositório RedHat do Gitlab
  get_url: 
    url={{ package.install.repo.gitlab-ce }} 
    dest={{ path.install.repo.gitlab-ce }} mode=0755 validate_certs=no
    register: downloadrepo
  when: (gitlab_file.stat.exists == false)
      
- name: instalação Repo Gitlab
  shell: {{ path.install.repo.gitlab-ce }}
  register: install.repo
  when: downloadrepo is succeeded

- name: Instalação do GitLab.
  yum: name=gitlab-ce state=latest
  notify: start gitlab
  register: install.git
  when: install.repo is succeeded
    
- name: Exportando a URL do Gitlab
  shell: EXTERNAL_URL= {{ sua.url }}
  when: install.git is succeeded
---

Agora crie a task de instalação do jenkins conforme abaixo.

~]# vim install_jenkins.yml
---
#######################
#Instalação do Jenkins# 
#######################

- name: Importando a key do jenkins.
  rpm_key:
    key: {{ rpm_import_key }}
    state=present
    validate_certs: no
    register: result

- name: Adicionando o repositório do Jenkins 
  get_url:
    url: {{ package.install.jenkins }} 
    dest: {{ path.install.repo.jenkins }}
    register: repojenkins
  when: result is succcess

- name: Instalação do Jenkins.
  yum: name=jenkins state=installed 
  register: jenkins_install
  notify: start jenkins
  when: repojenkins is succeeded

- name: Garantindo que o Jenkins esteja em execução.
  msg: "Jenkins running"
  service: jenkins state=started 
  enabled: yes
---

Agora que as suas tasks foram criadas, no diretório /handlers adicione no arquivo main.yml o seguinte conteúdo:

Obs. Neste arquivo colocaremos o conteúdo que queremos manipular com a sessão “notify” que inserimos no código das tasks.

~]# vim main.yml
---
- name: reload firewalld
  service: name=firewall state=restarted

- name: start jenkins
  service: name=jenkins state=started

- name: start gitlab
  command: gitlab-ctl reconfigure
---

E por fim crie a playbook que executará a instalação.

~]# vim site.yml
---
- name: Instalando o serviço do Jenkins e do Gitlab.
  hosts: localhost 
  register: result_playbook
  ignore_errors: true 
  become: true
  become_method: sudo
  tasks:
    - include_tasks: dependencies.yml
    - include_tasks: install_gitlab.yml
    - include_tasks: install_jenkins.yml
---

 

>> Instalação e Configuração do Vagrant

Um Vagrantfile está para o Vagrant assim como o Dockerfile está para o Docker.  Vagrantfile é o arquivo usado para configurar e definir o comportamento do Vagrant e da máquina virtual que ele criará.

A instalação é bem simples: basta baixar o pacote .rpm e instala-lo.

~]# wget https://releases.hashicorp.com/vagrant/2.0.2/vagrant_2.0.2_x86_64.rpm?_ga=2.47704739.582057880.1517879028-375052099.1517879028
~]# rpm -ivh vagrant_2.0.2_x86_64.rpm?_ga=2.47704739.582057880.1517879028-375052099.1517879028

Para mais detalhes acesse: https://www.vagrantup.com/docs/installation/.

Após a instalação do Vagrant faça a instalação do plugin para acessar a Digital Ocean.

~]# vagrant plugin install vagrant-digitalocean

Para verificar se o plugin foi instalado com sucesso execute vagrant plugin list e aparecerá o plugin que acabamos de instalar.

Com este comando abaixo criaremos nosso Vagrantfile dentro de “project-cloud” que criará automaticamente o diretório project-cloud.

~]# vagrant init project-cloud

O Vagrantfile por padrão já vem com algumas configurações, mas neste caso iremos adequar a nossa stack podendo configurar para cada necessidade.

Abaixo a configuração que o nosso Vagrantfile receberá.

~]# vim Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :

# All Vagrant configuration is done below. The "2" in Vagrant.configure
# configures the configuration version (we support older styles for
# backwards compatibility). Please don't change it unless you know what
# you're doing.
Vagrant.configure("2") do |config|
 config.vm.define = "droplet1" do |config|
   config.vm.box = "digital_ocean"
   config.ssh.private_key_path = "/root/.ssh/id_rsa"
   config.vm.provider :digital_ocean do |provider, override|
          override.vm.box_url = "https://github.com/devopsgroup-io/vagrant-digitalocean/raw/master/box/digital_ocean.box"
          provider.token = "SEU TOKEN"
          provider.image = "centos-7-x64"
          provider.name = "Devops"
          provider.size = "1gb"
          provider.region = "nyc1"
 end
  
  config.vm.provision "ansible" do |ansible|
         ansible.name = 'Devops' 
         ansible.playbook = '/etc/ansible/roles/project-churrops/tasks/site.yml'
         ansible.inventory_path = '/etc/ansible/hosts'
         ansible.limit = 'all'
         ansible.extra_vars = { ansible_ssh_user: 'vagrant' }
         ansible.verbose = 'vvv'
  end
end

Na sessão “config.vm.define” você define as configurações da sua vm.

Na sessão“config.vm.provision” você define o seu provisionamento utilizando o Ansible, como dito anteriormente.

O binário do Vagrant possui alguns subcomandos como vagrant up, vagrant ssh, vagrant package, vagrant halt, vagrant reload, vagrant rebuild, vagrant status, entre outros. Executando apenas vagrant todos os subcomando serão apresentados na tela tornando fácil a interação com o Vagrant.

Para conhecer todo os comandos do Vagrant acesse: https://www.vagrantup.com/docs/cli/

Depois de criarmos o nosso Vagrantfile com as configurações necessárias conforme descritos acima você já pode iniciar a sua instância. Para isso execute:

~]# vagrant up --provider=digital_ocean

Após a execução do comando acima será iniciado um novo servidor na Digital Ocean e você poderá acessá-lo diretamente com o comando vagrant ssh.

Valide a criação do seu servidor acessando a console da Digital Ocean na sessão Droplets.

dropletAgora que o seu Droplet está criado e funcionando nós precisamos deleta-lo para que não gere custos com a máquina estando parada. Também faremos este passo a passo com o Ansible.

Novamente no diretório /tasks crie a tarefa para destruir o Droplet:

~]# vim destroy.droplet.yml
---
- name: Deletando Droplet criado na Digital Ocean.
  hosts: localhost 
  register: result_playbook
  become: true
  become_method: sudo
  tasks:
    - name: Deletando Droplet.
      digital_ocean:
        state=deleted
        command: ssh
        name: Devops
        api_token: {{ api_token }}
---

Existe um mundo imenso por trás de Ansible e Vagrant. Este é apenas um exemplo de uma stack simples, utilizando uma instalação automatizada do Jenkins e do Gitlab. Neste exemplo utilizamos a plataforma da Digital Ocean pela sua simplicidade e facilidade de entendimento, mas poderíamos ter utilizado qualquer outra plataforma.