Skip to main content

Playbooks Avançados

Deploy de Aplicação Node.js

---
- name: Deploy Node.js Application
  hosts: appservers
  become: yes
  vars:
    app_dir: /opt/myapp
    app_user: deploy
    node_version: "20"

  tasks:
    - name: Instalar dependências do sistema
      apt:
        pkg:
          - curl
          - git
          - build-essential
        state: present

    - name: Instalar Node.js
      snap:
        name: node
        classic: yes
        channel: "{{ node_version }}/stable"

    - name: Criar usuário da aplicação
      user:
        name: "{{ app_user }}"
        shell: /bin/bash
        home: "{{ app_dir }}"
        create_home: yes

    - name: Criar diretório da aplicação
      file:
        path: "{{ app_dir }}"
        state: directory
        owner: "{{ app_user }}"
        group: "{{ app_user }}"

    - name: Clonar repositório
      git:
        repo: "{{ git_repo }}"
        dest: "{{ app_dir }}"
        version: "{{ git_branch | default('main') }}"
        force: yes
      become_user: "{{ app_user }}"

    - name: Instalar dependências npm
      npm:
        path: "{{ app_dir }}"
        production: yes
      become_user: "{{ app_user }}"

    - name: Copiar variáveis de ambiente
      template:
        src: .env.j2
        dest: "{{ app_dir }}/.env"
        owner: "{{ app_user }}"
        mode: '0600'

    - name: Iniciar serviço
      systemd:
        name: myapp
        state: restarted
        enabled: yes
        daemon_reload: yes

Configuração de Banco PostgreSQL

---
- name: Configurar PostgreSQL
  hosts: dbservers
  become: yes
  vars:
    pg_version: 15
    pg_port: 5432
    pg_max_connections: 200

  tasks:
    - name: Instalar PostgreSQL
      apt:
        name:
          - postgresql
          - postgresql-contrib
          - python3-psycopg2
        state: present

    - name: Configurar postgresql.conf
      lineinfile:
        path: /etc/postgresql/{{ pg_version }}/main/postgresql.conf
        regexp: '^#?max_connections'
        line: "max_connections = {{ pg_max_connections }}"
        state: present
      notify: Restart PostgreSQL

    - name: Criar banco de dados
      postgresql_db:
        name: myapp
        encoding: UTF8
        lc_collate: en_US.UTF-8
        lc_ctype: en_US.UTF-8
        state: present
      become_user: postgres

    - name: Criar usuário
      postgresql_user:
        name: myapp_user
        password: "{{ db_password }}"
        db: myapp
        priv: ALL
        state: present
      become_user: postgres

  handlers:
    - name: Restart PostgreSQL
      service:
        name: postgresql
        state: restarted

Setup Kubernetes com Kubespray

---
- name: Setup Kubernetes Cluster
  hosts: kube[0:2]
  become: yes
  roles:
    - kubespray-defaults
    - kubernetes/preinstall
    - docker
    - kubernetes/node

Loops e Condicionais

Loop com items

- name: Criar múltiplos usuários
  user:
    name: "{{ item.name }}"
    shell: "{{ item.shell | default('/bin/bash') }}"
    groups: "{{ item.groups | default([]) }}"
  loop:
    - { name: alice, groups: ['sudo', 'docker'] }
    - { name: bob, groups: ['developers'] }
    - { name: carol, shell: '/bin/zsh' }

When conditionals

- name: Instalar Nginx no Ubuntu
  apt:
    name: nginx
    state: present
  when: ansible_facts['os_family'] == "Debian"

- name: Instalar httpd no RHEL
  yum:
    name: httpd
    state: present
  when: ansible_facts['os_family'] == "RedHat"

Block e Rescue

- block:
    - name: Deploy aplicação
      include_tasks: deploy.yml
  rescue:
    - name: Rollback
      include_tasks: rollback.yml
    - name: Notificar falha
      slack:
        token: "{{ slack_token }}"
        msg: "Deploy falhou!"

Tags

- name: Deploy
  hosts: all
  tags: [deploy, web]
  
  tasks:
    - name: Atualizar código
      git:
        repo: "{{ repo }}"
        dest: /opt/app
      tags: [code]

    - name: Migrar banco
      include_tasks: migrate.yml
      tags: [migrate, db]
Execução com tags:
ansible-playbook site.yml --tags "deploy,migrate"
ansible-playbook site.yml --skip-tags "db"