Ventorystack

agility decisions time

Ansible

ansible

Ansible For Developments

Landscape

Luis Mayta

  • Software Developer
  • Go enthusiast
  • Python enthusiast
  • Software Developer DgNest

Contactos:

Agenda

  • Automatización y Por qué es tan Importante?
  • Que es Ansible.
  • Porque Ansible.
  • Diferencia con otras herramientas.
  • Quienes usan Ansible.
  • Elementos de Ansible.
  • Demo.
  • Otras Herramientas.
  • Preguntas.

Automatización y Por qué es tan Importante?

automatizacion

Automatización

La Automatización permite construir ambientes idénticos una vez tras otras. Todos los paquetes necesarios, archivos de configuración, etc. se pueden definir de forma lógica y usarlos para construir plataformas de forma automática y libre de errores.

Provisionadores?

provisionadores

Que es Ansible?

Es una herramienta que nos permite gestionar configuraciones, aprovisionamiento de recursos, despliegue automático de aplicaciones y muchas otras tareas de TI de una forma limpia y sencilla.

Porque Ansible?

  • Simple
  • Sin Agentes
  • Se Ejecuta desde la Maquina del Administrador
  • Usa Python y SSH
  • Modelo Push

Porque Ansible?

porque_ansible

Diferencia a otras Herramientas:

  • No Necesita Agentes.
  • No requiere de configuraciones engorrosas y complicadas.
  • Flexibilidad (API, Módulos, Plugins)
  • Facilidad de uso

Quienes usan Ansible.

Instalar Ansible

Existen RPM's disponibles para EPEL 6 y 7

Yum

1 $ sudo yum install ansible

Instalar Ansible

APT-Ubuntu

1 $ sudo apt-get install software-properties-common
2 $ sudo apt-add-repository ppa:ansible/ansible
3 $ sudo apt-get update
4 $ sudo apt-get install ansible

Instalar Ansible

Debian

1 $ sudo apt-get update
2 $ sudo apt-get install python-pip python-dev git -y
3 $ sudo pip install PyYAML jinja2 paramiko
4 $ git clone https://github.com/ansible/ansible.git
5 $ cd ansible
6 $ sudo make install
7 $ sudo mkdir /etc/ansible
8 $ sudo cp ~/ansible/examples/hosts /etc/ansible/

Instalar Ansible

Homebrew

1 $ brew update
2 $ brew install ansible

Best Installation Recomendada

1 $ sudo pip install ansible

Copiar Key Public al server Remoto

~/.ssh/id_rsa.pub

1 $ ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.101.104

Elementos de Ansible:

1 ├── hosts <- inventory
2 ├── playbook.yml <-playbook
3 └── roles
4     └── webserver <- role webserver
5         ├── files
6         │   └── main.go
7         └── tasks
8             └── main.yml <- fichero de tareas

Elementos de Ansible:

  • Inventario
  • Modulos
  • Tarea/Task
  • Plays
  • PlayBooks
  • Variables
  • Roles
  • Task Pre/Pos
  • Otros

Inventario:

hosts

1 1.web.sandbox.sophimania.pe ansible_ssh_host=192.168.20.80 ansible_ssh_port=22
2 1.lb.sandbox.sophimania.pe ansible_ssh_host=192.168.20.81 ansible_ssh_port=22
3 1.db.master.sandbox.sophimania.pe ansible_ssh_host=192.168.20.82 ansible_ssh_port=22

Groups:

1 [webservers]
2 [1:1].web.sandbox.sophimania.pe
3 
4 [lbservers]
5 1.lb.sandbox.sophimania.pe
6 
7 [dbservers:children]
8 dbservers.masters
9 dbservers.slaves

Modulos:

  • Los Modulos se Consideran la unidad de trabajo de ansible.
  • Es codigo que se ejecuta en el equipo administrado.
  • Cada Modulo es basicamente independiente y puede ser escrito en cualquier lenguaje de programacion scripts.
  • Se copian por ssh hacia el equipo administrado donde son ejecutados.
  • Devuelven datos en formato JSON que es interpretado por ansible.

Modulos de Ansible (Core):

  • apt/yum/pip: Adicionar/Desinstalar Paquetes.
  • command/shell: Ejecutar cualquier comando de shell.
  • copy: Copiar archivos al servidor administrado.
  • file: Crear Directorios, Enlaces Simbolicos, Modificar Permisos.
  • service: Iniciar/Detener/Habilitar Servicios.
  • template: Similar a Copy, pero con reemplazo de variables.
  • ...

Task:

1 - name: Install Nginx Web Server
2   apt: pkg=nginx state=latest
  • Documentacion: 'Install Nginx Web Server'
  • Modulos: apt
  • Argumentos: pkg=nginx state=latest

Task:

 1 - name: Install common package dependencies
 2   apt:
 3     name: "{{ item }}"
 4     state: present
 5   register: install_common_package_dependencies
 6   when: common_package_dependencies is defined
 7   with_items: common_package_dependencies
 8   tags:
 9     - apt
10     - dependencies

PlayBooks:

Example:

 1 - name: Common stuff for all the server
 2   hosts: all
 3   sudo: yes
 4   gather_facts: yes
 5   roles:
 6     - common
 7   tags:
 8     - all
 9     - common
10 
11 - name: Install MySQL
12   hosts: dbservers
13   gather_facts: yes
14   sudo: yes
15   roles:
16     # - { role: contrib/geerlingguy.mysql, when: "user == 'vagrant'" }
17     - contrib/geerlingguy.mysql
18     - postgresql
19   tags:
20     - install
21     - mysql
22     - databases

Variables:

  • group_vars
  • Hosts
  • Role:
  • vars/main.yml
  • defaults/main.yml

Variables:

1 user: vagrant
2 
3 app_name: "sophimania"
4 app_db_name: "sophimania"
5 app_dir_home: "/home/{{ user }}"
6 apps_path: "{{ app_dir_home }}/{{ repository_name }}"
7 app_dir: "{{ apps_path }}/{{ app_name }}"
8 dir_logs_supervisor: "/var/log/supervisor"

Roles:

 1 ├── README.md
 2 ├── defaults
 3 │   └── main.yml
 4 ├── handlers
 5 │   └── main.yml
 6 ├── meta
 7 │   └── main.yml
 8 ├── tasks
 9 │   ├── configure.yml
10 └── templates
11     ├── environment.j2

Roles Reutilizables:

Ansible Galaxy

Install Normal

1 ansible-galaxy install username.rolename

Install Advanced

1 ansible-galaxy install -r requirements.yml -p provision/ansible/roles

Dependencias:

requirements.yml:

 1 # Install a role from the Ansible Galaxy
 2 - src: dgnest.authorization
 3 - src: dgnest.common
 4 - src: hadenlabs.nginx
 5 - src: dgnest.supervisor
 6 - src: dgnest.postgresql
 7 
 8 # Install a role from GitHub
 9 
10 # - name: hadenlabs.superslacker
11 #   src: https://github.com/hadenlabs/ansible-role-superslacker
12 #   version: origin/master

Tareas Pre/Post:

  • Se pueden definir tareas que se ejecuten antes y despues que los roles sean aplicados de la siguiente manera.

Ejemplo:

 1   - name: webservers
 2 
 3   pre_tasks:
 4   - shell: echo 'o/'
 5 
 6   roles:
 7     -{ role: some_role }
 8 
 9   tasks:
10   - shell: echo 'still busy'
11 
12   post_tasks:
13   - shell: echo 'Good Bye'

Otros:

  • Condicionales: Se pueden establecer condiciones para la ejecucion de una tarea mediante la directiva when: que evalua la condicion y ejecuta la tarea si el resultado es verdadero.
  • notificadores/notifiers/handlers: son tareas que se ejecutan con el comando notify
  • raw commands: se puede utilizar ansible para ejecutar comandos en los servidores remotos sin necesidad de un playbook.
  • scripts: son archivos de script que se copian al servidor remoto y se ejecutan: Automatizan la ejecucion de scripts ya existentes

Demo:

yugu

Otras Herramientas:

  • Packer
  • Terraform

Preguntas:

preguntas