Hello Ansible! Vamos dar os primeiros passos?

Hello Ansible! Vamos dar os primeiros passos?

Nessa apresentação realizada no #GrupySP de Julho apresentei o Ansible, qual o problema que ele resolve e como trabalhar com ele. A proposta foi apresentar a ferramenta de forma mais simples do que a documentação oficial e ser mais "direto ao ponto" focando em como sair do 0 para uma solução mínima para o processo de deploy automatizado.

F6d5a605df582ab9ea419ebef9f400b7?s=128

Caio Carrara

July 16, 2015
Tweet

Transcript

  1. Vamos dar os primeiros passos? @CaioWCC www.caiocarrara.com.br

  2. Agenda • O que é Ansible? • Qual o problema

    que o Ansible resolve? • Como o Ansible funciona? • Conceitos importantes de conhecer • "Do zero ao deploy automatizado"
  3. Mas primeiro... quem é esse cara?

  4. @CaioWCC @cacarrara • Desenvolvedor de software há 5 anos; •

    Desenvolvendo produtos com Python, Django, Javascript e mobile cross-device na tegra.me • Usuário e entusiasta de Ansible há pouco tempo... Caio Carrara
  5. Mas o que é Ansible?

  6. • Ferramenta para: ◦ Automatizacão de tarefas de TI ◦

    Configuração de sistemas ◦ Instalação de aplicações ◦ Orquestração de deploy contínuo • Simples e fácil de usar • Serve para uma ou milhares de máquinas • Batteries-included Ansible...
  7. • Configuração de instâncias remotas • Atualização de sistemas •

    Instalação e configuração de BD, aplicações e libs • Deploys automatizados simples • Documentação de configurações Solução para...
  8. Como funciona?

  9. Como funciona? A1 A2 A4 A3 Instâncias remotas

  10. Como funciona? Máquina Controle A1 A2 A4 A3 Instâncias remotas

  11. Como funciona? Máquina Controle A1 A2 A4 A3 Instâncias remotas

    Hosts
  12. Como funciona? Máquina Controle A1 A2 A4 A3 Instâncias remotas

    Hosts Tasks
  13. Como funciona? Máquina Controle A1 A2 A4 A3 Instâncias remotas

    Hosts Tasks Tasks executadas via SSH
  14. Como funciona? Máquina Controle A1 A2 A4 A3 Instâncias remotas

    Hosts Tasks Tasks executadas via SSH *Ansible aqui
  15. Como funciona? Máquina Controle A1 A2 A4 A3 Instâncias remotas

    Inventory Playbook Tasks executadas via SSH *Ansible aqui
  16. Como funciona? Máquina Controle A1 A2 A4 A3 Instâncias remotas

    Inventory Playbook Tasks executadas via SSH *Ansible aqui Conjunto de URLs dos hosts remotos Conjunto de Tasks que poderão ser executadas
  17. Conceitos importantes

  18. • Conjunto das máquinas onde as as tarefas deverão ser

    executadas • Máquinas podem ser agrupadas ◦ Webservers ◦ Databases ◦ etc.. • Tarefas são executadas em máquinas específicas do seu inventory Inventory
  19. Host Inventory #example inventory file mail.example.com [webservers] foo.example.com bar.example.com [dbservers]

    one.example.com two.example.com three.example.com
  20. • De forma simples e direta: ◦ Arquivo onde são

    especificadas as tasks que deverão ser executadas em um host ou grupo de hosts • São escritos usando YAML • Definem um conjunto de tasks (roles) para um ou mais hosts do inventory Playbooks
  21. • Playbooks contém Plays • Plays contém Tasks • Tasks

    executam chamadas aos Módulos • Tasks são executadas sequencialmente ◦ Handlers são tipos de tasks que podem ser chamadas por outras tasks diversas vezes em um playbook Playbooks
  22. --- - hosts: production sudo: true tasks: - name: Update

    apt cache and install nginx apt: name=nginx update_cache=yes - name: Publish project (nginx) template: src=source.j2 dest=/nginx/sa/s.com - name: restart nginx service: name=nginx state=restarted Playbooks
  23. Playbooks * http://www.ansible.com/resources - Quickstart vídeo

  24. --- - hosts: production vars: project_name: projeto system_packages: - build-essential

    - git - nginx tasks: - name: Create project user. user: name={{ project_name }} shell=/bin/bash - name: Install required system packages. apt: pkg={{ item }} state=latest update-cache=yes with_items: - "{{ system_packages }}" Playbooks vars
  25. • Executado nos hosts remotos • Podem receber parâmetros •

    Mais de 380 módulos nativos Modules
  26. • Para citar alguns: ◦ Gerenciamento de pacotes: yum, apt,

    pip ◦ Execução remota: command, shell ◦ Gerenciamento de serviços: service ◦ Manipulação de arquivos: copy, template ◦ SCM: git, subversion ◦ Databases: mysql_db, postgresql_db, redis Modules
  27. Do zero ao deploy automatizado

  28. # apt (Ubuntu) $ sudo apt-get install software-properties-common $ sudo

    apt-add-repository ppa:ansible/ansible $ sudo apt-get update $ sudo apt-get install ansible # RPM (Fedora, EPEL) $ sudo yum install ansible # brew (MacOS) $ brew update $ brew install ansible Instalação
  29. # pip $ sudo pip install ansible Instalação

  30. Diretório ├── deploy.yml ├── hosts ├── provision.yml ├── sites-available.j2 └──

    vars.yml
  31. Hosts # hosts [production] projeto.servidor.com

  32. # vars.yml --- project_name: projeto project_home: /opt/projeto project_repo: git@bitbucket.org: user/projeto.git

    system_packages: - git - nginx - postgresql - postgresql-contrib Variáveis # vars.yml - cont - python-dev - python3-dev - python-setuptools - python-virtualenv - python-imaging - libpq-dev - python-psycopg2 - libjpeg8-dev - zlib1g-dev - libfreetype6-dev - liblcms2-dev - libwebp-dev
  33. Provisionamento # provision.yml --- - hosts: production vars_files: - vars.yml

    sudo: true
  34. Provisionamento tasks: - name: Create project user. user: name={{ project_name

    }} shell=/bin/bash - name: Create ssh directory file: path=/home/{{ project_name }}/.ssh state=directory mode=u+rwx sudo_user: {{ project_name }}
  35. Provisionamento - name: Upload ssh keys copy: src=keys/key dest=/home/{{ project_name

    }} /.ssh/id_rsa mode=0600 sudo_user: {{ project_name }} - name: Create the project directory. file: state=directory path={{ project_home }}
  36. Provisionamento - name: Update owner and group of project home

    file: path={{ project_home }} mode=755 owner={{ project_name }} group={{ project_name }} recurse=yes
  37. Provisionamento - name: Install required system packages. apt: pkg={{ item

    }} state=latest update-cache=yes with_items: - "{{ system_packages }}"
  38. Deploy # deploy.yml --- - hosts: production vars_files: - vars.yml

    sudo: true sudo_user: "{{ project_name }}"
  39. Deploy tasks: - name: Pull source code. git: repo={{ project_repo

    }} dest={{ project_home }} accept_hostkey=True key_file=/home/{{ project_name }} /.ssh/id_rsa
  40. Deploy - name: Install requirements.txt. pip: requirements={{ project_home }} /requirements.txt

    virtualenv={{ project_home }} /venv
  41. Deploy - name: Execute project db migrations. shell: "{{ project_home

    }}/venv/bin/python {{ project_home }}/manage.py migrate" - name: Collect static files for Django. shell: "{{ project_home }}/venv/bin/python {{ project_home }}/manage.py collectstatic --noinput"
  42. Deploy - name: Run gunicorn. shell: "{{ project_home }}/venv/bin/gunicorn projeto.wsgi

    --bind 0.0.0.0:8001 --pythonpath {{ project_home }}/ &"
  43. Executando $ ansible-playbook -i hosts -K deploy.yml

  44. Executando SUDO password: PLAY [production] GATHERING FACTS ok: [projeto.servidor.com] TASK:

    [Pull source code.] ok: [projeto.servidor.com] TASK: [Execute project db migrations.] changed: [projeto.servidor.com] TASK: [Collect static files for Django.] changed: [projeto.servidor.com]
  45. Executando TASK: [Run gunicorn.] changed: [projeto.servidor.com] TASK: [Publish project (nginx)]

    ok: [projeto.servidor.com] TASK: [Enable project (nginx)] ok: [projeto.servidor.com] PLAY RECAP projeto.servidor.com : ok=11 changed=5 unreachable=0 failed=0
  46. • Saber mais: ◦ http://docs.ansible.com/ ◦ http://www.ansible.com/resources ◦ https://github.com/ansible/ansible-examples/ Thats

    all Folks! Obrigado! @CaioWCC www.caiocarrara.com.br