En mi Vagrantfile, puedo especificar la URL de un cuadro:
config.vm.box_url = "http://example.com/my-box.pkg"
De acuerdo con la documentación más reciente , debería poder crear un archivo JSON que contenga las URL para diferentes versiones de la caja. La documentación también dice que puedo usar la URL de este archivo JSON cuando se ejecuta vagrant box add
. Esperaba poder usar la URL de ese archivo JSON para config.vm.box_url
. Sin embargo, eso no parece funcionar. Cuando lo intento, lo trata como un archivo de cuadro:
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Box 'my-box' could not be found. Attempting to find and install...
default: Box Provider: virtualbox
default: Box Version: >= 0
==> default: Adding box 'my-box' (v0) for provider: virtualbox
default: Downloading: http://example.com/my-box.pkg.json
default: Progress: 100% (Rate: 876k/s, Estimated time remaining: 0:00:01)
The box failed to unpackage properly. Please verify that the box
file you're trying to add is not corrupted and try again. The
output from attempting to unpackage (if any):
bsdtar.EXE: Unrecognized archive format: Illegal byte sequence
bsdtar.EXE: Error exit delayed from previous errors.
¿Es posible decirle a Vagrant que use un archivo JSON de metadatos de cuadro en mi archivo Vagrant? Prefiero no tener que usar Vagrant Cloud.
Respuestas:
A partir de hoy (2016-07-12, vagabundo 1.8.4), si desea ejecutar su propio catálogo de forma manual (es decir, actualizar manualmente los cuadros y editar el archivo metadata.json), pero aún así debe comportarse como un catálogo real, tenga en cuenta lo siguiente:
No es necesario que el archivo se llame "metadata.json". Se puede nombrar cualquier cosa, siempre que contenga los valores esperados. Estoy usando "metadata.json" aquí para aclarar los pasos más abajo.
cada archivo metadata.json solo puede contener una sola casilla. Puede tener múltiples versiones, y cada versión puede tener múltiples proveedores (virtualbox, vmware, libvirt). Si necesita tener más de un cuadro (por ejemplo, "fedora" y "ubuntu"), necesita dos archivos de metadatos diferentes.
Vagrant espera que el archivo metadata.json tenga un tipo de "application / json" (como mencionó Nicholas Hinds anteriormente. Si su servidor web no lo devuelve (o devuelve "text / plain"), vagrant asumirá que es un archivo de caja real , e intenta analizarlo (y falla miserablemente).
El Atlas de Hashicorp (lo que solía ser Vagrant Cloud) es la excepción a esto, ya que las redirecciones lo llevan al contenido que se sirve como "texto / html". Mi mejor suposición para esto es que tiene algo que ver con los redireccionamientos (más sobre esto a continuación).
El archivo de cuadro no necesita estar en el mismo lugar que el archivo de metadatos. Puede tener su archivo de metadatos en un servidor web local y el cuadro en Amazon S3, no hay problema con eso.
Entonces, hasta donde pude, encontré que la manera más fácil de hacer que esto funcione en un servidor web y aún tener una funcionalidad bastante normal es hacer esto:
En su servidor web, cree una estructura de archivos y directorios similar a esta:
(este diseño significa que su "metadata.json" para box1 tendrá que tener sus URL apuntando a algo como " http: // yourhost / boxes / yourname / box1 / box1- $ version1- $ provider.box")
En su .htaccess, asegúrese de que "metadata.json" esté configurado para el índice del Directorio. El resto es opcional, para caché negativa y ocultar el contenido real:
En su entorno, exporte el VAGRANT_SERVER_URL apuntando a su webhost. Tenga en cuenta que no hay barra diagonal final!
Con esto en su lugar (y todos los archivos con el contenido correcto), puede ir y agregar su caja directamente:
Dado que "metadata.json" es el archivo de índice para el directorio box1, debe redirigir el contenido directamente a él, vagabundo lo recogerá, interpretará los metadatos y descargará el cuadro apropiado.
fuente
Después de leer su pregunta nuevamente, parece que está tratando de hacer algo un poco diferente a lo que soy yo, pero creo que nuestro objetivo final es el mismo.
No quiero utilizar el servicio Vagrant Cloud para alojar mis cajas base, pero quiero poder distribuir un entorno de desarrollo a mi equipo de desarrollo y utilizar las características de
metadata.json
archivo para mantener un sistema de versiones para el entorno de desarrollo, que estará disponible para mi equipo de desarrollo simplemente usando las instalaciones integradas en vagabundo.La documentación vagabunda es realmente escasa en esta área al momento de escribir este artículo (8/5/2014), presumiblemente porque es una característica relativamente nueva, pero estoy seguro de que el hecho de que VagrantCloud tiene un nivel pago también tiene algo que ver con eso. .
Para descubrir cómo utilizar el
metadata.json
archivo para la versión y distribuir cuadros, eché un vistazo a algunas de las máquinas virtuales disponibles en VagrantCloud. Después de revisarlos y leer algunos de los códigos vagabundos, se hizo bastante fácil descubrir cómo lograr mi objetivo.Cree un
metadata.json
archivo para describir su cuadro base, el mío se parece a esto:Una vez que creé mi
metadata.json
archivo, lo cargué en un servidor local que se ejecuta en nuestra red interna (vagrant.domain.local/metadata.json
). Una vez que hice eso, todo lo que quedaba era probarlo con vagabundo:Voila, una caja privada remotamente alojada, compartida y versionada que no requiere el uso de Vagrant Cloud.
A medida que crea nuevas versiones de su caja, la empaqueta y edita el
metadata.json
archivo. Por lo que puedo decir, puede usar cualquier esquema de versiones que desee, ya sea versiones semánticas (1.0.0, 1.0.1, etc.) o simplemente números enteros simples para las versiones (1, 2, 3, etc.). Cuando los usuarios de su cajavagrant up
vagabundos comprueban automáticamente su archivo metadata.json para una nueva versión, y les pedirávagrant box update
que actualicen la caja.También puede omitir los bits
vagrant box add <metadata.json url>
yvagrant init
definiendo un Vagrantfile base con el nombre del cuadro y la url del cuadro, así:Podría distribuir un Vagrantfile con esos contenidos, y todos los usuarios simplemente podrían hacerlo
vagrant up
. Sin embargo, no estoy seguro de cómo funciona cuando se actualizan las versiones.fuente
~/.vagrant.d/boxes/<your box name>
. Dentro de esa carpeta está elmetadata_url
archivo al que se hace referencia alrededor de la documentación, que contiene la URL de su archivo JSON que define sus versiones. Vagrant maneja todo eso automáticamente, por lo que todo lo que tiene que hacer esvagrant box add <your metadata.json url>
, entoncesvagrant init <boxname> && vagrant up
, vagabundo hace el restovagrant box add
es necesario. Si pudiera establecer la URL de ese archivo JSON en el archivo Vagrant, ese es un paso menos para que un nuevo desarrollador simplemente se una al equipo para comenzar a funcionar. Funciona para cajas, pero no puedo entender por qué no funciona para el archivo JSON.config.vm.box
Yconfig.vm.box_url
dóndebox
está el nombre de su casilla ybox_url
la URL de su archivo json.Vagrant requiere que las URL de metadatos de la caja se sirvan con el
application/json
tipo de contenido. El error que está recibiendo indica que el vagabundo ha interpretado su URL como un cuadro normal.Asegúrese de que su servidor HTTP esté configurando el
Content-Type
encabezado adecuadamente. La mayoría de los servidores HTTP establecerán automáticamente elContent-Type
encabezadoapplication/json
si su archivo tiene la extensión.json
fuente
Creo que tienes sus directivas mezcladas ...
Lo siguiente está tomado del sitio web vagabundo:
ARCHIVO DE CAJA
El archivo de caja real es la porción requerida para Vagrant. Se recomienda que siempre use un archivo de metadatos junto con un archivo de cuadro, pero los archivos de cuadro directo son compatibles por motivos heredados en Vagrant.
Box files are compressed using tar, tar.gz, or zip. The contents of the archive can be anything, and is specific to each provider.
El núcleo vagabundo solo desempaqueta las cajas para su uso posterior.Within the archive, Vagrant does expect a single file: "metadata.json".
Este es un archivo JSON que no tiene ninguna relación con el componente de "metadatos de cuadro" anterior.This file must contain at least the "provider" key with the provider the box is for
. Por ejemplo, si su caja fuera para VirtualBox, el metadata.json se vería así:If there is no metadata.json file or the file does not contain valid JSON with at least a "provider" key, then Vagrant will error when adding the box.
Entonces, creo que su formato de archivo de caja probablemente sea incorrecto. O no está comprimido con el formato recomendado, o no ha incluido un archivo metadata.json dentro del archivo
fuente
Puedes probar https://github.com/sparkoo/boxitory . Es simple un servidor jar. Lo señala al directorio donde tiene sus cuadros de vagabundo y crea una interfaz http compatible para vagabundo. Luego simplemente lo señala desde su archivo vagabundo y listo. No tiene que manejar manualmente los archivos json que describen sus cajas, agregando nuevas versiones, proveedores, etc. Todo se hace de forma gratuita. Simplemente agregue un nuevo archivo box y Boxitory lo devuelve instantáneamente cuando se lo solicite.
fuente