Amando Ansible

Ansible-logo

Click here if you want to read in English


Descargo de responsabilidad: Necesitas trabajar para automatizar. Por qué hacer algo manual en 5 minutos si podemos automatizarlo y hacerlo en 5 horas

Trabajemos con Ansible! Para serte honesto no llevo mucho tiempo trabajando con Ansible pero, lo que si te puedo decir es que utilizar, Ansible, YAML y ansible-playbook por mucho tiempo. Usare el terminal para trabajar con ansible y escribir las playbooks. Sabes de Ansible? Vamos a averiguarlo!

Estoy usando CentOS8, vamos a averiguar como obtener esto con ansible.

ansible <machine/group> -a “cat /etc/os-release” -i <inventory/hosts>

OS-release

La mejor fuente de informacion es el propio sitio de ansible .

Otra fuente interesante de información es el sitio oficial de Twitter RedHat Ansible Automation Platform.

Te recomendaré unas herramientas geniales para validar YAML y tambien una IDE que esta interesante para trabajar con Ansible

Mejores herramientas
  • YAML Lint → Validador de Yaml http://www.yamllint.com/
  • Para la IDE puedes utilizar ATOM. Puedes instalar install apm install linter-js-yaml para la validación de yaml
  • Ansible galaxy Puedes encontrar miles de roles de Ansible para infinidad de tareas (tasks) tales como (automatización, configurición de servidores, etc)
  • Ansible-playable de mmumshad para tener una UI que te ayude ha crear playbooks, modules, etc.

Primero que todo, deberemos tener clara la Terminologia básica

  • Task: Instrucciones para correr en las máquinas
  • Play: Combinación de tareas (Tasks)
  • Playbook: Combinación de multiples plays en orden
  • host/inventory: Archivo con la lista de máquinas en las que correras tus playbooks
  • vars/facts: Variables, pueden estar almacenadas en un archivo o en una boveda (ansible-vault) o ser conseguidas desde el host
  • list: Arreglo en JSON y YAML
  • Dictionary: en JSON y YAML

Ansible te permite empezar un playbook (ansible-playbook) desde una task especifica

Si una task falla en tu playbook (una vez arreglada), puedes correr el playbook desde un lugar especifico

ansible-playbook playbook.yml –start-at-task=”task_name”

Abajo puedes ver un ejemplo de un archivo de Ansible

 name: 'Execute a script on all web server nodes'
    hosts: web_nodes
    tasks:
        - name: Add a line to a file
          lineinfile:
            path: /etc/resolv.conf
            line: nameserver 10.1.250.10
    create: yes # if file do not exist create it
        - name: 'create a new web user'
          user:
            name: web_user
            uid: 1040
            group: developers
Si por algún motivo la segunda acción (task) falla, podras correr el playbook desde este punto.

Ansible usa modulos lo cual hace nuestra vida mucho más sencilla, por ejemplo: podemos tener modulos que manejen los servidores, la nubem archivos, etc.

Una de las mejores partes de Ansible es el uso de variables y condicionales

    name: 'Execute a script on all web server nodes'
    hosts: all_servers
    tasks:
        -
            service: 'name=mysql state=started'
            when: ansible_host == "hola.com"
En el cual, le diremos al playbook que corra en todos los servidores (all servers) usando ansible host. Sin embargo, la task solo correra en nsible_host == "hola.com" 
Puedo utilizar mis propios scripts?

Si, claro! Sin embargo, si Ansible tiene un modulo para hacer lo mismo que tu script porque no utilizarlo el modulo.

Es la instalación de Ansible una pesadilla?

Para nada! Solo sigue los siguientes comandos y estaras un paso mas cerca de automatizar tus máquinas.

  • sudo dnf -y install epel-release
  • dnf search ansible
  • sudo dnf install -y ansible.noarch
  • Crea un usuario para ansible en la máquinas y concedele permisos, crea la siguiente regla:
    • En /etc/sudoers.d
    • echo “ansible ALL=(ALL) NOPASSWD: ALL” >> /etc/sudoers.d/ansible
    • O use usermod -aG wheel username

Revisa tu archivo de inventario por defecto en /etc/ansible/ansible.cfg

Finalmente, prueba corriendo ansible <machine/group> -m ping -i inventory.txt

Resultado del modulo ping

En el que el target1 es una VM encendida y target2 es una VM apagada.

Todo lo anterior solo para hacer ping?

Wow! super práctico (no realmente!). Ahora vamos a hacer algo más interesante . El codigo que vamos a utilizar esta abajo y dentro de un playbook llamado playbook-DBcreation.yaml

---

- hosts: target 
  gather_facts: yes
  vars:
    mysql:
      ansible_dest_path: /opt/ansible_sw/bit8_scripts
      mysql_db_schema: "table" #create db schema
      mysql_db_schema_rep: "other_table" #create db schema
      db_user: "user"
      db_pass: "pass"
      db_user_rep: "user_other"
      db_pass_rep: "pass"
      mysql_root_user: "root"
      mysql_root_pass: "alejandro"

  tasks:
  - name: TASK0 - Mysql installation
    yum:
      name: python3-PyMySQL.noarch 
      state: present

  - name: TASK1 - Create Schema using "{{ mysql.mysql_db_schema }}"
    mysql_db:
      login_user: root
      login_password: "{{ mysql.mysql_root_pass }}"
      name: "{{ mysql.mysql_db_schema }}"
      encoding: utf8
      collation: utf8_general_ci


  - name: TASK 2 - Create second Schema using "{{ mysql.mysql_db_schema_rep }}"
    mysql_db:
      login_user: root
      login_password: "{{ mysql.mysql_root_pass }}"
      name: "{{ mysql.mysql_db_schema_rep }}"
      encoding: utf8
      collation: utf8_general_ci


  - name: TASK 3 - Create database admin user 
    mysql_user:
      login_user: root
      login_password: "{{ mysql.mysql_root_pass }}"
      name: admin
      host: "127.0.0.1"
      priv: '*.*:ALL'
      state: present

  - name: TASK 4 - Create a user 
    mysql_user:
      login_user: root
      login_password: "{{ mysql.mysql_root_pass }}"
      name: "{{ mysql.db_user }}"
      password: "{{ mysql.db_pass }}"
      host: "%"
      priv: "'{{ mysql.mysql_db_schema }}'.*:ALL"
      state: present

  - name: TASK 5 - Create another user 
    mysql_user:
      login_user: root
      login_password: "{{ mysql.mysql_root_pass }}"
      name: "{{ mysql.db_user_rep }}"
      password: "{{ mysql.db_pass_rep }}"
      host: "%"
      priv: 'mysql_db_schema_rep.*:ALL'
      state: present

Para correr el playbook: sudo ansible-playbook playbook-DBcreation.yaml -i inventory.txt

Estoy usando inventory.txt y ansible-vaults pero esto lo explicaré en un post más adelante.

Resultado del Playbook

Cuando el playbook corre en target1, se completa satisfactoriamente, ya que está máquina esta usando las credenciales correctas.

Máquina Target1

Como ves, no fue tan díficil despues de todo 🙂


En mis próximas entradas estaré escribiendo de stocks, dividendos, aristocratas de ansible-vault, ansible-playbook, ansible-inventory y mucho más. Sigue conectado y gracias por seguir el blog!

Si tienes tiempo, revisa mis otros posts y dejame saber si haz hecho algo similar

techyinvestor.com


Para saber más de Apache aqui

Para saber mas de finanzas e inversión parteI y parteII

Para saber mas sobre deportes

21 thoughts on “Amando Ansible

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: