====== Ejecutar comando con otro usuario ====== Ponemos la contraseña de sudo en el fichero de hosts: /etc/ansible/hosts [jose] 172.17.0.1 ansible_connection=ssh ansible_ssh_user=jose ansible_ssh_pass=**** ansible_sudo_pass=**** Ejecutamos el siguiente playbook: - name: Ejecutar comando con otro usuario hosts: jose tasks: - name: Ejecutar sudo ls /root shell: ls /root become: true become_user: root ignore_errors: yes register: uname_result # En una misma línea - debug: msg="{{ uname_result.stdout }}" # En lineas separadas - debug: msg="{{ uname_result.stdout_lines }}" Ejecutamos: ansible-playbook sudo.yml ====== Bucles ====== Por defecto la variable del bucle es item tasks: - name: list variables debug: msg="reading from {{item.soft}} and {{item.directori}}" with_items: - { soft: 'apache.zip', directori: '/opt/pogramas/webserver' } - { soft: 'java7.zip', directori: '/opt/pogramas/java' } Cambiando la variable del bucle tasks: - name: list variables debug: msg="reading from {{mi_variable.soft}} and {{mi_variable.directori}}" with_items: - { soft: 'apache.zip', directori: '/opt/pogramas/webserver' } - { soft: 'java7.zip', directori: '/opt/pogramas/java' } loop_control: loop_var: mi_variable ====== Variables para cada servidor ====== Dentro de vars/.yml El nombre del fichero da igual, pero mejor poner algo representativo --- vars: hosts: server1: variable_comun: valor1 server2: variable_comun: valor2 ====== Precedencia varaibles ====== Este es el orden, de mayor precedencia a menor precedencia, de las variables: 1. extra vars --extra-vars "myvar=extra-vars" 2. playbook install-mysql.yml 3. role role/mysql/vars/main.yml 4. groups group_vars/database.yml 5. role defaults role/mysql/defaults/main.yml **TODO**: poner un ejemplo complejo para que se vean las buenas prácticas de hacer roles reusables ====== Almacenar información sensible (vaults) ====== ===== Crear archivo con y sin cifrar ===== 1. Crear un archivo con las variables, y llamarlo "vars.yml" con el siguiente contenido: var1 = "pepe" 2. Copiar el archivo y llamarlo "vault.yml": cp vars.yml vault.yml 3. Editar "vault.yml" y añadir (es pura convención) "vault_" delante de cada variable: vault_var1 = "pepe" 4. Cifrar "vault.yml", le añadiremos la etiqueta (es pura convención) "prod": ansible-vault encrypt vault.yml --vault-id prod@prompt 5. Teclear dos veces la contraseña (y anotarla en algún lugar) 6. Editar "vars.yml" para que cada variable apunte a su correspondiente "vault_": vim vault.yml Y dejarlo tal que así: var1 = "{{ vault_var1 }}" 7. Incluir los archivos "vars.yml" y "vault.yml". En este ejemplo lo hacemos en las tasks: - name: Include vars.yml include_vars: vars.yml - name: Include vault.yml include_vars: vault.yml ===== Cifrar un archivo ===== En este ejemplo: * Ciframos un archivo entero * El módulo de ansible se encarga de descrifrarlo, descomprimirlo y dejarlo en destino Tenemos el siguiente diseño de archivos: . ├── hosts ├── roles │   ├── example │   │   ├── files │   │   │   └── files.tar.bz2 │   │   ├── tasks │   │   │   ├── main.yml 1. Cifrar el archivo, en este caso "files.tar.bz2" ansible-vault encrypt roles/example/files/files.tar.bz2 --vault-id prod@prompt 2. Escribir la contraseña 3. Añadir una tarea: - name: Uncompress the wordrepss files in docker host volume unarchive: src: files.tar.bz2 dest: /tmp become: true Nótese que dado que usamos roles no hay que especificar el path absoluto de "files.tar.bz2". 4. Ejecutar el playbook. El resultado esperado es que descifrará "files.tar.bz2" y lo dejará en "/tmp" en el servidor remoto ===== Comandos útiles ===== * Editar archivo encriptado ansible-vault edit vault.yml --ask-vault-pass * Editar y proporcionar archivo (con la contraseña en plano) para no tener que teclearla cada vez ansible-vault edit vault.yml --vault-id prod@examples/password * Editar y proporcionar archivo (con la contraseña en plano) para no tener que teclearla cada vez ansible-vault view vault.yml --vault-id prod@examples/password