Ejemplo 3: Creación de directorios - AWS OpsWorks

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Ejemplo 3: Creación de directorios

importante

AWS OpsWorks Stacks ya no acepta nuevos clientes. Los clientes actuales podrán usar la OpsWorks consola, la API, la CLI y CloudFormation los recursos con normalidad hasta el 26 de mayo de 2024, momento en el que dejarán de utilizarse. A fin de prepararse para esta transición, le recomendamos que pase sus pilas a AWS Systems Manager lo antes posible. Para obtener más información, consulte AWS OpsWorks Stacks Preguntas frecuentes sobre el final de la vida útil y Migración de sus AWS OpsWorks Stacks aplicaciones a AWS Systems Manager Application Manager.

Cuando instala un paquete en una instancia, a menudo debe crear algunos archivos de configuración y ponerlos en los directorios pertinentes. Sin embargo, puede darse el caso de que dichos directorios no existan todavía. O que también deba crear directorios de datos, de archivos de registro, etc. Por ejemplo, primero arranca el sistema Ubuntu que utiliza para la mayoría de los ejemplos y ve que el directorio /srv no tiene subdirectorios. Si instala un servidor de aplicaciones, probablemente le interesará tener un directorio /srv/www/ y quizá algunos subdirectorios para archivos de datos, registros, etc. La siguiente receta crea /srv/www/ en una instancia.

directory "/srv/www/" do mode 0755 owner 'root' group 'root' action :create end

Utilice un recurso directory para crear y configurar directorios en los sistemas Linux y Windows aunque algunos atributos se utilicen de forma distinta. El nombre del recurso es el valor predeterminado del atributo path del recurso, por lo que el ejemplo crea /srv/www/ y especifica sus propiedades mode, owner y group.

Para ejecutar la receta
  1. Cree un directorio dentro de opsworks_cookbooks llamado createdir y ábralo.

  2. Inicialice y configure Test Kitchen, tal y como se describe en Ejemplo 1: Instalación de paquetes, y añada un directorio recipes dentro de createdir.

  3. Añada un archivo default.rb con el código de la receta al subdirectorio recipes del libro de recetas.

  4. Ejecute kitchen converge para ejecutar la receta.

  5. Ejecute kitchen login, diríjase a /srv y verifique que contenga un subdirectorio www.

  6. Ejecute exit para volver a la estación de trabajo, pero deje la instancia en ejecución.

nota

Para crear un directorio en relación con el directorio principal de la instancia, utilice #{ENV['HOME']} para representar el directorio principal. Por ejemplo, en el ejemplo siguiente se crea el directorio ~/shared.

directory "#{ENV['HOME']}/shared" do ... end

Supongamos que desee crear un directorio que esté más profundamente anidado, como /srv/www/shared. Puede modificar la receta anterior tal y como se indica a continuación.

directory "/srv/www/shared" do mode 0755 owner 'root' group 'root' action :create end
Para ejecutar la receta
  1. Sustituya el código de default.rb por la receta anterior.

  2. Ejecute kitchen converge desde el directorio createdir.

  3. Para verificar que el directorio se haya creado realmente, ejecute kitchen login, diríjase a /srv/www y verifique que contenga un subdirectorio denominado shared.

  4. Ejecute kitchen destroy para cerrar la instancia.

Notará que el comando kitchen converge se ha ejecutado mucho más deprisa. Esto se debe a que la instancia ya se está ejecutando, por lo que no es necesario arrancarla, instalar Chef, etc. Test Kitchen se limita a copiar en la instancia el libro de recetas actualizado y comienza una ejecución de Chef.

Ahora vuelva a ejecutar kitchen converge, que ejecuta la receta en una nueva instancia. A continuación podrá ver el siguiente resultado.

Chef Client failed. 0 resources updated in 1.908125788 seconds [2014-06-20T20:54:26+00:00] ERROR: directory[/srv/www/shared] (createdir::default line 1) had an error: Chef::Exceptions::EnclosingDirectoryDoesNotExist: Parent directory /srv/www does not exist, cannot create /srv/www/shared [2014-06-20T20:54:26+00:00] FATAL: Chef::Exceptions::ChildConvergeError: Chef run process exited unsuccessfully (exit code 1) >>>>>> Converge failed on instance <default-ubuntu-1204>. >>>>>> Please see .kitchen/logs/default-ubuntu-1204.log for more details >>>>>> ------Exception------- >>>>>> Class: Kitchen::ActionFailed >>>>>> Message: SSH exited (1) for command: [sudo -E chef-solo --config /tmp/kitchen/solo.rb --json-attributes /tmp/kitchen/dna.json --log_level info] >>>>>> ----------------------

¿Qué ha pasado? El problema es que, de forma predeterminada, un recurso directory solo puede crear un único directorio a la vez; no puede crear una cadena de directorios. La receta ha funcionado antes porque la primera receta que ejecutó en la instancia ya había creado /srv/www, por lo que la creación de /srv/www/shared solo creó un único subdirectorio.

nota

Cuando ejecute kitchen converge, asegúrese de dónde ejecuta las recetas, ya sea una instancia nueva o una ya existente. Es posible que los resultados obtenidos sean diferentes.

Para crear una cadena de subdirectorios, añada un atributo recursive a directory y establézcalo en true. La receta siguiente crea /srv/www/shared directamente en una instancia limpia.

directory "/srv/www/shared" do mode 0755 owner 'root' group 'root' recursive true action :create end