= 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''