Ansible: ¿Puedo ejecutar el rol desde la línea de comando?

92

Supongamos que tengo un rol llamado "apache"

Ahora quiero ejecutar ese rol en el host 192.168.0.10 desde la línea de comando del host Ansible

ansible-playbook -i  "192.168.0.10" --role  "path to role"

¿Hay una manera de hacer eso?

Karl
fuente

Respuestas:

84

No conozco esta función, pero puede usar etiquetas para ejecutar solo un rol de su libro de jugadas.

roles:
    - {role: 'mysql', tags: 'mysql'}
    - {role: 'apache', tags: 'apache'}

ansible-playbook webserver.yml --tags "apache"
abuzze
fuente
62

Con ansible 2.7 puedes hacer esto:

$ cd /path/to/ansible/
$ ansible localhost -m include_role -a name=<role_name>
localhost | SUCCESS => {
    "changed": false,
    "include_variables": {
        "name": "<role_name>"
    }
}
localhost | SUCCESS => {
    "msg": "<role_name>"
}

Esto ejecutará el rol desde / ruta / a / ansible / roles o la ruta de rol configurada.

Lea más aquí: https://github.com/ansible/ansible/pull/43131

Julius Žaromskis
fuente
1
Esto realmente no responde a la pregunta porque no hay ninguna referencia al archivo YAML de rol externo que @kari implementó y quiere incluir. Tengo la misma pregunta. Sin embargo, después de leer esta respuesta, solo entiendo que es factible. Simplemente no sé cómo.
Kola
Espero haber aclarado la respuesta @Kola
Julius Žaromskis
1
Esto está roto en Ansible 2.8. Simplemente registra mensajes de error crípticos como'ERROR! 'async_val' is not a valid attribute for a IncludeRole'.
Christian Ciach
Esta solución parece funcionar para mí con ansible 2.8.2. Parece tener un problema al exponer las variables a otros roles incluidos dentro del rol original (lo cual no es un problema en un libro de jugadas). Intenté cambiarme a -a "name=<role_name> public=yes", pero eso no ayudó.
user2066480
Para comprender qué hacen -my -a, consulte docs.ansible.com/ansible/latest/user_guide/modules_intro.html Básicamente, así es como los módulos se pueden iniciar desde la línea de comandos ( -m <module-name>) con pares clave = valor como argumentos ( -a key=value)
andymel
22

No existe tal cosa en Ansible, pero si este es un caso de uso frecuente para usted, pruebe este script.
Colóquelo en algún lugar dentro de su RUTA de búsqueda bajo el nombre ansible-role:

#!/bin/bash

if [[ $# < 2 ]]; then
  cat <<HELP
Wrapper script for ansible-playbook to apply single role.

Usage: $0 <host-pattern> <role-name> [ansible-playbook options]

Examples:
  $0 dest_host my_role
  $0 custom_host my_role -i 'custom_host,' -vv --check
HELP
  exit
fi

HOST_PATTERN=$1
shift
ROLE=$1
shift

echo "Trying to apply role \"$ROLE\" to host/group \"$HOST_PATTERN\"..."

export ANSIBLE_ROLES_PATH="$(pwd)/roles"
export ANSIBLE_RETRY_FILES_ENABLED="False"
ansible-playbook "$@" /dev/stdin <<END
---
- hosts: $HOST_PATTERN
  roles:
    - $ROLE
END
Konstantin Suvorov
fuente
3
He creado una propuesta de herramienta "crear un rol ansible", veremos: github.com/ansible/proposals/issues/131
jhutar
4
Parece que se implementó en Ansible 2.7: github.com/ansible/ansible/pull/43131
EM0
Sí, inténtalo ansible localhost -m include_role -a name=myrole, ¡funciona para mí!
jhutar
ansible localhost -m include_role -a name=myroleestá roto desde ansible 2.8. Simplemente registra mensajes de error crípticos como'ERROR! 'async_val' is not a valid attribute for a IncludeRole'.
Christian Ciach
16

También puede consultar el repositorio ansible-toolbox . Te permitirá usar algo como

ansible-role --host 192.168.0.10 --gather --user centos --become my-role
Sasha Miroshnychenko
fuente
13

Escribí un pequeño complemento de Ansible, llamado auto_tags, que genera dinámicamente para cada rol en su libro de jugadas una etiqueta con el mismo nombre. Puedes encontrarlo aquí .

Después de instalarlo (las instrucciones están en la esencia de arriba), puede ejecutar un rol específico con:

ansible-playbook -i "192.168.0.10" --tags "name_of_role"

rkrzr
fuente
4

¿Has probado eso? es super guay. Estoy usando la función 'update-os' en lugar de 'apache' para dar un ejemplo más significativo. Tengo un rol llamado, digamos ./roles/update-os/en mi ./, agrego un archivo llamado ./role-update-os.ymlque se parece a:

#!/usr/bin/ansible-playbook
---
- hosts: all
  gather_facts: yes
  become: yes
  roles:
  - update-os

Haga que este archivo sea ejecutable ( chmod +x role-update-os.yml). Ahora puede ejecutar y limitar a lo que tenga en su inventario ./update-os.yml -i inventory-dev --limit 192.168.0.10el límite que también puede pasar los nombres de grupo.

  • --limit web,db > web y db es el grupo definido en su inventario
  • --limit 192.168.0.10,192.168.0.201
$ cat inventory-dev
[web]
192.168.0.10

[db]
192.168.0.201

Tenga en cuenta que puede configurar la política de claves ssh y sudoers para poder ejecutar sin tener que escribir una contraseña; ideal para la automatización, esto tiene implicaciones de seguridad. por lo tanto, debe analizar su entorno para ver si es adecuado.

Y Melo
fuente
2

en ansible 2.8 funciona ligeramente diferente

wohlgemuth@leela:~/workspace/rtmtb-ansible/kvm-cluster$ ansible localhost -m import_role -a name=rtmtb
 [WARNING]: No inventory was parsed, only implicit localhost is available

localhost | CHANGED => {
    "changed": true, 
    "checksum": "d31b41e68997e1c7f182bb56286edf993146dba1", 
    "dest": "/root/.ssh/id_rsa.github", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "b7831c4c72f3f62207b2b96d3d7ed9b3", 
    "mode": "0600", 
    "owner": "root", 
    "size": 3389, 
    "src": "/home/wohlgemuth/.ansible/tmp/ansible-tmp-1561491049.46-139127672211209/source", 
    "state": "file", 
    "uid": 0
}
localhost | CHANGED => {
    "changed": true, 
    "checksum": "1972ebcd25363f8e45adc91d38405dfc0386b5f0", 
    "dest": "/root/.ssh/config", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "f82552a9494e40403da4a80e4c528781", 
    "mode": "0644", 
    "owner": "root", 
    "size": 147, 
    "src": "/home/wohlgemuth/.ansible/tmp/ansible-tmp-1561491049.99-214274671218454/source", 
    "state": "file", 
    "uid": 0
}

berlinguyinca
fuente