Perché dovrei usare una classe con parametri marionette?


12

Generalmente, quando lavoro con complessi moduli fantoccio, imposterò variabili a livello di nodo o all'interno di una classe. per esempio,

node 'foo.com' {
  $file_owner = "larry" 
  include bar 
}

class bar { 
  $file_name = "larry.txt"
  include do_stuff
}

class do_stuff {
  file { $file_name:
    ensure => file,
    owner  => $file_owner,
  }
}

Come / quando / perché le classi parametrizzate aiutano in questa situazione? Come stai usando le classi parametrizzate per strutturare i tuoi moduli fantoccio?


2
Nota a tutti coloro che trovano questo esempio, questo codice mostra le ricerche di variabili globali consentite nella versione Puppet <3.0. In Puppet> 3.0, non puoi accedere alle variabili al di fuori dell'ambito e devi usare lo spazio dei nomi per accedere alle variabili. In questo esempio, dovresti usare $bar::file_namee $::file_owneraccedere a quelle rispettive variabili. Tuttavia, quando si utilizzano le classi parametrizzate, le variabili passate in una classe tramite i parametri diventano variabili con ambito locale.
Robbyt,

Risposte:


12

Le classi con parametri sono un costrutto di linguaggio che ti aiuta a strutturare meglio il tuo codice. Ti impedisce di utilizzare eccessivamente le variabili globali (come nel tuo esempio).

Immagina di aver incluso altre 20 classi nella descrizione del tuo nodo e che tutti avrebbero bisogno di alcune variabili impostate nell'ambito globale o del nodo del manifest. Anche le classi con parametri consentono di avere facilmente i parametri predefiniti, quindi è possibile utilizzare un valore predefinito per $file_ownerinvece di dover fornire lo stesso valore (ad esempio larry) in diversi luoghi.

Lo snippet di esempio (con due nodi aggiuntivi) potrebbe essere scritto come segue:

node 'example.com' { 
  class { bar: }
}

node 'example.net' {
  class { bar: owner = "harry" }
}

node 'example.net' {
  class { bar: file_name = "barry.txt" }
}

class bar($owner = "larry", $file_name = "larry.txt") { 
  class { do_stuff: owner => $owner, file_name => $file_name }
}

class do_stuff($owner, $file_name) {
  file { $file_name:
    ensure => file,
    owner  => $owner,
  }
}

Con l'utilizzo di variabili globali, è necessario dichiarare una variabile denominata $ownerin ciascun nodo e non sarà possibile sovrascrivere la $file_namevariabile / parametro per nodo. Dovresti invece dichiarare un'altra barclasse per ciascun nodo.

Il documento sull'evoluzione del linguaggio di Puppet e, naturalmente, la guida linguistica forniscono alcuni buoni esempi su come utilizzare le classi parametrizzate e la logica alla base di questo costrutto linguistico:


8

Il modo migliore per pensare a questo è di raggiungerlo dall'inizio invece di iniziare già conoscendo gli idiomi di Puppet.

Quello che stai cercando di fare in primo luogo è passare parametri in una classe: stai fornendo le informazioni di cui ha bisogno per decidere come comportarsi, proprio come passare argomenti a una funzione. Supponiamo che questo fosse perl e che tu avessi una funzione chiamata multiply_squares. Lo chiameresti come multiply_squares(3, 4), non imposti alcune variabili globali su 3 e 4 e poi le leggi dall'interno della funzione!

Ma storicamente, il codice Puppet ha dovuto farlo con variabili globali o ambito dinamico, perché la necessità di farlo è sorto prima che il linguaggio fosse progettato per farlo. Personalmente, penso che una volta che le classi con parametri saranno un po 'più evolute e distribuite in modo più ampio, fondamentalmente renderanno i problemi di portata variabile un ricordo del passato, perché avere lo strumento giusto disponibile per il lavoro eliminerà un intero strato di hack spaventosi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.