Esempio 5: utilizzo di attributi - AWS OpsWorks

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

Importante

Il AWS OpsWorks Stacks il 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 AWS Support Squadra su AWS Re:post o tramite AWS Supporto Premium.

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

Tieni 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. 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 AWS OpsWorks Stacks, l'oggetto node include un gran numero di attributi dei libri di cucina integrati 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], ad esempio, a meno di voler sovrascrivere il valore di tale attributo. Per ulteriori informazioni, consulta Utilizzo degli attributi personalizzati del libro di ricette.

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.

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

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

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

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

Nota

Con AWS OpsWorks Stacks, la definizione dei valori come attributi offre un ulteriore vantaggio; è possibile utilizzare custom JSON 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.

    Ad esempio, è possibile utilizzare lo stesso ricettario per diversi stack e utilizzare custom per specificare le impostazioni di configurazione chiave JSON per uno stack particolare. 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 invece utilizzare un attributo per definire un valore predefinito e quindi utilizzare custom JSON per sovrascrivere quel valore con quello reale.

Per ulteriori informazioni su come utilizzare custom per JSON sovrascrivere gli attributi, consulta. Sostituzione degli attributi

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

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

  3. Modificare .kitchen.yml per aggiungere una piattaforma CentOS alla sezione delle piattaforme, come descritto in Logica condizionale.

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