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. 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"
  2. 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
  3. 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...
  4. 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...
  5. 13.
  6. 14.

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

    Hosts Tasks Tasks executadas via SSH *Ansible aqui
  7. 15.

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

    Inventory Playbook Tasks executadas via SSH *Ansible aqui
  8. 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
  9. 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
  10. 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
  11. 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
  12. 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
  13. 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
  14. 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
  15. 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
  16. 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
  17. 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 }}
  18. 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 }}
  19. 36.

    Provisionamento - name: Update owner and group of project home

    file: path={{ project_home }} mode=755 owner={{ project_name }} group={{ project_name }} recurse=yes
  20. 37.

    Provisionamento - name: Install required system packages. apt: pkg={{ item

    }} state=latest update-cache=yes with_items: - "{{ system_packages }}"
  21. 38.

    Deploy # deploy.yml --- - hosts: production vars_files: - vars.yml

    sudo: true sudo_user: "{{ project_name }}"
  22. 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
  23. 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"
  24. 42.

    Deploy - name: Run gunicorn. shell: "{{ project_home }}/venv/bin/gunicorn projeto.wsgi

    --bind 0.0.0.0:8001 --pythonpath {{ project_home }}/ &"
  25. 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]
  26. 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