Post185 nn

Automatización de arquitectura TI con Ansible


12063705 10207273024561428 59106377850244238 n
Felipe Barrios

 

Hola en este artículo vamos a conocer una herramienta de código abierto, llamada Ansible, la cual nos permitirá administrar y configurar servidores, los cuales son muy importante a la hora de enfrentar cualquier tipo de problema, ya sea al momento de actualizar algún servicio, de poder hacer algún cambio a toda nuestra arquitectura, instalar algún nuevo servicio, administrar algún tipo de llave RSA para el manejo de acceso entre otros, pero antes vamos a definir que es posible, su instalación para luego mostrar algunos ejemplos básicos que ocupo en mi dia a dia al momento de configurar una nueva máquina.

 

¿Que es ansible?

 

Ansible es una plataforma de software libre para configurar y administrar computadoras. Combina instalación multi-nodo, ejecuciones de tareas ad hoc y administración de configuraciones. Adicionalmente, Ansible es categorizado como una herramienta de orquestación.​

 

Documentación: https://www.ansible.com/

 

Ventajas:

 

Módulos infinitos, ansible se envía con una serie de módulos (llamados "biblioteca de módulos") que se pueden ejecutar directamente en hosts remotos o mediante Playbooks.

 

Documentación: https://docs.ansible.com/ansible/latest/user_guide/modules.html

 

Conceptos importantes:

 

Primero revisemos algunos términos importantes de Ansible:

  • Playbook, un archivo donde listamos las tareas que de deben ejecutar. Se escribe en formato YAML

  • Task, un bloque dentro del Playbook que define una acción específica a realizar, pj: instalar un paquete.

  • Module, son como plugins que permiten realizar tareas de forma más fácil.

  • Role, una forma de ordenar los diferentes Playbooks.

  • Play, se refiere a la ejecución de un Playbook.

  • Facts, variables dentro de Ansible que contienen información sobre los servidores. Ej: Sistema Operativo, Cantidad de Ram, Direcciones IP, etc.

  • Handlers, código que se usa cuando algo cambia. Por ej: si actualizas el archivo de configuración de Apache, un Handler re-iniciará el servicio httpd.

Instalación:

 

# RedHat
$ yum install ansible

# Debian y Clones
$ apt-get install ansible

# En Mac Os X con Homebrew
$ brew install ansible

 

Comprobamos ejecunado el comando ansible;

$ ansible

Usage: ansible <host-pattern> [options]
Define and run a single task 'playbook' against a set of hosts
Options:
  -a MODULE_ARGS, --args=MODULE_ARGS
                        module arguments
  --ask-vault-pass      ask for vault password
  -B SECONDS, --background=SECONDS
                        run asynchronously, failing after X seconds
                        (default=N/A)
...
Some modules do not make sense in Ad-Hoc (include, meta, etc)

 

Tus primeros comandos

 

Ahora que ha instalado Ansible, es hora de comenzar con algunos conceptos básicos.

Edite (o cree) /etc/ansible/hosts y coloque uno o más sistemas remotos en él. Su clave SSH pública debe estar ubicada en authorized_keys esos sistemas:

 

232.12.22.50 
subdomain.example.org 
subdomain1.example.org

 

Asumiremos que está utilizando claves SSH para la autenticación. Para configurar el agente SSH para evitar volver a escribir las contraseñas, puede hacer:

 

$ ssh-agent bash
$ ssh-add ~ / .ssh / id_rsa


Si queremos especificar otro usuario, por ejemplo deploy:

ansible.dns.cl ansible_user=deploy

En caso de crear una instancia en AWS, y mediante nuestro archivo pem obtenemos acceso:

 

ansible.dns.cl ansible_ssh_user=ubuntu ansible_ssh_private_key_file=./pem/aws-private.pem

 

Para validar el acceso a los servidores:

 

ansible all -m ping


Ansible intentará conectarse de forma remota a las máquinas con su nombre de usuario actual, al igual que lo haría SSH. Para anular el nombre de usuario remoto, simplemente use el parámetro '-u'.

Si desea acceder al modo sudo, también hay indicadores para hacerlo:

 

# como bruce
$ ansible all -m ping -u bruce
# como bruce, sudoing a root
$ ansible all -m ping -u bruce --sudo
# como bruce, sudoing a batman
$ ansible all -m ping -u bruce --sudo --sudo-usuario batman

# Con la última versión de ansible `sudo` está en desuso, por lo que se convierte en 
# as bruce, sudoing to root
$ ansible all -m ping -u bruce -b
# como bruce, sudoing a batman
$ ansible all -m ping -u bruce -b - se convierte en un usuario batman

 

Hasta el momento hemos visto cómo realizar la configuración del acceso al servidor, mediante usuario y archivo pem, configuración de archivo host a continuación vamos a ver algunos ejemplos de cómo automatizar nuestras instalaciones mediante task, para el creamos un archivo con formato yml, en donde indicaremos todas las instruccciones que queremos realizar en el servidor: el archivo lo denominaremos task.yml.

 

Y pasamos una simple instrucción de instalar python en la máquina:

 

- hosts: ansible.dns.cl
  become: true
  gather_facts: no
  tasks:
    - name: apt-get update
      raw: apt-get update -qq
    - name: install python 2.7 and aptitude
      raw: apt-get install -qq python2.7 python-psycopg2 aptitude
    - name: set python 2.7 as default
      raw: update-alternatives --install /usr/bin/python python /usr/bin/python2.7 1

 

Ejemplo de creación de variables locales y de entorno:

 

  vars:
    # dynamic attributes
    name: name
    dbpassword: mysecretpassword
    dbname: dbname_production
    dbuser: deploy
    environment_config:
      LANGUAGE: en_US.UTF-8
      LC_ALL: en_US.UTF-8
      MEMCACHE_SERVER: 127.0.0.1:11211
      ACCESS_KEY_ID: ''
      SECRET_ACCESS_KEY: ''
      BUCKET: ''
      AWS_REGION: ''
      SENTRY_SIETEA: ''
      SENTRY_SIETEA_REPORT: ''

 

Ejemplo de configuración de horario:

  tasks:
    - name: 1.6 Set timezone variables
      copy: 
        content: 'America/Santiago'
        dest: /etc/timezone
        owner: root
        group: root
        mode: 0644
        backup: yes
      notify:
        - update timezone
  handlers:
    - name: 1.6 update timezone
      command: dpkg-reconfigure --frontend noninteractive tzdata

 

En caso de querer organizar mejor la estructura, de la instalación de paquetes en mi caso los separó por partials en donde cada uno tiene una función en específica, luego solo las llamo y las ejecutó todas de manera secuencial:

 

  tasks:
    - import_tasks: change_name.yml
    - import_tasks: hosts.yml

 

Creacion de usuario:

#
# Creación de usuario deploy
#
  - name: Create user
    user:
      name: deploy
      state: present
      comment: --gecos ''
      shell: /bin/bash
      createhome: yes
      home: /home/deploy

  - name: SYSTEM - Set authorized key for test_user took from file fbarrios
    tags: system-user
    authorized_key:
      user: ubuntu
      state: present
      key: "{{ lookup('file', '/Users/fbarrios/Documents/ansible/pem/id_rsa_fbarrios.pub') }}"

  - name: SYSTEM - Set authorized key for test_user took from file aleliu
    authorized_key:
      user: ubuntu
      state: present
      key: "{{ lookup('file', '/Users/fbarrios/Documents/ansible/pem/id_rsa_cloud9_aleliu.pub') }}"

  - name: copy - .ssh
    command: cp -R .ssh/ /home/deploy/

  - name: chown
    command: chown -R deploy:deploy /home/deploy

  - name: Allow 'deploy' group to have passwordless sudo
    lineinfile:
      dest: /etc/sudoers
      state: present
      regexp: '^%deploy'
      line: 'deploy ALL=(ALL) NOPASSWD: ALL'
      validate: 'visudo -cf %s'


 

Creación de certificado cerbot

 

#
# Instalación y configuración HTTPS Certbot
#
  - name: Install packages
    apt:
      name: "{{ item }}"
      state: present
    with_items:
    - software-properties-common
  - name: Add certbot repository
    apt_repository:
      repo: 'ppa:certbot/certbot'
      update_cache: true
  - name: Install packages
    apt:
      name: "{{ item }}"
      state: present
    with_items:
    - letsencrypt
    - certbot
    - python-certbot-nginx

  - name: Generate strong DHE parameter - openssl dhparam
    command: openssl dhparam -out /etc/ssl/dhparam.pem 4096 creates=/etc/ssl/dhparam.pem

 

Instalacion de ruby

#
# Instalación ruby 2.3.5
#    
  - name: Install ruby 2.3.5
    apt_repository:
      repo: 'ppa:brightbox/ruby-ng'
      update_cache: true
  - name: Install packages
    apt:
      name: "{{ item }}"
      state: present
    with_items:
    - ruby2.3
    - ruby2.3-dev
  - name: Install Bundler
    command: bash -lc "gem install bundler --no-ri --no-rdoc"

 

Instalar nmap

- name: Instalar nmap
  yum: name=nmap state=latest

 

Bueno como hemos visto, con ansible podemos configurar un mundo de aplicaciones, de manera sencilla y mejorando los tiempos de respuestas a la hora de administrar u configurar una maquina, actualmente existen otro tipo de soluciones como docker, kubernetes muy potentes a la hora de adminsitrar una arquitectura, pero no es malo resaltar alternativas a la hora de decirdir que tecnologia utilizar, espero que les sirva y estare compartiendo pequeños scrips que utilizo a la hora de administrar servidores.



Artículos que te pueden interesar