

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 3: creazione di directory
<a name="cookbooks-101-basics-directories"></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).

Quando installi un pacchetto su un'istanza, spesso devi creare alcuni file di configurazione e inserirli nella directory appropriata. Tuttavia, tali directory potrebbero non esistere ancora. È inoltre possibile che sia necessario creare directory per dati, file di log e così via. Ad esempio, per prima cosa avvii il sistema Ubuntu che usi per la maggior parte degli esempi, la `/srv` directory non ha sottodirectory. Se stai installando un server delle applicazioni, è probabile che tu voglia una directory `/srv/www/` e forse alcune sottodirectory per file di dati, log e così via. La ricetta seguente crea `/srv/www/` su un'istanza.

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

Una [risorsa `directory`](https://docs.chef.io/chef/resources.html#directory) serve a creare e configurare directory su sistemi Linux e Windows, anche se alcuni attributi vengono utilizzati in modo diverso. Il nome della risorsa è il valore di default per l'attributo `path` della risorsa, perciò l'esempio crea `/srv/www/` e ne specifica le proprietà `mode`, `owner` e `group`.

**Per eseguire la ricetta**

1. Creare una directory in `opsworks_cookbooks` denominata `createdir` e aprirla.

1. Inizializzare e configurare Test Kitchen come descritto in [Esempio 1: installazione di pacchetti](cookbooks-101-basics-packages.md), quindi aggiungere una directory `recipes` all'interno di `createdir`.

1.  Aggiungere un file `default.rb` con il codice della ricetta alla sottodirectory `recipes` del libro di ricette. 

1. Eseguire `kitchen converge` per eseguire la ricetta.

1. Eseguire `kitchen login`, individuare `/srv` e verificare che includa una sottodirectory `www`.

1. Eseguire `exit` per tornare alla workstation, ma lasciare l'istanza in esecuzione.

**Nota**  
Per creare una directory relativa alla directory principale dell'istanza, utilizzare `#{ENV['HOME']}` per rappresentare la directory principale. Ad esempio, quanto segue crea la directory `~/shared`.  

```
directory "#{ENV['HOME']}/shared" do
  ...
end
```

Supponiamo di voler creare una directory nidificata più profondamente, ad esempio `/srv/www/shared`. È possibile modificare la ricetta precedente come segue.

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

**Per eseguire la ricetta**

1.  Sostituire il codice in `default.rb` con la ricetta precedente. 

1. Eseguire `kitchen converge` nella directory `createdir`.

1. Per verificare che la directory sia stata effettivamente creata, eseguire `kitchen login`, individuare `/srv/www` e verificare che contenga una sottodirectory `shared`. 

1. Eseguire `kitchen destroy` per arrestare l'istanza.

Noterai che il comando `kitchen converge` è stato eseguito molto più velocemente. Questo perché l'istanza è già in esecuzione, quindi non è necessario avviare l'istanza, installare Chef e così via. Test Kitchen si limita a copiare il libro di ricette aggiornato nell'istanza e avvia un'esecuzione Chef.

Ora esegui nuovamente `kitchen converge`, che esegue la ricetta su una nuova istanza. Verrà visualizzato un risultato analogo al seguente.

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

Che cos'è successo? Il problema è che, per impostazione predefinita, una risorsa `directory` può creare una sola directory alla volta, non una serie di directory. La ricetta ha funzionato in precedenza perché la prima ricetta eseguita sull'istanza aveva già creato `/srv/www`, perciò con la creazione di `/srv/www/shared` è stata creata una sola sottodirectory.

**Nota**  
Quando esegui `kitchen converge`, verifica se stai eseguendo le ricette su un'istanza nuova o esistente, perché potresti ottenere risultati differenti.

Per creare una serie di sottodirectory, aggiungi un attributo `recursive` a `directory` e impostalo su `true`. La ricetta seguente crea `/srv/www/shared` direttamente su un'istanza pulita.

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