

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 5: utilizzo di attributi
<a name="cookbooks-101-basics-attributes"></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 ricette nelle sezioni precedenti utilizzavano valori prefissati per tutto, tranne che per la piattaforma. Questo approccio può rivelarsi poco pratico se, ad esempio, vuoi utilizzare lo stesso valore in più ricette. Puoi definire i valori separatamente dalle ricette includendo un file attributo nel tuo libro di ricette.

Un file attributo è un'applicazione Ruby che assegna valori a uno o più attributi. deve trovarsi nella cartella `attributes` del libro di ricette. Chef incorpora gli attributi nell'oggetto nodo e qualsiasi ricetta può utilizzare i valori dell'attributo facendovi riferimento. Questo argomento spiega come modificare la ricetta da [Iterazione](cookbooks-101-basics-ruby.md#cookbooks-101-basics-ruby-iteration) per utilizzare gli attributi. Ecco la ricetta originale come riferimento.

```
[ "/srv/www/config", "/srv/www/shared" ].each do |path|
  directory path do
    mode 0755
    owner 'root'
    group 'root'
    recursive true
    action :create
  end
end
```

Di seguito vengono determinati gli attributi per il nome della sottodirectory, la modalità, il proprietario e i valori di gruppo.

```
default['createdir']['shared_dir'] = 'shared'
default['createdir']['config_dir'] = 'config'
default['createdir']['mode'] = 0755
default['createdir']['owner'] = 'root'
default['createdir']['group'] = 'root'
```

Tenere presente quanto segue:
+ Ogni definizione inizia con un *tipo di attributo*.

  Se un attributo viene definito più di una volta, magari in file di attributi diversi, il tipo di attributo specifica la precedenza dell'attributo, che determina quale definizione è incorporata nell'oggetto nodo. Per ulteriori informazioni, consulta [Precedenza degli attributi](workingcookbook-attributes-precedence.md). Tutte le definizioni in questo esempio hanno il tipo di attributo `default`, che è l'opzione più comune per questo scopo.
+ Gli attributi hanno nomi nidificati.

  L'oggetto nodo è fondamentalmente una tabella hash che può essere nidificata con profondità arbitraria, perciò i nomi di attributo possono essere nidificati ed è comune che lo siano. Questo file attributo segue una pratica standard, ovvero l'utilizzo di un nome nidificato con il nome del libro di ricette, `createdir`, come primo elemento.

L'utilizzo di createdir come primo elemento dell'attributo è dovuto al fatto che Chef, durante l'esecuzione di una sessione, incorpora gli attributi di ogni libro di ricette nell'oggetto nodo. Con OpsWorks Stacks, l'oggetto node include un gran numero di attributi dei libri di [cucina incorporati](https://github.com/aws/opsworks-cookbooks) oltre a tutti gli attributi definiti dall'utente. Includere il nome del libro di ricette nel nome dell'attributo riduce il rischio di un conflitto di nomi con gli attributi di un altro libro di ricette, soprattutto se l'attributo ha un nome come `port` o `user`. Non assegnare a un attributo un nome del tipo [`[:apache2][:user]`](attributes-recipes-apache.md#attributes-recipes-apache-user), ad esempio, a meno di voler sovrascrivere il valore di tale attributo. Per ulteriori informazioni, consulta [Utilizzo degli attributi personalizzati del libro di ricette](workingcookbook-cookbook-attributes.md).

L'esempio seguente mostra la ricetta originale con gli attributi invece che con i valori prefissati.

```
[ "/srv/www/#{node['createdir']['shared_dir']}", "/srv/www/#{node['createdir']['config_dir']}" ].each do |path|
  directory path do
    mode node['createdir']['mode']
    owner node['createdir']['owner']
    group node['createdir']['group']
    recursive true
    action :create
  end
end
```

**Nota**  
Se vuoi incorporare un valore attributo in una stringa, includilo fra `#{}`. Nell'esempio precedente, `#{node['createdir']['shared_dir']}` aggiunge "shared" a "/srv/www/".

**Per eseguire la ricetta**

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

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

1. Creare una sottodirectory di `createdir` denominata `attributes` e aggiungere un file con nome `default.rb` che contiene le definizioni degli attributi.

1. Modificare `.kitchen.yml` per rimuovere CentOS dall'elenco delle piattaforme.

1. Eseguire `kitchen converge`, effettuare l'accesso all'istanza e verificare la presenza di `/srv/www/shared` e `/srv/www/config`.

**Nota**  
Con OpsWorks Stacks, la definizione dei valori come attributi offre un ulteriore vantaggio; puoi utilizzare [JSON personalizzato](workingstacks-json.md) per sovrascrivere tali valori in base allo stack o anche alla distribuzione. Questa possibilità può essere utile per molti scopi, ad esempio:  
È possibile personalizzare il comportamento delle ricette, ad esempio le impostazioni di configurazione o i nomi utente, senza dover modificare il libro di ricette.  
È possibile, ad esempio, utilizzare lo stesso libro di ricette per diversi stack e utilizzare un JSON personalizzato per specificare le impostazioni di configurazione chiave per un determinato stack. Questo consente di risparmiare il tempo e il lavoro necessari per modificare il libro di ricette o utilizzare un diverso libro di ricette per ogni stack.
Non inserire informazioni potenzialmente riservate, ad esempio le password del database, nel repository del libro di ricette.  
Puoi utilizzare un attributo per definire un valore di default e quindi utilizzare JSON personalizzati per sovrascrivere quel valore con quello reale.
Per ulteriori informazioni sull'utilizzo di JSON personalizzati per sovrascrivere gli attributi, consulta [Sostituzione degli attributi](workingcookbook-attributes.md).

Il file attributo è denominato `default.rb` perché è un'applicazione Ruby, anche se semplice. Ciò significa che è possibile, ad esempio, utilizzare la logica condizionale per specificare valori degli attributi in base al sistema operativo. In [Logica condizionale](cookbooks-101-basics-ruby.md#cookbooks-101-basics-ruby-conditional), hai specificato nella ricetta un nome di sottodirectory diverso per differenti famiglie Linux. Un file attributo, invece, ti consente di inserire la logica condizionale nel file attributo stesso.

Il seguenti file attributo impiega `value_for_platform` per specificare un valore di attributo `['shared_dir']` diverso a seconda del sistema operativo. Per altre condizioni, puoi usare la logica `if-elsif-else` di Ruby o un'istruzione `case`.

```
data_dir = value_for_platform(
  "centos" => { "default" => "shared" },
  "ubuntu" => { "default" => "data" },
  "default" => "user_data"
)
default['createdir']['shared_dir'] = data_dir
default['createdir']['config_dir'] = "config"
default['createdir']['mode'] = 0755
default['createdir']['owner'] = 'root'
default['createdir']['group'] = 'root'
```

**Per eseguire la ricetta**

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

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

1. Modificare `.kitchen.yml` per aggiungere una piattaforma CentOS alla sezione delle piattaforme, come descritto in [Logica condizionale](cookbooks-101-basics-ruby.md#cookbooks-101-basics-ruby-conditional).

1. Eseguire `kitchen converge` e quindi effettuare l'accesso alle istanze per verificare la presenza delle directory.

Al termine dell'operazione, eseguire `kitchen destroy` per terminare l'istanza. L'esempio successivo utilizza un nuovo libro di ricette.