= utilidades
== 3:32 Comando Utilidades (I)
ejecución de comandos en el nodo remoto
* command
* expect : ejecuta un comando y responde a la introducción de dataos
* raw : envía comandos sin filtrar por SSH
* script : transfiere y ejecuta un script
* shell : permite uso de && || >> (command no lo permite)
=== command
[[https://docs.ansible.com/ansible/latest/modules/command_module.html#command-module]]
* chdir : cambiar directorio ejecución
* creates : si existe el fichero, NO ejecuta
* executable : ruta binario
* removes : si no existe el fichero, NO ejecuta
- name: obtener uname
command: uname -a
register: salida_uname
- name: crear base de datos si no existe
command: /sbin/createdb.sh
args:
chdir: /var/lib/mysql
creates: /basededatos/existe
- name: ejecutar si existe
command uname -a removes=/tmp/hadeexistir
=== expect
[[https://docs.ansible.com/ansible/latest/modules/expect_module.html#expect-module]]
* requerido
* command = comando
* response = respuestas
* opcional
* chdir
* creates
* removes
* echo
* timeout
- name: instalar pexpect, necesario en el nodo remoto
yum: name=pexpect state=latest
- name: cambiar contraseña usuario
expect:
command: passwd usuario
responses: (?i)password: "SuperSecreta"
instalar versión específica (en módulo Phyton): ''pip install pexpect==3.3''
== 3:33 Comando Utilidades (II)
=== raw
usar en casos muy concretos (dispositivos sin Phyton o versiones viejas), viaja sin encriptar\\
[[https://docs.ansible.com/ansible/latest/modules/raw_module.html#raw-module]]
* executable = /ruta/ejecutable
- name: actualizar paquetes e instalar uno
raw: apt-get update && apt-get install vim
=== script
copia el script en el nodo y se ejecuta allí\\
[[https://docs.ansible.com/ansible/latest/modules/script_module.html#script-module]]
* creates = /fichero/comprobar <- si existe, no ejecuta
* removes = /fichero/comprobar <- si no existe, no ejecuta
* decrypt = true / false <- vault
- name: copia y ejecuta el script
script: /mi/fichero/local.sh argumentos
=== shell
ejecuta comandos, pero permite (**command** no lo hace) el uso de tuberías, redirecciones, etc...\\
[[https://docs.ansible.com/ansible/latest/modules/shell_module.html#shell-module]]
* chdir = /directorio
* creates = /fichero/comprobar <- si existe, no ejecuta
* removes = /fichero/comprobar <- si no existe, no ejecuta
* executable
- name: obtener uname
shell: uname -a | tee fichero.log
register: salida_uname
- name obtener uname 2
shell: uname -a | tee fichero.log
args:
executable: /bin/bash
chdir: /tmp
=== assert
asegurarse que se cumplen ciertas condiciones\\
[[https://docs.ansible.com/ansible/latest/modules/assert_module.html#assert-module]]
* that : condiciones
* msg : mensaje a mostrar
- vars:
- numero: 50
- assert:
that:
- numero <= 100
- numero > 0
msg: "Número ha de estar entre 0 y 100"
===debug
muestra un texto personalizado o el valor de una variable\\
[[https://docs.ansible.com/ansible/latest/modules/debug_module.html#debug-module]]
* msg = "mensaje de texto"
* var= variable
* verbosity = [0-3]
- debug: msg="Hostname {{ ansible_hostname }}"
- debug: var=salida # muestra todo el array, se puede especificar cualquiera de ellos
=== pause
[[https://docs.ansible.com/ansible/latest/modules/pause_module.html#pause-module]]
* prompt = "texto a mostrar"
* minutes = minutos
* seconds = segundos
=== fail
generar mensaje error y salir\\
[[https://docs.ansible.com/ansible/latest/modules/fail_module.html#fail-module]]
* msg = "mensaje"
- fail: msg="Dato incorrecto"
when: valor not in ['y','Y']
== 3:34 Comando Utilidades (III)
=== include
incluir otro playbook / tareas\\
[[https://docs.ansible.com/ansible/latest/modules/include_module.html#include-module]]
%%/tasks/main.yml>
include: name="configura.yml"
include: name="install.yml"
include: name="post-install.yml"
=== include_role
incluir rol\\
[[https://docs.ansible.com/ansible/latest/modules/include_role_module.html#include-role-module]]
* obligatorio
* name
* opcional
* private = true / false
* tasks_from = main
* vars_from = main
* defaults_from = main
* allow_duplicates = true / false
=== include_vars
incluir variables desde un fichero, en lugar de tener una sección **vars:**\\
[[https://docs.ansible.com/ansible/latest/modules/include_vars_module.html#include-vars-module]]
---
- hosts: localhost
- vars:
- numero: 10
- tasks:
- include_vars: variables.yml
- include_rol: name=httpd # en directorio local o en /etc/ansible/roles o en /root/roles
otronumero: 20
=== self_fact
establece un fact\\
[[https://docs.ansible.com/ansible/latest/modules/set_fact_module.html#set-fact-module]]
permite modificar textos / variables
- tasks:
- set_fact: nombre="{{ ansible_hostname }}"
- debug: var=nombre
- set_fact: nombre2="{{ ansible_hostname | upper }}"
=== wait_for
espera que se cumpla una condición para continuar (conexión SSH o si un fichero existe, por ejemplo)\\
[[http://example.com|Enllaç extern]]https://docs.ansible.com/ansible/latest/modules/wait_for_module.html#wait-for-module]]
* state = { present | absent | started | stopped }
* files: present/absent, puertos: started/stopped
* port = puerto
* timeout = segundos de espera a conectar si no hay respuesta
* host = servidor al que conectar
* connection_timeout =
* search_regex = cadena esperada (ya sea conexión o fichero)
* delay = segundos de espera antes de empezar a enviar peticiiones
* path = /ruta/del/fichero
* exclude_hosts
- hosts: localhost
tasks:
- name: esperando al puerto 8080
wait_for: port=8080 delay=2
- name: esperando a que exista el fichero
wait_for: path=/fichero/esperado
- name: esperando a que no exista el fichero
wait_for: path=/fichero/espeado state=absent
- name: esperando a server
wait_for:
port: 22
host: "{{ ansible_hostname ]]"
search_regex: OpenSSH
delay: 10
delegate_to: localhost # ???
''nc -l 8080''