introducción a ansible

Download Introducción a Ansible

Post on 12-Apr-2017

397 views

Category:

Engineering

0 download

Embed Size (px)

TRANSCRIPT

  • Ansible: Provisionando el futuroIntroduccin, instalacin y uso

    @pabloros

  • De dnde venimos

    Nuestro entorno de desarrollo utiliza una mquina virtual gestionada por Vagrant y provisionada con Puppet

    Nuestros servidores de produccin se configuran de forma manual con muchos ficheros de configuracin versionados.

  • A dnde vamos

    Nuestro entorno de desarrollo utiliza una mquina virtual gestionada por Vagrant y provisionada con Ansible

    Nuestros servidores de produccin se provisionarn con Ansible.

  • Nuestro Objetivo

    Automatizar el provision de mquinas tanto de produccin como de desarrollo.

    Conseguir tener el mismo entorno en produccin que en desarrollo (al menos lo ms similar posible)

  • Qu fue primero?

    Empezaremos configurando nuestro Ansible en desarrollo

    Utilizaremos Vagrant para levantar la mquina virtual

    Una vez finalizado, provisionaremos produccin.

  • VagrantAcercndonos a produccin

  • Por qu Vagrant ?

    Nos simplifica la puesta en marcha de la mquina virtual.

    Nos da herramientas para provisionar nuestra MV.

    Fcil de compartir: puedes tener tu MV con un slo fichero: VagrantFile

  • Vagrant.require_version ">= 1.5"Vagrant.configure("2") do |config| config.vm.box = "centos64_x86" config.ssh.forward_agent = true config.vm.synced_folder "../ansible", "/ansible" config.vm.provider "virtualbox" do |v| v.customize ["modifyvm", :id, "--natdnshostresolver1", "on"] v.customize ["modifyvm", :id, "--natdnsproxy1", "on"] end config.vm.define "web", primary: true do |web| web.vm.network :private_network, ip: "192.168.33.10" web.vm.network :forwarded_port, guest: 80, host: 8080, auto_correct: true web.vm.network :forwarded_port, guest: 443, host: 8081, auto_correct: true web.vm.hostname = "uvinumVm" web.vm.provision :shell, path: "shell/web_provision_ansible.sh", args: ["uvinumVm"] web.vm.synced_folder "./shared/www", "/var/www", create: true web.vm.synced_folder "./shared/logs", "/var/log/verticomm", create: true end config.vm.define "marawler_node", autostart: false do |marawler_node| marawler_node.vm.hostname = "marawlerNode" marawler_node.vm.network :private_network, ip: "192.168.33.11" marawler_node.vm.provision :shell, path: "shell/marawler_node.sh", args: ["marawlerNode"] endend

  • VagrantFile

    Box que vamos a utilzar. CentOS

    Hacemos forward agent para poder disponer de las keys de la mquina host.

    Compartimos el directorio Ansible (veremos ms adelante)

    config.vm.box = "centos64_x86" config.ssh.forward_agent = true config.vm.synced_folder "../ansible", "/ansible"

  • VagrantFile

    Configuramos que nuestra mquina virtual use la misma resolucin de DNS que el host.

    Esto es necesario ya que no usamos las default del ISP sino que nuestro propio servidor de DNS.

    config.vm.provider "virtualbox" do |v| v.customize ["modifyvm", :id, "--natdnshostresolver1", "on"] v.customize ["modifyvm", :id, "--natdnsproxy1", "on"] end

  • VagrantFile

    Dentro del mismo VagrantFile podemos definir varias mquinas virtuales.

    La configuracin en el interior de este mdulo es propia de esta mquina.

    Parmetros:

    Nombre de la mquina (web)

    Definimos que es la primaria.

    config.vm.define "web", primary: true do |web| end

  • VagrantFile

    Definimos la IP de la red privada que queremos usar.

    Hacemos forwarding de puertos para poder acceder a nuestra MV desde el exterior (otra mquina diferente a nuestro host)

    web.vm.network :private_network, ip: "192.168.33.10"web.vm.network :forwarded_port, guest: 80, host: 8080, auto_correct: trueweb.vm.network :forwarded_port, guest: 443, host: 8081, auto_correct: true

  • VagrantFile

    Definimos el HostName de nuestra mquina virtual.

    Compartimos directorios en host y MV

    create: true Crea el directorio en el host en caso de no existir.

    Podemos compartir usando: VirtualBox o NFS

    web.vm.hostname = "uvinumVm"web.vm.synced_folder "./shared/www", "/var/www", create: trueweb.vm.synced_folder "./shared/logs", "/var/log/verticomm", create: true

  • VagrantFile

    Provisionamos nuestra mquina usando el tipo de porvision va Shell.

    Este script se ejecuta siempre que povisionamos la mquina.

    web.vm.provision :shell, path: "shell/web_provision_ansible.sh", args: ["uvinumVm"]

  • VagrantFile

    Otra MV gestiona por el mismo VagrantFile.

    Parmetros:

    autostart: false No se inicia al hacer un vagrant up

    config.vm.define "marawler_node", autostart: false do |marawler_node| marawler_node.vm.hostname = "marawlerNode" marawler_node.vm.network :private_network, ip: "192.168.33.11" marawler_node.vm.provision :shell, path: "shell/marawler_node.sh", args: ["marawlerNode"] end

  • Y Ansible?Y la Europea?

  • Intro a Ansible

    Simple y directo para configurar una mquina

    Usa YAML para definir la infraestructura. Es Human-readable y es como una documentacin.

    No necesita instalar nada en los nodos que vamos a provisionar :) (Bueno ssh + Python 2.5)

    Lo usa Twitter, Atlassian, Spotify, etc

  • Diagrama Ansible

  • Diagrama Ansible

  • Instalacin

    Slo hay que instalar Ansible en la Controller Machine

    Requisitos: Python 2.6 or 2.7 installed (Windows no soportado)

    En Mac (usando Brew)

    $ brew install ansible

    http://brew.sh/

  • Playbook

    Un Playbook es el trmino que usa Ansible para un script que gestiona configuraciones.

    Escrito en YAML

    Es siempre nuestro punto de entrada en la ejecucin de Ansible.

  • Playbook

    - name: My first playbook :) hosts: web-test sudo: true tasks: - name: Install Apache yum: pkg=httpd state=present

  • Playbook

    Un Playbook es una lista de Plays

    Cada Play debe contener:

    hosts

    tasks

    Usan modules: yum, file, copy, service

  • Inventories

    Inventories son los hosts que Ansible podr provisionar.

    Contenido del fichero: inventories/hosts web-test 192.168.33.10

    Otro ejemplo web-test ansible_ssh_host=127.0.0.1 ansible_ssh_port=2222 ansible_ssh_user=vagrant ansible_ssh_private_key_file=../vagrant/.vagrant/machines/web/virtualbox/private_key

  • Ejecucin

    $ ansible-playbook playbook_test.yml -i inventories/hosts

  • Escribiendo Playbooks: Variables

    En nuestro Playbook podemos utilizar variables: ---- name: My first playbook :) hosts: web-test sudo: true vars: webserver: httpd state: present tasks: - name: Install Apache yum: pkg={{ webserver }} state= {{ state }}

  • Escribiendo Playbooks: Condicionales

    Condicionales ---- name: My first playbook :) hosts: web-test sudo: true vars: webserver: httpd state: present tasks: - name: Install Apache yum: pkg={{ webserver }} state={{ state }} when: ansible_os_family == "RedHat"

  • Escribiendo Playbooks: Condicionales

    - name: Check if PHP is installed register: php_installed command: php -v ignore_errors: true- name: Do something if PHP is installed debug: var=php_installed when: php_installed|success- name: Do something if PHP is NOT installed debug: msg='PHP is NOT installed' when: php_installed|failed

  • Escribiendo Playbooks: Iteraciones

    - name: Install multiple packages yum: name={{item}} state=installed with_items: - vim - telnet - gcc

  • Escribiendo Playbooks: Iteraciones

    ---- name: My first playbook :) hosts: web-test sudo: true vars: common_packages: - vim - telnet - gcc tasks: - name: Install multiple packages yum: name={{item}} state=installed with_items: common_packages

  • Escribiendo Playbooks: Templates

    Un template es un fichero que puede utilizar nuestras variables: templates/index.html

    Hello {{ name_to_say_hello }}!

    Y en nuestro Playbook:

    - name: Use template template: src=templates/index.html dest=/home/vagrant/index_file.html

  • Escribiendo Playbooks: Handlers

    Los handlers nos permiten gestionar servicios de nuestro sistema. Ejemplo: reiniciar Apache.

    ---- name: My first playbook :) hosts: web-test sudo: true vars: name_to_say_hello: Pablo tasks: - name: Use template template: src=templates/index.html dest=/home/vagrant/index_new.html notify: restart apache handlers: - name: restart apache service: name=httpd state=restarted

  • Organizando Playbooks

    Los playbooks pueden crecer hasta el infinito y por ello podemos organizarlos usando:

    inclusin de Plays

    Roles

  • Organizando Playbooks: inclusin

    ---- name: My first playbook :) hosts: web-test sudo: true vars: name_to_say_hello: Pablo tasks: - include: tasks/writeFile.yml handlers: - name: restart apache service: name=httpd state=restarted

  • Organizando Playbooks: Roles

    ---- name: My first playbook :) hosts: web-test sudo: true vars: name_to_say_hello: Pablo roles: - writeFile

  • Organizando Playbooks: Roles

    Los roles tienen que seguir esta estructura. Obligatorio un main.yml

  • Organizando Playbooks: Galaxy Ansible

    Galaxy Ansible es un repositorio de roles pblicos que se pueden usar en nuestros Playbooks isntalndolos previamente en la Controller Machine.

    $ ansible-galaxy install geerlingguy.git

    $ ansible-galaxy install geerlingguy.git,1.1.1

    https://galaxy.ansible.com/geerlingguy/git/

    https://gal