Fabric: Las claves de roledefs adicionales más allá de 'hosts' no se cargan en env

Creado en 13 feb. 2015  ·  7Comentarios  ·  Fuente: fabric/fabric

Este fragmento de los documentos no hace que las claves de ejemplo 'foo' estén disponibles para el usuario a través de env, solo la clave 'hosts' es posteriormente cargada por Fabric (en env.hosts)

from fabric.api import env

env.roledefs = {
    'web': {
        'hosts': ['www1', 'www2', 'www3'],
        'foo': 'bar'
    },
    'dns': {
        'hosts': ['ns1', 'ns2'],
        'foo': 'baz'
    }
}

Documentado más en esta pregunta stackoverlow

Comentario más útil

@bitprophet ¿

Todos 7 comentarios

puede usar el siguiente ejemplo como archivo de configuración, luego agregar alguna función interna para manejar fabfiles.py

como: list.db
interfaz | ip | contraseña | rol ....
Espero que funcione para ti.

Hay varias claves de entorno que utiliza fabric para determinar a qué host (s) conectarse para cada sesión, es decir, roles, funciones_efectivas, hosts, cadena_host. Y, por supuesto, también a los decoradores.

Dicho esto, roledefs es solo un mapeo de nombres para agrupar hosts, no necesariamente combinado en env.hosts.

Definir las definiciones de rol como un dictado lo ayuda a organizar otras configuraciones personalizadas, junto a los hosts, que son específicas de la función. Puede acceder a ellos a través de la ruta env completa, es decir, env.roledefs.web.foo

Pero, como usted emite, y tal vez espera, es que un rol definido como dict debe fusionarse con la raíz env.
Esto es para lo que personalmente también lo uso. Simplemente no he encontrado una buena manera de implementarlo y extraer la solicitud todavía, debido a todas las formas posibles de establecer / obtener los roles "actuales" al ejecutar una tarea específica, y la complejidad al llamar a subtareas dentro de las tareas. . Explicado simplemente, hago esto suscribiéndome a los cambios en env y fusionando el rol cuando la clave roles se establece en env. Pero la parte "difícil" es mantener el estado y limpiar cualquier fusión de roles cuando se utilizan nuevos roles dentro de la sesión.

env.roledefs.web.foo produce el error: AttributeError: 'dict' object has no attribute 'web'

Quiero decir que podría acceder a él como un dictado normal, env.roledefs ['web'] ['foo'] pero luego no veo por qué esta funcionalidad existe en Fabric, es solo un dictado simple. ¿Parece que esta función se implementó por una razón más útil?

Lo siento, tienes razón, tienes que acceder a él como dices.

Actualmente, no hay otra razón que permitirle agrupar más configuraciones de roles junto a los hosts.
Pero, cuando se lanza el hito 1.11 y existe el # 1092, entonces tiene más sentido.

También el # 1088 es parte de 1.11, que es similar a lo que describe / espera. Pero todavía no he encontrado una manera agradable, como dije, de implementar la fusión de roledefs. Solo prueba de aceptación en la bifurcación usando un parche de mono profundo "feo".

Ah, está bien, me golpeaba la cabeza contra la pared pensando que me faltaba algo :) Parece que los números de los problemas mencionados ayudarán bastante cada vez que aparezcan. ¡Gracias Jonas!

Esto es confuso y creo que debería tenerse en cuenta en la documentación que estas variables adicionales no son accesibles fuera de las roledefs.

@bitprophet ¿

¿Fue útil esta página
0 / 5 - 0 calificaciones