

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

# Esempio 7: esecuzione di comandi e script
<a name="cookbooks-101-basics-commands"></a>

**Importante**  
Il AWS OpsWorks Stacks servizio ha raggiunto la fine del ciclo di vita il 26 maggio 2024 ed è stato disattivato sia per i clienti nuovi che per quelli esistenti. Consigliamo vivamente ai clienti di migrare i propri carichi di lavoro verso altre soluzioni il prima possibile. Se hai domande sulla migrazione, contatta il Supporto AWS Team su [AWS re:post](https://repost.aws/) o tramite Premium [AWS Support](https://aws.amazon.com/support).

Le risorse di Chef possono gestire un'ampia gamma di attività su un'istanza, ma talvolta è preferibile usare un comando shell o uno script. Ad esempio, se hai già script che utilizzi per eseguire determinate attività, sarà più semplice continuare a utilizzar questi ultimi, piuttosto che implementare un nuovo codice. Questa sezione illustra come eseguire comandi o script in un'istanza. 

**Topics**
+ [Esecuzione di comandi](#cookbooks-101-basics-commands-script)
+ [Esecuzione di script](#cookbooks-101-basics-commands-execute)

## Esecuzione di comandi
<a name="cookbooks-101-basics-commands-script"></a>

La risorsa [https://docs.chef.io/chef/resources.html#script](https://docs.chef.io/chef/resources.html#script) esegue uno o più comandi. Supporta gli interpreti di comandi csh, bash, Perl, Python e Ruby, quindi può essere utilizzato sia su sistemi Linux che Windows, purché vi sia installato l'opportuno interprete. Questo argomento illustra come eseguire un semplice comando bash su un'istanza Linux. Chef supporta anche le risorse [powershell\$1script](https://docs.chef.io/chef/resources.html#powershell-script) e [batch](https://docs.chef.io/chef/resources.html#batch) per l'esecuzione di script su Windows. Per ulteriori informazioni, consulta [Esecuzione di uno PowerShell script di Windows](cookbooks-101-opsworks-opsworks-powershell.md). 

**Per iniziare**

1. Nella directory `opsworks_cookbooks`, creare una directory denominata `script` e aprirla.

1. Aggiungere un file `metadata.rb` a `script` con il contenuto seguente.

   ```
   name "script"
   version "0.1.0"
   ```

1. Inizializzare e configurare Test Kitchen come descritto in [Esempio 1: installazione di pacchetti](cookbooks-101-basics-packages.md), quindi rimuovere CentOS dall'elenco `platforms`.

1. In `script`, creare una directory denominata `recipes`.

È possibile eseguire comandi utilizzando la stessa risorsa `script`, ma Chef supporta anche un set di versioni della risorsa specifico per interprete di comandi; tali versioni vengono denominate a seconda dell'interprete. La seguente ricetta utilizza una risorsa [https://docs.chef.io/chef/resources.html#bash](https://docs.chef.io/chef/resources.html#bash) per eseguire un semplice script bash.

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

La risorsa `bash` è configurata come segue.
+ Utilizza l'operazione di default, `run`, che esegue i comandi nel blocco `code`.

  Questo esempio contiene un solo comando, `touch somefile`ma un blocco `code` può contenere più comandi.
+ L'attributo `user` specifica l'utente che esegue il comando.
+ L'attributo `cwd` specifica la directory di lavoro.

  Per questo esempio, `touch` crea un file nella directory `/tmp`.
+ L'attributo di protezione `not_if` indica alla risorsa di non eseguire alcuna operazione se il file è già esistente.

**Per eseguire la ricetta**

1. Creare un file `default.rb` che contiene il codice di esempio precedente e salvarlo in `recipes`.

1. Eseguire `kitchen converge`, quindi accedere all'istanza per verificare che il file sia presente in `/tmp`.

## Esecuzione di script
<a name="cookbooks-101-basics-commands-execute"></a>

La risorsa `script` è pratica, soprattutto se hai bisogno di eseguire solo uno o due comandi; spesso è però preferibile archiviare lo script in un file ed eseguire il file stesso. La risorsa [https://docs.chef.io/chef/resources.html#execute](https://docs.chef.io/chef/resources.html#execute) esegue uno specifico file eseguibile, inclusi i file di script, in Linux o Windows. Questo argomento modifica il libro di ricette `script` dell'esempio precedente per usare `execute` al fine di eseguire un semplice script shell. È possibile estendere facilmente l'esempio a script più complessi o ad altri tipi di file eseguibile.

**Per configurare il file script**

1. Aggiungere la sottodirectory `files` a `script` e la sottodirectory `default` a `files`.

1. Creare un file denominato `touchfile` che contenga quando segue e aggiungerlo a `files/default`. In questo esempio viene utilizzata una comune riga di interpretazione Bash, ma puoi sostituire l'interprete con quello più adatto al tuo ambiente shell, se necessario.

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

   Il file script può contenere un numero qualsiasi di comandi. Per comodità, questo script di esempio include un solo comando `touch`.

La seguente ricetta esegue lo script. 

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

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

La risorsa `cookbook_file` copia il file script su `/tmp` e imposta la modalità per rendere il file eseguibile. La risorsa `execute` esegue quindi il file come indicato di seguito:
+ L'attributo `user` specifica l'utente del comando (`root` in questo esempio).
+ L'attributo `cwd` specifica la directory di lavoro (`/tmp` in questo esempio).
+ L'attributo `command` specifica lo script da eseguire (`touchfile` in questo esempio), che si trova nella directory di lavoro.

**Per eseguire la ricetta**

1. Sostituire il codice in `recipes/default.rb` con l'esempio precedente.

1. Eseguire `kitchen converge`, quindi effettuare l'accesso all'istanza per verificare che `/tmp` ora contenga il file script, con la modalità impostata su 0755, e `somefile`.

Al termine dell'operazione, eseguire `kitchen destroy` per chiudere l'istanza. La sezione successiva utilizza un nuovo libro di ricette.