

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.

# Uso de un libro de recetas externo en una instancia de Linux: Berkshelf
<a name="cookbooks-101-opsworks-berkshelf"></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).

**nota**  
Berkshelf solo está disponible para pilas de Linux en Chef 11.10.

Antes de empezar a implementar un libro de recetas, consulte [Chef Community Cookbooks](https://github.com/opscode-cookbooks), que contiene los libros de recetas que han creado miembros de la comunidad de Chef con una amplia variedad de fines. Muchos de estos libros de cocina se pueden usar con OpsWorks Stacks sin necesidad de modificarlos, así que quizá puedas aprovecharlos para algunas de tus tareas en lugar de implementar todo el código tú mismo.

Para utilizar un libro de recetas externo en una instancia, necesita una forma de instalarlo y administrar cualquier dependencia. El enfoque preferido es implementar un libro de recetas compatible con un administrador de dependencias llamado Berkshelf. Berkshelf funciona en instancias de Amazon, incluidas EC2 las instancias de OpsWorks Stacks, pero también está diseñado para funcionar con Test Kitchen y Vagrant. Sin embargo, el uso en Vagrant es un poco diferente al de OpsWorks Stacks, por lo que en este tema se incluyen ejemplos para ambas plataformas. Para obtener más información sobre cómo utilizar Berkshelf, consulte [Berkshelf](http://berkshelf.com/).

**Topics**
+ [Uso de Berkshelf en Test Kitchen y Vagrant](#cookbooks-101-opsworks-berkshelf-vagrant)
+ [Uso de Berkshelf con Stacks OpsWorks](#opsworks-berkshelf-opsworks)

## Uso de Berkshelf en Test Kitchen y Vagrant
<a name="cookbooks-101-opsworks-berkshelf-vagrant"></a>

 Este ejemplo muestra cómo utilizar Berkshelf para instalar el libro de recetas getting-started de la comunidad y ejecutar la receta, que instala un breve archivo de texto en el directorio de inicio de la instancia.

**Para instalar Berkshelf e inicializar un libro de recetas**

1. En la estación de trabajo, instale la gema Berkshelf tal y como se indica a continuación.

   ```
   gem install berkshelf
   ```

   En función de la estación de trabajo, este comando puede necesitar `sudo`, o puede utilizar un administrador de entornos de Ruby, como [RVM](https://rvm.io/). Para verificar que Berkshelf se ha instalado correctamente, ejecute `berks --version`.

1. El libro de recetas que se utiliza en este tema se llama external\$1cookbook. Puede utilizar Berkshelf para crear un libro de recetas inicializado en lugar del enfoque manual que se ha seguido en temas anteriores. Para ello, abra al directorio `opsworks_cookbooks` y ejecute el siguiente comando.

   ```
   berks cookbook external_cookbook
   ```

   El comando crea el directorio `external_cookbook` y varios subdirectorios estándar de Chef y Test Kitchen, incluidos `recipes` y `test`. El comando también crea versiones predeterminadas de un número de archivos estándar, incluidos los siguientes:
   + `metadata.rb`
   + Archivos de configuración de Vagrant, Test Kitchen y Berkshelf
   + Una receta `default.rb` vacía en el directorio `recipes`
**nota**  
No necesita ejecutar `kitchen init`; el comando `berks cookbook` se encarga de estas tareas.

1. Ejecute `kitchen converge`. El libro de recetas que acaba de crear no tiene nada de interesante en este momento, pero coincide.

**nota**  
También puede utilizar `berks init` para inicializar un libro de recetas existente y utilizar Berkshelf.

Si desea utilizar Berkshelf para administrar las dependencias externas de un libro de recetas, el directorio raíz del libro de recetas debe contener `Berksfile`, un archivo de configuración que especifica cómo Berkshelf debería administrar las dependencias. Cuando utilizó `berks cookbook` para crear el libro de recetas `external_cookbook`, se creó un `Berksfile` con el siguiente contenido.

```
source "https://supermarket.chef.io"
metadata
```

Este archivo tiene las siguientes declaraciones:
+ `source`: la dirección URL del origen de un libro de recetas

  Un Berksfile puede contener cualquier número de declaraciones `source`, cada una de las cuales especifica un origen predeterminado de los libros de recetas dependientes. Si no especifica el origen de un libro de recetas de forma explícita, Berkshelf busca en los repositorios predeterminados un libro de recetas con el mismo nombre. El Berksfile predeterminado incluye un único atributo `source` que especifica repositorio de libros de recetas de la comunidad. Ese repositorio contiene el libro de recetas getting-started, por lo que no es necesario modificar la línea.
+ `metadata`: solicita a Berkshelf que incluya las dependencias del libro de recetas definidas en el archivo `metadata.rb` del libro de recetas.

  Tal y como se explica más adelante, puede incluir un atributo `cookbook` en el Berksfile para definir un libro de recetas dependiente.

Hay dos formas de definir la dependencia de un libro de recetas:
+ Incluir una declaración `cookbook` en el Berksfile.

  Este es el enfoque utilizado por Stacks. OpsWorks Por ejemplo, para especificar el libro de recetas getting-started que se utiliza en este ejemplo, incluya `cookbook "getting-started"` en el Berksfile. A continuación, Berkshelf buscará en los repositorios predeterminados un libro de recetas con ese nombre. También puede utilizar `cookbook` para especificar de forma explícita el origen de un libro de recetas, e incluso una determinada versión. Para obtener más información, consulte [Berkshelf](http://berkshelf.com/).
+ Incluir una declaración `metadata` en el Berksfile y definir la dependencia en `metadata.rb`.

  Esta declaración solicita a Berkshelf que incluya las dependencias del libro de recetas definidas en `metadata.rb`. Por ejemplo, para definir una dependencia getting-started, añada una declaración `depends 'getting-started'` al archivo `metadata.rb` del libro de recetas.

En este ejemplo, se utiliza el primer enfoque, para mantener la coherencia con OpsWorks Stacks.

**Para instalar el libro de recetas getting-started**

1. Edite el valor predeterminado de Berksfile para sustituir la declaración `metadata` por una declaración `cookbook` para `getting-started`. El contenido debe ser similar al siguiente.

   ```
   source "https://supermarket.chef.io"
   
   cookbook 'getting-started'
   ```

1. Ejecute `berks install`, que descarga el libro de recetas getting-started del repositorio de libros de recetas de la comunidad en el directorio de Berkshelf de la estación de trabajo, que suele ser `~/.berkshelf`. Por lo general, el nombre de este directorio es *Berkshelf*. Examine el directorio `cookbooks` de Berkshelf. Debería ver el directorio del libro de recetas , con un nombre parecido a `getting-started-0.4.0`getting-started-.

1. Sustituya `external_cookbook::default` en la lista de ejecución `.kitchen.yml` por `getting-started::default`. Este ejemplo no ejecuta las recetas de external\$1cookbook; se trata, básicamente, de una forma de utilizar el libro de recetas getting-started. El archivo `.kitchen.yml` debe ser ahora similar a lo siguiente.

   ```
   ---
   driver:
     name: vagrant
   
   provisioner:
     name: chef_solo
   
   platforms:
     - name: ubuntu-12.04
   
   suites:
     - name: default
       run_list:
         - recipe[getting-started::default]
       attributes:
   ```

1. Ejecute `kitchen converge` y, a continuación, utilice `kitchen login` para iniciar sesión en la instancia. El directorio de inicio de sesión debería contener un archivo llamado `chef-getting-started.txt` con algo parecido a lo siguiente:

   ```
   Welcome to Chef!
   
   This is Chef version 11.12.8.
   Running on ubuntu.
   Version 12.04.
   ```

   Test Kitchen instala los libros de recetas en el directorio `/tmp/kitchen/cookbooks` de la instancia. Si examina el contenido de ese directorio, verá dos libros de recetas: external\$1cookbook y getting-started.

1. Ejecute `kitchen destroy` para apagar la instancia. El siguiente ejemplo usa una instancia de OpsWorks Stacks.

## Uso de Berkshelf con Stacks OpsWorks
<a name="opsworks-berkshelf-opsworks"></a>

OpsWorks Stacks admite opcionalmente las pilas Berkshelf for Chef 11.10. Para utilizar Berkshelf con la pila, debe hacer lo siguiente.
+ Habilite Berkshelf en la pila.

  OpsWorks Luego, Stacks se encarga de los detalles de la instalación de Berkshelf en las instancias de la pila.
+ Añada un Berksfile al directorio raíz del repositorio de libros de recetas.

  El Berksfile debe contener las declaraciones `source` y `cookbook` de todos los libros de recetas dependientes.

Cuando OpsWorks Stacks instala tu repositorio de libros de cocina personalizado en una instancia, usa Berkshelf para instalar los libros de cocina dependientes que se declaran en el Berksfile del repositorio. Para obtener más información, consulte [Uso de Berkshelf](workingcookbook-chef11-10.md#workingcookbook-chef11-10-berkshelf).

En este ejemplo, se muestra cómo usar Berkshelf para instalar el libro de cocina comunitario de introducción en una instancia de Stacks. OpsWorks También instala una versión del libro de recetas personalizado createfile, que crea un archivo en un directorio específico. Para obtener más información sobre cómo funciona createfile, consulte [Instalación de un archivo a partir de un libro de recetas](cookbooks-101-basics-files.md#cookbooks-101-basics-files-cookbook_file).

**nota**  
Si es la primera vez que instalas un libro de cocina personalizado en una pila de OpsWorks Stacks, primero debes seguir el ejemplo. [Ejecución de una receta en una instancia de Linux](cookbooks-101-opsworks-opsworks-instance.md)

Comience por crear una pila tal y como se resume a continuación. Para obtener más información, consulte [Crear una pila nueva](workingstacks-creating.md).

**Creación de una pila**

1. Abra la consola de [OpsWorks Stacks](https://console.aws.amazon.com/opsworks/) y haga clic en **Add Stack (Añadir pila)**.

1. Especifique las siguientes opciones de configuración, acepte los valores predeterminados del resto y, a continuación, haga clic en **Add Stack (Añadir pila)**.
   + **Nombre —** BerksTest
   + **Clave SSH predeterminada**: un par de EC2 claves de Amazon

   Si necesitas crear un par de EC2 claves de Amazon, consulta [Amazon EC2 Key Pairs](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html). Tenga en cuenta que el par de claves debe pertenecer a la misma región de AWS que la instancia. El ejemplo utiliza la región predeterminada Oeste de EE. UU. (Oregón).

1. Haga clic en **Add a layer (Añadir una capa)** y [añada una capa personalizada](workinglayers-custom.md) a la pila con las siguientes opciones de configuración.
   + **Nombre** — BerksTest
   + **Nombre abreviado**: berkstest

   Podría utilizar cualquier tipo de capa en este ejemplo. Sin embargo, el ejemplo no necesita ninguno de los paquetes que instalan el resto de capas, por lo que una capa personalizada es el enfoque más sencillo.

1. [Añada una instancia ininterrumpida](workinginstances-add.md) a la BerksTest capa con los ajustes predeterminados, pero no la inicie todavía.

Con OpsWorks Stacks, los libros de cocina deben estar en un repositorio remoto con una estructura de directorios estándar. Luego, proporcionas la información de descarga a OpsWorks Stacks, que descarga automáticamente el repositorio en cada una de las instancias de la pila al iniciarse. Para simplificar, el repositorio de este ejemplo es un archivo público de Amazon S3, pero OpsWorks Stacks también admite archivos HTTP, repositorios de Git y repositorios de Subversion. Para obtener más información, consulte [Repositorios de libros de recetas](workingcookbook-installingcustom-repo.md).

El contenido entregado a los buckets de Amazon S3 puede contener contenido del cliente. Para obtener más información sobre la eliminación de información confidencial, consulte [¿Cómo puedo vaciar un bucket de S3?](https://docs.aws.amazon.com/AmazonS3/latest/userguide/empty-bucket.html) o [¿Cómo elimino un bucket de S3?](https://docs.aws.amazon.com/AmazonS3/latest/userguide/delete-bucket.html).

**Para crear el repositorio de libros de recetas**

1. En el directorio `opsworks_cookbooks`, cree un directorio llamado `berkstest_cookbooks`. Si lo prefiere, como a continuación lo va a cargar en un repositorio, puede crear este directorio donde crea conveniente.

1. Añada un archivo llamado Berksfile a `berkstest_cookbooks` con el siguiente contenido. 

   ```
   source "https://supermarket.chef.io"
   
   cookbook 'getting-started'
   ```

   Este archivo define la dependencia del libro de recetas getting-started e indica a Berkshelf que lo descargue del sitio de libros de recetas de la comunidad.

1. Añada un directorio `createfile` a `berkstest_cookbooks` que contenga lo siguiente.
   + Un archivo `metadata.rb` con el siguiente contenido.

     ```
     name "createfile"
     version "0.1.0"
     ```
   + Un directorio `files/default` que contenga un archivo `example_data.json` con el siguiente contenido.

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

     El nombre del archivo y el contenido son arbitrarios. La receta se limita a copiar el archivo en la ubicación especificada.
   + Un directorio `recipes` que contenga un archivo `default.rb` con el siguiente código de receta.

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

     Esta receta crea `/srv/www/shared` y copia `example_data.json` en ese directorio del directorio `files` del libro de recetas.

1. Cree un archivo `.zip` de `berkstest_cookbooks`, [cárguelo en un bucket de Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/UG/UploadingObjectsintoAmazonS3.html), [publíquelo](https://docs.aws.amazon.com/AmazonS3/latest/UG/EditingPermissionsonanObject.html) y anote la URL del archivo.

Ahora puede instalar los libros de recetas y ejecutar la receta.

**Para instalar los libros de recetas y ejecutar las recetas**

1. [Edite la pila para habilitar los libros de recetas personalizados](workingcookbook-installingcustom-enable.md) y especifique las siguientes opciones de configuración.
   + **Tipo de repositorio**: **Archivo HTTP**
   + **URL de repositorio**: la URL del archivo del libro de recetas que anotó previamente.
   + **Administrar Berkshelf**: **Sí**

   Las dos primeras configuraciones proporcionan a OpsWorks Stacks la información que necesita para descargar el repositorio de libros de cocina en tus instancias. La última habilita la compatibilidad con Berkshelf, que descarga el libro de recetas getting-started en la instancia. Acepte los valores predeterminados del resto de opciones y haga clic en **Save (Guardar)** para actualizar la configuración de la pila. 

1. Edita la BerksTest capa para [añadir las siguientes recetas al evento del ciclo de vida de configuración de la capa](workingcookbook-assigningcustom.md).
   + `getting-started::default`
   + `createfile::default`

1. [Inicie](workinginstances-starting.md) la instancia. El evento de configuración se produce cuando la instancia termina de arrancar. OpsWorks Luego, Stacks instala el repositorio de libros de cocina, usa Berkshelf para descargar el libro de cocina de introducción y ejecuta la configuración de la capa e implementa recetas, incluidas y. `getting-started::default` `createfile::default`

1. Cuando la instancia esté online, [utilice SSH para iniciar sesión](workinginstances-ssh.md). Debería ver lo siguiente:
   + `/srv/www/shared` debería contener `example_data.json`.
   + `/root` debería contener `chef-getting-started.txt`.

     OpsWorks Stacks ejecuta recipes como usuario root, por lo que, al empezar, se instala el archivo en el directorio y no en el directorio principal. `/root`