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.