

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à.

# Struttura di una ricetta
<a name="cookbooks-101-basics-structure"></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).

Un libro di ricette è principalmente un set di *ricette*, in grado di eseguire un'ampia gamma di attività su un'istanza. Per chiarire come funziona l'implementazione delle ricette, è utile guardare un semplice esempio. Di seguito è riportata la ricetta per il livello [HAProxy](layers-haproxy.md) integrato. In questa fase soffermati solo sulla struttura generale, senza preoccuparti troppo dei dettagli, che saranno descritti nei successivi esempi.

```
package 'haproxy' do
  action :install
end

if platform?('debian','ubuntu')
  template '/etc/default/haproxy' do
    source 'haproxy-default.erb'
    owner 'root'
    group 'root'
    mode 0644
  end
end

include_recipe 'haproxy::service'

service 'haproxy' do
  action [:enable, :start]
end

template '/etc/haproxy/haproxy.cfg' do
  source 'haproxy.cfg.erb'
  owner 'root'
  group 'root'
  mode 0644
  notifies :restart, "service[haproxy]"
end
```

**Nota**  
Per questo e altri esempi di utilizzo di ricette di lavoro e file correlati, consulta le [ricette integrate di OpsWorks Stacks](https://github.com/aws/opsworks-cookbooks).

L'esempio evidenzia gli elementi chiave della ricetta, che sono descritti nelle seguenti sezioni.

**Topics**
+ [Resources](#cookbooks-101-basics-structure-resources)
+ [Controllo di flusso](#cookbooks-101-basics-structure-ruby)
+ [Ricette incluse](#cookbooks-101-basics-structure-include)

## Resources
<a name="cookbooks-101-basics-structure-resources"></a>

Le Ricette consistono in gran parte in un set di *risorse* Chef. Ognuna di esse specifica un particolare aspetto dello stato finale dell'istanza, ad esempio un pacchetto da installare o un servizio da avviare. L'esempio presenta quattro risorse:
+ Una `package` risorsa, che rappresenta un pacchetto installato, un [HAProxy server](http://haproxy.1wt.eu/) per questo esempio.
+ Una `service` risorsa, che rappresenta un servizio, il HAProxy servizio di questo esempio.
+ Due `template` risorse, che rappresentano file che devono essere creati da un modello specificato, due file di HAProxy configurazione per questo esempio.

Le risorse forniscono un modo dichiarativo per specificare l'istanza. In background, a ogni risorsa è associato un *provider* che esegue le attività necessarie, ad esempio l'installazione di pacchetti, la creazione e la configurazione di directory, l'avvio di servizi e così via. Se i dettagli dell'attività dipendono dallo specifico sistema operativo, la risorsa ha più provider e usa il tipo appropriato per il sistema. Ad esempio, su un sistema Red Hat Linux, il provider `package` utilizza `yum` per l'installazione di pacchetti. In un sistema Ubuntu Linux, il provider `package` utilizza `apt-get`.

Una risorsa come un blocco di codice Ruby viene implementata con il seguente formato generale.

```
resource_type "resource_name" do
  attribute1 'value1'
  attribute2 'value2'
  ...
  action :action_name
  notifies : action 'resource'
end
```

Gli elementi sono:

**Tipo di risorsa**  
(Obbligatorio) L'esempio include tre tipi di risorse: `package`, `service` e `template`.

**Nome risorsa**  
(Obbligatorio) Il nome identifica la particolare risorsa e talvolta viene usato come valore di default per uno degli attributi. Nell'esempio, `package` rappresenta una risorsa di pacchetto denominata `haproxy` e la prima risorsa `template` rappresenta un file di configurazione denominato `/etc/default/haproxy`.

**Attributes**  
(Facoltativo) Gli attributi specificano la configurazione delle risorse e variano in base al tipo di risorsa e alla sua configurazione.  
+ Le risorse `template` dell'esempio definiscono esplicitamente una serie di attributi che specifica l'origine del file creato nonché il proprietario, il gruppo e la modalità. 
+ Le risorse `package` e `service` esempio non definiscono in modo esplicito alcun attributo.

  Il nome della risorsa in genere è il valore di default per un attributo obbligatorio ed è talvolta tutto ciò che è necessario. Ad esempio, il nome della risorsa è il valore di default per l'attributo `package` della risorsa `package_name`, che è l'unico attributo obbligatorio.
Ci sono anche alcuni attributi specializzati, denominati attributi di protezione, che specificano quando il provider di risorse deve eseguire un'azione. Ad esempio, l'attributo `only_if` indica al provider di risorse di eseguire un'azione solo se viene soddisfatta una condizione specificata. La HAProxy ricetta non utilizza gli attributi guard, ma vengono utilizzati in molti dei seguenti esempi.

**Operazioni e notifiche**  
(Facoltativo) Azioni e notifiche specificano quali attività deve eseguire il provider.  
+ `action` indica al provider di eseguire un'operazione specifica, ad esempio un'installazione o una creazione.

  Ogni risorsa dispone di un set di operazioni che dipendono da quella particolare risorsa, una delle quali è l'operazione predefinita. Nell'esempio, l'operazione della risorsa `package` è `install`, che indica al provider di installare il pacchetto. La prima risorsa `template` non include alcun elemento `action`, perciò il provider esegue l'operazione predefinita `create`.
+ `notifies` indica un altro provider della risorsa di eseguire un'operazione, ma solo se lo stato della risorsa è stato modificato.

  `notifies` viene in genere utilizzato con risorse quali `template` e `file` per eseguire attività come il riavvio di un servizio dopo la modifica di un file di configurazione. Le risorse non prevedono notifiche di default. Per le notifica, la risorsa deve avere un elemento `notifies` esplicito. Nella HAProxy ricetta, la seconda `template` risorsa notifica alla risorsa haproxy `service` di riavviare il HAProxy servizio se il file di configurazione associato è cambiato. 

Le risorse talvolta dipendono dal sistema operativo.
+ Alcune risorse possono essere utilizzate solo su sistemi Linux o Windows.

  Ad esempio, [package](https://docs.chef.io/chef/resources.html#package) installa pacchetti sui sistemi Linux e [windows\$1package](https://docs.chef.io/chef/resources.html#windows-package) installa pacchetti sui sistemi Windows.
+ Alcune risorse possono essere utilizzate con qualsiasi sistema operativo, ma dispongono di attributi specifici per un determinato sistema.

  Ad esempio, la risorsa [file](https://docs.chef.io/chef/resources.html#file) può essere utilizzata sia su sistemi Linux che Windows, ma dispone di set di attributi separati per la configurazione delle autorizzazioni.

Per le descrizioni delle risorse standard, inclusi gli attributi, le operazioni e le notifiche disponibili per ciascuna risorsa, consulta la pagina relativa alle [informazioni su risorse e provider](https://docs.chef.io/resource.html). 

## Controllo di flusso
<a name="cookbooks-101-basics-structure-ruby"></a>

Poiché le ricette sono applicazioni Ruby, è possibile utilizzare le strutture di controllo di Ruby per integrare il controllo del flusso in una ricetta. Ad esempio, è possibile usare logica condizionale di Ruby per far sì che la ricetta si comporti in modo diverso su sistemi differenti. La HAProxy ricetta include un `if` blocco che utilizza una `template` risorsa per creare un file di configurazione, ma solo se la ricetta è in esecuzione su un sistema Debian o Ubuntu. 

È comune anche lo scenario che prevede l'uso di un loop per eseguire una risorsa più volte con diverse impostazioni di attributo. Ad esempio, è possibile creare un set di directory utilizzando un loop per eseguire una risorsa `directory` più volte con diversi nomi di directory.

**Nota**  
Se non hai familiarità con Ruby, consulta l'articolo sulle [nozioni di base su Ruby per Chef](https://docs.chef.io/just_enough_ruby_for_chef.html), che illustra le informazioni necessarie per la maggior parte delle ricette.

## Ricette incluse
<a name="cookbooks-101-basics-structure-include"></a>

`include_recipe` include altre ricette nel codice per permetterti di suddividere in moduli le ricette e riutilizzare lo stesso codice in più ricette. Quando esegui la ricetta host, Chef sostituisce ciascun elemento `include_recipe` con il codice della ricetta specificato prima di eseguire la ricetta host. Puoi identificare una ricetta inclusa utilizzando la sintassi standard `cookbook_name::recipe_name` di Chef, dove `recipe_name` omette l'estensione `.rb`. L'esempio include una ricetta`haproxy::service`, che rappresenta il HAProxy servizio. 

**Nota**  
Se utilizzi `include_recipe` in ricette in esecuzione su Chef 11.10 e versioni successive per includere una ricetta da un altro libro di ricette, devi utilizzare un'istruzione `depends` per dichiarare la dipendenza nel file `metadata.rb` del libro di ricette. Per ulteriori informazioni, consulta [Implementazione delle ricette: Chef 11.10](workingcookbook-chef11-10.md).