

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 7: Ejecución de comandos o scripts
<a name="cookbooks-101-basics-commands"></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).

Los recursos de Chef pueden gestionar una amplia variedad de tareas en una instancia, aunque a veces es preferible utilizar un comando de shell o un script. Por ejemplo, es posible que ya disponga de scripts que utilice para realizar determinadas tareas y es más fácil continuar usándolos en vez de implementar código de nuevo. En esta sección se muestra cómo ejecutar comandos o scripts en una instancia. 

**Topics**
+ [Ejecución de comandos](#cookbooks-101-basics-commands-script)
+ [Ejecución de scripts](#cookbooks-101-basics-commands-execute)

## Ejecución de comandos
<a name="cookbooks-101-basics-commands-script"></a>

El recurso [https://docs.chef.io/chef/resources.html#script](https://docs.chef.io/chef/resources.html#script) ejecuta uno o varios comandos. Admite los intérpretes de comandos csh, bash, Perl, Python y Ruby, por lo que puede utilizarse en sistemas Linux o Windows siempre y cuando tenga los intérpretes adecuados instalados. En este tema se muestra cómo ejecutar un comando bash sencillo en una instancia de Linux. Chef también admite recursos [powershell\$1script](https://docs.chef.io/chef/resources.html#powershell-script) y [batch](https://docs.chef.io/chef/resources.html#batch) para ejecutar scripts en Windows. Para obtener más información, consulte [Ejecución de un PowerShell script de Windows](cookbooks-101-opsworks-opsworks-powershell.md). 

**Primeros pasos**

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

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

   ```
   name "script"
   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. Dentro de `script`, cree un directorio llamado `recipes`.

Puede ejecutar comandos mediante el recurso `script`, pero Chef también admite un conjunto de versiones específicas de intérpretes de comandos del recurso que se llaman según el intérprete. En la siguiente receta se utiliza un recurso [https://docs.chef.io/chef/resources.html#bash](https://docs.chef.io/chef/resources.html#bash) para ejecutar un script bash sencillo.

```
bash "install_something" do
  user "root"
  cwd "/tmp"
  code <<-EOH
    touch somefile
  EOH
  not_if do
    File.exists?("/tmp/somefile")
  end
end
```

El recurso `bash` está configurado como se indica a continuación.
+ Utiliza la acción predeterminada `run`, que ejecuta los comandos en el bloque `code`.

  Este ejemplo tiene un comando, `touch somefile`, pero un bloque `code` puede llegar a contener varios comandos.
+ El atributo `user` especifica el usuario que ejecuta el comando.
+ El atributo `cwd` especifica el directorio de trabajo.

  En este ejemplo, `touch` crea un archivo en el directorio `/tmp`.
+ El atributo de protección `not_if` indica al recurso que no ejecute ninguna acción si el archivo ya existe.

**Para ejecutar la receta**

1. Cree un archivo `default.rb` que contenga el código de ejemplo anterior y guárdelo en `recipes`.

1. Ejecute `kitchen converge` y, a continuación, inicie sesión en la instancia para comprobar que el archivo se encuentre en `/tmp`.

## Ejecución de scripts
<a name="cookbooks-101-basics-commands-execute"></a>

El recurso `script` es cómodo, especialmente si solo tiene que ejecutar uno o dos comandos, pero a menudo es preferible almacenar el script en un archivo y ejecutar el archivo. El recurso [https://docs.chef.io/chef/resources.html#execute](https://docs.chef.io/chef/resources.html#execute) ejecuta un script ejecutable especificado, incluidos archivos de script, en Linux o Windows. En este tema se modifica el libro de recetas `script` del ejemplo anterior a fin de que utilice `execute` para ejecutar un script de shell sencillo. Es fácil ampliar el ejemplo a scripts más complejos u otros tipos de archivos ejecutables.

**Para configurar el archivo de script**

1. Añada un subdirectorio `files` a `script` y un subdirectorio `default` a `files`.

1. Cree un archivo llamado `touchfile` que contenga lo siguiente y añádalo a `files/default`. En este ejemplo se utiliza una línea de intérprete Bash habitual, pero, si es necesario, puede sustituir el intérprete que trabaja para su entorno de shell.

   ```
   #!/usr/bin/env bash
   touch somefile
   ```

   El archivo de script puede contener cualquier número de comandos. Para mayor comodidad, este script de ejemplo solo tiene un único comando `touch`.

La receta siguiente ejecuta el script. 

```
cookbook_file "/tmp/touchfile" do
  source "touchfile"
  mode 0755
end

execute "touchfile" do
  user "root"
  cwd "/tmp"
  command "./touchfile"
end
```

El recurso `cookbook_file` copia el archivo de script en `/tmp` y establece el modo para que el archivo sea ejecutable. A continuación, el recurso `execute` ejecuta el archivo de la siguiente manera:
+ El atributo `user` especifica el usuario del comando (`root` en este ejemplo).
+ El atributo `cwd` especifica el directorio de trabajo (`/tmp` en este ejemplo).
+ El atributo `command` especifica el script que se va a ejecutar (`touchfile` en este ejemplo), que se encuentra en el directorio de trabajo.

**Para ejecutar la receta**

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 verificar que `/tmp` ahora contenga archivo de script con el modo establecido en 0755 y `somefile`.

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