

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
<a name="cookbooks-101-basics-directories"></a>

**importante**  
El AWS OpsWorks Stacks servicio llegó al final de su vida útil el 26 de mayo de 2024 y se ha desactivado tanto para los clientes nuevos como para los actuales. Recomendamos encarecidamente a los clientes que migren sus cargas de trabajo a otras soluciones lo antes posible. Si tienes preguntas sobre la migración, ponte en contacto con el AWS Support equipo en [AWS Re:post](https://repost.aws/) o a través de Premium [AWS Support](https://aws.amazon.com/support).

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`](https://docs.chef.io/chef/resources.html#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.

1. Inicialice y configure Test Kitchen, tal y como se describe en [Ejemplo 1: Instalación de paquetes](cookbooks-101-basics-packages.md), y añada un directorio `recipes` dentro de `createdir`.

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

1. Ejecute `kitchen converge` para ejecutar la receta.

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

1. 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. 

1. Ejecute `kitchen converge` desde el directorio `createdir`.

1. 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`. 

1. 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
```