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.
Agora 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.
30/05/2018 at 10:57 pm
Massa!
CurtirCurtir