

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 6: creazione di file
<a name="cookbooks-101-basics-files"></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).

Dopo aver creato le directory, spesso è necessario aggiungervi file di configurazione, file di dati e così via. Questo argomento mostra due modi per installare i file su un'istanza.

**Topics**
+ [Installazione di un file da un libro di ricette](#cookbooks-101-basics-files-cookbook_file)
+ [Creazione di un file da un modello](#cookbooks-101-basics-files-template)

## Installazione di un file da un libro di ricette
<a name="cookbooks-101-basics-files-cookbook_file"></a>

Il modo più semplice di installare un file su un'istanza è utilizzando una risorsa [https://docs.chef.io/chef/resources.html#cookbook-file](https://docs.chef.io/chef/resources.html#cookbook-file), che copia un file dal libro di ricette a un percorso specificato sull'istanza, per sistemi sia Linux che Windows. Questo esempio estende la ricetta da [Esempio 3: creazione di directory](cookbooks-101-basics-directories.md) per aggiungere un file di dati `/srv/www/shared` dopo la creazione della directory. Ecco la ricetta originale come riferimento.

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

**Per configurare il libro di ricette**

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

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

   ```
   name "createfile"
   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. Aggiungere la sottodirectory `recipes` a `createfile`.

Il file da installare contiene i seguenti dati JSON.

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

**Per configurare il file di dati**

1. Aggiungere la sottodirectory `files` a `createfile` e la sottodirectory `default` a `files`. Qualsiasi file installato con `cookbook_file` deve trovarsi in una sottodirectory di `files`, come `files/default` in questo esempio. 
**Nota**  
Per specificare diversi file per sistemi differenti, è possibile inserire ogni file specifico in una sottocartella denominata secondo il sistema, ad esempio `files/ubuntu`. La risorsa `cookbook_file` copia l'appropriato file specifico per il sistema, se esistente, altrimenti utilizza il file `default`. Per ulteriori informazioni, consulta [cookbook\$1file](https://docs.chef.io/chef/resources.html#cookbook-file).

1. Creare un file denominato `example_data.json` con il JSON dell'esempio precedente e aggiungerlo a `files/default`.

La seguente ricetta copia `example_data.json` in un percorso specificato. 

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

Dopo che la risorsa della directory crea `/srv/www/shared`, la risorsa `cookbook_file` copia `example_data.json` in tale directory e imposta anche l'utente, il gruppo e la modalità del file. 

**Nota**  
La risorsa `cookbook_file` introduce una nuova operazione: `create_if_missing`. È inoltre possibile utilizzare un'operazione `create`, che però sovrascrive un file esistente. Se non si desidera sovrascrivere nulla, utilizzare `create_if_missing`, che installa `example_data.json` solo se non è già esistente.

**Per eseguire la ricetta**

1. Eseguire `kitchen destroy` per iniziare con un'istanza nuova.

1. Creare un file `default.rb` che contiene la ricetta precedente e salvarlo in `recipes`.

1. Eseguire `kitchen converge`, quindi accedere all'istanza per verificare che `/srv/www/shared` contenga `example_data.json`.

## Creazione di un file da un modello
<a name="cookbooks-101-basics-files-template"></a>

La risorsa `cookbook_file` è utile per alcuni scopi, ma si limita a installare qualsiasi file presente nel libro di ricette. Una risorsa [https://docs.chef.io/chef/resources.html#template](https://docs.chef.io/chef/resources.html#template) offre un modo più flessibile di installare un file su un'istanza di Windows o Linux tramite creazione dinamica da un modello. È quindi possibile determinare i dettagli del contenuto del file in fase di runtime e apportare modifiche in base alle esigenze. Ad esempio, potresti volere che un file di configurazione abbia una determinata impostazione all'avvio dell'istanza per poi modificare l'impostazione in seguito all'aggiunta di altre istanze allo stack.

Questo esempio modifica il libro di ricette `createfile` perché sia utilizzata una risorsa `template` per installare una versione di `example_data.json` leggermente modificata.

Ecco come apparirà il file installato.

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

Le risorse del modello sono in genere utilizzate in combinazione con i file attributo, quindi l'esempio ne utilizza uno per definire i seguenti valori.

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

**Per configurare il libro di ricette**

1. Eliminare la directory `createfile` del libro di ricette `files` e il relativo contenuto.

1. Aggiungere la sottodirectory `attributes` a `createfile` e aggiungere a `default.rb` il file `attributes` che contiene le definizioni degli attributi precedenti.

Un modello è un file `.erb` che è fondamentalmente una copia del file finale, con alcuni dei contenuti rappresentati da segnaposti. Quando la risorsa `template` crea il file, copia i contenuti del modello nel file specificato e sovrascrive i segnaposto con i relativi valori assegnati. Ecco il modello per `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'] %>"
}
```

I valori `<%=...%>` sono i segnaposto.
+ `<%=node[...]%>` rappresenta un nodo valore attributo.

  In questo esempio, il valore "your\$1name" è un segnaposto che rappresenta uno dei valori attributo del file attributo del libro di ricette.
+ `<%=@...%>` rappresenta il valore di una variabile definita nella risorsa del modello, come illustreremo più avanti.

**Per creare il file del modello**

1. Aggiungere la sottodirectory `templates` al libro di ricette `createfile` e la sottodirectory `default` a `templates`.
**Nota**  
La directory `templates` funziona in modo analogo alla directory `files`. È possibile inserire modelli specifici per il sistema in una sottodirectory, ad esempio `ubuntu`, con nome assegnato a seconda del sistema. La risorsa `template` usa l'appropriato modello specifico per il sistema, se esistente, altrimenti utilizza il modello `default`.

1. Creare un file denominato `example_data.json.erb` e salvarlo nella directory `templates/default`. Il nome del modello è arbitrario, ma è in genere si crea aggiungendo `.erb` al nome del file, incluse le estensioni. 

La seguente ricetta utilizza una risorsa `template` per creare `/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
```

La risorsa `template` crea `example_data.json` da un modello e lo installa in `/srv/www/shared`.
+ Il nome del modello, `/srv/www/shared/example_data.json`, specifica il percorso e il nome del file installato.
+ L'attributo `source` specifica il modello utilizzato per creare il file.
+ L'attributo `mode` specifica la modalità di installazione del file.
+ La risorsa definisce due variabili: `a_boolean_var` e `a_string_var`. 

  Quando la risorsa crea `example_data.json`, sovrascrive la variabile segnaposto del modello con i valori corrispondenti della risorsa. 
+ L'attributo di `only_if`protezione* * indica alla risorsa di creare il file solo se `['createfile']['install_file']` è impostato su `true`.

**Per eseguire la ricetta**

1. Eseguire `kitchen destroy` per iniziare con un'istanza nuova.

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 il file sia presente in `/srv/www/shared` con i contenuti corretti.

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