$30 off During Our Annual Pro Sale. View Details »

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.

Caio Carrara

July 16, 2015
Tweet

More Decks by Caio Carrara

Other Decks in Programming

Transcript

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

    View Slide

  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"

    View Slide

  3. Mas primeiro...
    quem é esse cara?

    View Slide

  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

    View Slide

  5. Mas o que é
    Ansible?

    View Slide

  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...

    View Slide

  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...

    View Slide

  8. Como funciona?

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

  17. Conceitos
    importantes

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  23. Playbooks
    * http://www.ansible.com/resources - Quickstart vídeo

    View Slide

  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

    View Slide

  25. ● Executado nos hosts
    remotos
    ● Podem receber
    parâmetros
    ● Mais de 380 módulos
    nativos
    Modules

    View Slide

  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

    View Slide

  27. Do zero ao deploy
    automatizado

    View Slide

  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

    View Slide

  29. # pip
    $ sudo pip install ansible
    Instalação

    View Slide

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

    View Slide

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

    View Slide

  32. # vars.yml
    ---
    project_name: projeto
    project_home: /opt/projeto
    project_repo: [email protected]:
    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

    View Slide

  33. Provisionamento
    # provision.yml
    ---
    - hosts: production
    vars_files:
    - vars.yml
    sudo: true

    View Slide

  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 }}

    View Slide

  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 }}

    View Slide

  36. Provisionamento
    - name: Update owner and group of project
    home
    file:
    path={{ project_home }}
    mode=755 owner={{ project_name }}
    group={{ project_name }}
    recurse=yes

    View Slide

  37. Provisionamento
    - name: Install required system packages.
    apt: pkg={{ item }} state=latest
    update-cache=yes
    with_items:
    - "{{ system_packages }}"

    View Slide

  38. Deploy
    # deploy.yml
    ---
    - hosts: production
    vars_files:
    - vars.yml
    sudo: true
    sudo_user: "{{ project_name }}"

    View Slide

  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

    View Slide

  40. Deploy
    - name: Install requirements.txt.
    pip: requirements={{ project_home }}
    /requirements.txt
    virtualenv={{ project_home }}
    /venv

    View Slide

  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"

    View Slide

  42. Deploy
    - name: Run gunicorn.
    shell: "{{ project_home }}/venv/bin/gunicorn
    projeto.wsgi --bind 0.0.0.0:8001 --pythonpath {{
    project_home }}/ &"

    View Slide

  43. Executando
    $ ansible-playbook -i hosts -K deploy.yml

    View Slide

  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]

    View Slide

  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

    View Slide

  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

    View Slide