

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 6: Creación de archivos
<a name="cookbooks-101-basics-files"></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 existentes. 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).

Una vez que ha creado los directorios, a menudo necesita llenarlos con archivos de configuración, archivos de datos, etc. En este tema se muestran dos formas de instalar archivos en una instancia.

**Topics**
+ [Instalación de un archivo a partir de un libro de recetas](#cookbooks-101-basics-files-cookbook_file)
+ [Creación de un archivo a partir de una plantilla](#cookbooks-101-basics-files-template)

## Instalación de un archivo a partir de un libro de recetas
<a name="cookbooks-101-basics-files-cookbook_file"></a>

La forma más sencilla de instalar un archivo en una instancia es utilizar un recurso [https://docs.chef.io/chef/resources.html#cookbook-file](https://docs.chef.io/chef/resources.html#cookbook-file) que copie un archivo del libro de recetas en una ubicación especificada de la instancia para los sistemas Linux y Windows. Este ejemplo amplía la receta de [Ejemplo 3: Creación de directorios](cookbooks-101-basics-directories.md) para añadir un archivo de datos a `/srv/www/shared` después de crear el directorio. Como referencia, aquí tenemos la receta original.

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

**Para configurar el libro de recetas**

1. Dentro del directorio `opsworks_cookbooks`, cree un directorio llamado `createfile` y ábralo.

1. Añada un archivo `metadata.rb` a `createfile` con el contenido siguiente.

   ```
   name "createfile"
   version "0.1.0"
   ```

1. Inicialice y configure Test Kitchen, tal y como se describe en [Ejemplo 1: Instalación de paquetes](cookbooks-101-basics-packages.md), y elimine CentOS de la lista `platforms`.

1. Añada un subdirectorio `recipes` a `createfile`.

El archivo que va a instalar contiene los datos JSON siguientes.

```
{
  "my_name" : "myname",
  "your_name" : "yourname",
  "a_number" : 42,
  "a_boolean" : true
}
```

**Para configurar el archivo de datos**

1. Añada un subdirectorio `files` a `createfile` y un subdirectorio `default` a `files`. Todos los archivos que instale con `cookbook_file` deben estar en un subdirectorio de `files`; por ejemplo, `files/default` en este ejemplo. 
**nota**  
Si quiere especificar archivos diferentes para sistemas diferentes, puede colocar cada archivo específico del sistema en una subcarpeta con el nombre del sistema, como, por ejemplo, `files/ubuntu`. El recurso `cookbook_file` copia el archivo específico del sistema adecuado, si existe; de no ser así, utiliza el archivo `default`. Para obtener más información, consulte [cookbook\$1file](https://docs.chef.io/chef/resources.html#cookbook-file).

1. Cree un archivo llamado `example_data.json` con el JSON del ejemplo anterior y añádalo a `files/default`.

La receta siguiente copia `example_data.json` en una ubicación especificada. 

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

cookbook_file "/srv/www/shared/example_data.json" do
  source "example_data.json"
  mode 0644
  action :create_if_missing
end
```

Cuando el recurso del directorio crea `/srv/www/shared`, el recurso `cookbook_file` copia `example_data.json` en dicho directorio y también establece el usuario, el grupo y el modo del archivo. 

**nota**  
El recurso `cookbook_file` introduce una nueva acción: `create_if_missing`. También puede utilizar una acción `create`, pero sobrescribe un archivo ya existente. Si no quiere sobrescribir nada, utilice `create_if_missing`, que instala `example_data.json` solo si todavía no existe.

**Para ejecutar la receta**

1. Ejecute `kitchen destroy` para comenzar por una instancia nueva.

1. Cree un archivo `default.rb` que contenga la receta anterior y guárdelo en `recipes`.

1. Ejecute `kitchen converge` y, a continuación, inicie sesión en la instancia para comprobar que `/srv/www/shared` contiene `example_data.json`.

## Creación de un archivo a partir de una plantilla
<a name="cookbooks-101-basics-files-template"></a>

El recurso `cookbook_file` es útil para algunos fines, pero solo instala el archivo que tenga en el libro de recetas. Un recurso [https://docs.chef.io/chef/resources.html#template](https://docs.chef.io/chef/resources.html#template) aporta mayor flexibilidad de instalación de un archivo en una instancia de Windows o Linux, ya que lo crea dinámicamente a partir de una plantilla. Después puede determinar los detalles del contenido del archivo en tiempo de ejecución y modificarlos según sea necesario. Por ejemplo, puede que quiera que un archivo de configuración tenga una determinada configuración al iniciar la instancia y más tarde, cuando añada más instancias a la pila, quiera modificar la configuración.

En este ejemplo se modifica el libro de recetas `createfile` para utilizar un recurso `template` para instalar una versión ligeramente modificada de `example_data.json`.

Este es el aspecto que tendrá el archivo instalado.

```
{
  "my_name" : "myname",
  "your_name" : "yourname",
  "a_number" : 42,
  "a_boolean" : true,
  "a_string" : "some string",
  "platform" : "ubuntu"
}
```

Normalmente, los recursos de la plantilla se usan junto con los archivos de atributos, por lo que el ejemplo utiliza uno para definir los valores siguientes.

```
default['createfile']['my_name'] = 'myname'
default['createfile']['your_name'] = 'yourname'
default['createfile']['install_file'] = true
```

**Para configurar el libro de recetas**

1. Elimine el directorio `createfile` del libro de recetas `files` y su contenido.

1. Añada un subdirectorio `attributes` a `createfile` y añada un archivo `default.rb` a `attributes` que contenga las definiciones de atributo anteriores.

Una plantilla es un archivo `.erb` que es básicamente una copia del archivo final, con parte del contenido representado por comodines. Cuando el recurso `template` crea el archivo, copia el contenido de la plantilla en el archivo especificado y sobrescribe los comodines con los valores que tiene asignados. Aquí está la plantilla para `example_data.json`.

```
{
  "my_name" : "<%= node['createfile']['my_name'] %>",
  "your_name" : "<%= node['createfile']['your_name'] %>",
  "a_number" : 42,
  "a_boolean" : <%= @a_boolean_var %>,
  "a_string" : "<%= @a_string_var %>",
  "platform" : "<%= node['platform'] %>"
}
```

Los valores `<%=...%>` son los comodines.
+ `<%=node[...]%>` representa un valor de atributo de nodo.

  En este ejemplo, el valor "your\$1name" es un comodín que representa uno de los valores de atributo del archivo de atributos del libro de recetas.
+ `<%=@...%>` representa el valor de una variable que está definida en el recurso template, que trataremos en breve.

**Para crear el archivo de plantilla de**

1. Añada un subdirectorio `templates` al libro de cocina `createfile` y un subdirectorio `default` a `templates`.
**nota**  
El directorio `templates` tiene un funcionamiento muy similar al del directorio `files`. Puede poner plantillas específicas de un sistema en un subdirectorio como `ubuntu` que se llama como dicho sistema. El recurso `template` utiliza la plantilla específica del sistema adecuado si existe; de no ser así, utiliza la plantilla `default`.

1. Cree un archivo llamado `example_data.json.erb` y póngalo en el directorio `templates/default`. El nombre de la plantilla es arbitrario, pero normalmente se crea anexando `.erb` al nombre del archivo, incluidas las extensiones. 

La siguiente receta utiliza un recurso `template` para crear `/srv/www/shared/example_data.json`. 

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

template "/srv/www/shared/example_data.json" do
  source "example_data.json.erb"
  mode 0644
  variables(
    :a_boolean_var => true,
    :a_string_var => "some string"
  )
  only_if {node['createfile']['install_file']}
end
```

El recurso `template` crea `example_data.json` a partir de una plantilla y lo instala en `/srv/www/shared`.
+ El nombre de la plantilla, `/srv/www/shared/example_data.json`, especifica el nombre y la ruta del archivo instalado.
+ El atributo `source` especifica la plantilla utilizada para crear el archivo.
+ El atributo `mode` especifica el modo de archivo instalado.
+ El recurso define dos variables, `a_boolean_var` y `a_string_var`. 

  Cuando el recurso crea `example_data.json`, sobrescribe los comodines de las variables de la plantilla con los valores correspondientes del recurso. 
+ El atributo `only_if` de *protección* indica al recurso que cree el archivo solo si `['createfile']['install_file']` está establecido en `true`.

**Para ejecutar la receta**

1. Ejecute `kitchen destroy` para comenzar por una instancia nueva.

1. Sustituya el código de `recipes/default.rb` por el ejemplo anterior.

1. Ejecute `kitchen converge` y, a continuación, inicie sesión en la instancia para comprobar que el archivo se encuentre en `/srv/www/shared` y su contenido sea correcto.

Cuando haya terminado, ejecute `kitchen destroy` para cerrar la instancia. En la siguiente sección se utiliza un libro de recetas nuevo.