Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Introducción a Ansible

1,281 views

Published on

Introducción a Ansible: Instalación, configuración, uso y ejemplos.

Published in: Engineering
  • Login to see the comments

Introducción a Ansible

  1. 1. Ansible: Provisionando el futuro Introducción, instalación y uso @pabloros
  2. 2. De dónde venimos… Nuestro entorno de desarrollo utiliza una máquina virtual gestionada por Vagrant y provisionada con Puppet Nuestros servidores de producción se configuran de forma manual con muchos ficheros de configuración versionados.
  3. 3. … A dónde vamos Nuestro entorno de desarrollo utiliza una máquina virtual gestionada por Vagrant y provisionada con Ansible Nuestros servidores de producción se provisionarán con Ansible.
  4. 4. Nuestro Objetivo Automatizar el provision de máquinas tanto de producción como de desarrollo. Conseguir tener el mismo entorno en producción que en desarrollo (al menos lo más similar posible)
  5. 5. ¿Qué fue primero? Empezaremos configurando nuestro Ansible en desarrollo Utilizaremos Vagrant para levantar la máquina virtual Una vez finalizado, provisionaremos producción.
  6. 6. Vagrant Acercándonos a producción
  7. 7. Por qué Vagrant ? Nos simplifica la puesta en marcha de la máquina virtual. Nos da herramientas para provisionar nuestra MV. Fácil de compartir: puedes tener tu MV con un sólo fichero: VagrantFile
  8. 8. 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"]
 end
 end
  9. 9. VagrantFile Box que vamos a utilzar. CentOS Hacemos forward agent para poder disponer de las keys de la máquina host. Compartimos el directorio Ansible (veremos más adelante) config.vm.box = "centos64_x86"
 config.ssh.forward_agent = true
 config.vm.synced_folder "../ansible", "/ansible"

  10. 10. VagrantFile Configuramos que nuestra máquina virtual use la misma resolución 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
  11. 11. VagrantFile Dentro del mismo VagrantFile podemos definir varias máquinas virtuales. La configuración en el interior de este módulo es propia de esta máquina. Parámetros: Nombre de la máquina (web) Definimos que es la primaria. config.vm.define "web", primary: true do |web|
 … end
  12. 12. 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 máquina 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: true
 web.vm.network :forwarded_port, guest: 443, host: 8081, auto_correct: true
  13. 13. VagrantFile Definimos el HostName de nuestra máquina 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: true
 web.vm.synced_folder "./shared/logs", "/var/log/verticomm", create: true

  14. 14. VagrantFile Provisionamos nuestra máquina usando el tipo de porvision vía Shell. Este script se ejecuta siempre que povisionamos la máquina. web.vm.provision :shell, path: "shell/ web_provision_ansible.sh", args: ["uvinumVm"]
  15. 15. VagrantFile Otra MV gestiona por el mismo VagrantFile. Parámetros: 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
  16. 16. Y… Ansible? Y la Europea?
  17. 17. Intro a Ansible Simple y directo para configurar una máquina Usa YAML para definir la infraestructura. Es Human- readable y es como una documentación. No necesita instalar nada en los nodos que vamos a provisionar :)(Bueno… ssh + Python 2.5) Lo usa Twitter, Atlassian, Spotify, etc…
  18. 18. Diagrama Ansible
  19. 19. Diagrama Ansible
  20. 20. Instalación Sólo 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
  21. 21. Playbook Un Playbook es el término que usa Ansible para un script que gestiona configuraciones. Escrito en YAML Es siempre nuestro punto de entrada en la ejecución de Ansible.
  22. 22. Playbook - name: My first playbook :)
 hosts: web-test
 sudo: true
 tasks:
 - name: Install Apache
 yum: pkg=httpd state=present

  23. 23. Playbook Un Playbook es una lista de Plays Cada Play debe contener: hosts tasks Usan modules: yum, file, copy, service…
  24. 24. 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
  25. 25. Ejecución $ ansible-playbook playbook_test.yml -i inventories/hosts
  26. 26. 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 }}
  27. 27. 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"
  28. 28. 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
  29. 29. Escribiendo Playbooks: Iteraciones - name: Install multiple packages
 yum: name={{item}} state=installed
 with_items:
 - vim
 - telnet
 - gcc

  30. 30. 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
  31. 31. Escribiendo Playbooks: Templates Un template es un fichero que puede utilizar nuestras variables: templates/index.html <h1>Hello {{ name_to_say_hello }}!</h1> Y en nuestro Playbook: - name: Use template
 template: src=templates/index.html dest=/home/vagrant/index_file.html

  32. 32. 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
  33. 33. Organizando Playbooks Los playbooks pueden crecer hasta el infinito y por ello podemos organizarlos usando: inclusión de Plays Roles
  34. 34. Organizando Playbooks: inclusión ---
 - 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
  35. 35. Organizando Playbooks: Roles ---
 - name: My first playbook :)
 hosts: web-test
 sudo: true
 vars:
 name_to_say_hello: Pablo
 roles:
 - writeFile
  36. 36. Organizando Playbooks: Roles Los roles tienen que seguir esta estructura. Obligatorio un main.yml
  37. 37. Organizando Playbooks: Galaxy Ansible Galaxy Ansible es un repositorio de roles públicos que se pueden usar en nuestros Playbooks isntalándolos previamente en la Controller Machine. $ ansible-galaxy install geerlingguy.git $ ansible-galaxy install geerlingguy.git,1.1.1 https://galaxy.ansible.com/geerlingguy/git/
  38. 38. Organizando Playbooks: Galaxy Ansible Uso desde el playbook: ---
 - name: My first playbook :)
 hosts: web-test
 sudo: true
 vars:
 name_to_say_hello: Pablo
 roles:
 - { role: geerlingguy.git }
  39. 39. Organizando Playbooks: Group Vars Podemos agrupar variables dentro del directorio group_vars, por inventories y por roles. Añadimos grupos en los inventories: [web]
 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
  40. 40. Organizando Playbooks: Group Vars Nombre directorio por inventario y nombre de fichero por role.
  41. 41. Vagrant + Ansible Provisionando Entorno de Desarrollo
  42. 42. Provision Tenemos dos opciones: Vagrant soporta Ansible como provisioner Usar Ansible desde dentro de la MV que levanta Vagrant.
  43. 43. Provision Vagrant soporta Ansible como provisioner: PRO: Usamos un método nativo de Vagrant para provisionar. CON: Dependemos que todas las máquinas hosts tengan instalado Ansible y los módulos que queremos utilizar. CON: Y que no sea Windows…
  44. 44. Provision Usar Ansible desde dentro de la MV: PRO: La máquina host no necesita nada. PRO: Los módulos se gestionan con vagrant y así tener mayor control de versiones. CONS: Contra: usamos provision Shell de vagrant.
  45. 45. Provision Nos quedamos con la opción de usar Ansible desde la MV para tener mayor control y ninguna dependencia con la máquina host. web.vm.provision :shell, path: "shell/web_provision_ansible.sh", args: ["uvinumVm"]
  46. 46. #!/usr/bin/env bash
 
 if ! rpm -qa | grep -qw ansible;
 then
 echo "-> Installing Ansible"
 # Add Ansible Repository & Install Ansible
 wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm
 sudo rpm -Uvh epel-release-*.rpm
 sudo sed -i "s/mirrorlist=https/mirrorlist=http/" /etc/yum.repos.d/epel.repo
 
 # Install Ansible
 sudo yum -y install ansible
 
 # Add SSH key
 cat /ansible/files/authorized_keys >> /home/vagrant/.ssh/authorized_keys
 else
 echo "-> Ansible already Installed!"
 fi
 
 # Install Ansible Galaxy modules
 # To review in furure: http://docs.ansible.com/ansible/galaxy.html#id12
 echo "-> Installing Ansibe Galaxy Modules"
 roles_list[8]='geerlingguy.git,1.1.0'
 
 for role_and_version in "${roles_list[@]}"
 do
 role_and_version_for_grep="${role_and_version/,/, }"
 
 if ! sudo ansible-galaxy list | grep -qw "$role_and_version_for_grep";
 then
 echo "Installing ${role_and_version}"
 sudo ansible-galaxy -f install $role_and_version
 else
 echo "Already installed ${role_and_version}"
 fi
 done
 
 # Execute Ansible
 echo "-> Execute Ansible"
 sudo ansible-playbook /ansible/playbook_test.yml -e hostname=$1 -i /ansible/inventories/hosts -- connection=local
  47. 47. Bibliografia Book: Lorin Hochstein. Ansible Up and Runnig. O’Reilly Ansible Docs: http://docs.ansible.com/ansible/ index.html @erikaheidi slides: https://speakerdeck.com/erikaheidi/ vagrant-provisioning-with-ansible
  48. 48. Dudas?? La semana que viene Más!!! :D

×