Puppet - Modello
Templatingè un metodo per ottenere le cose in un formato standard, che può essere utilizzato in più posizioni. In Puppet, templating e template sono supportati usando erb che fa parte della libreria Ruby standard, che può essere usata su altri progetti oltre a Ruby come nei progetti Ruby on Rails. Come pratica standard, è necessario avere una conoscenza di base di Ruby. La creazione di modelli è molto utile quando l'utente cerca di gestire il contenuto di un file modello. I modelli giocano un ruolo chiave quando le configurazioni non possono essere gestite da un tipo Puppet integrato.
Modelli di valutazione
I modelli vengono valutati utilizzando semplici funzioni.
$value = template ("testtemplate.erb")
Si può specificare il percorso completo di un modello o si possono estrarre tutti i modelli nella templatedir di Puppet, che di solito si trova in / var / puppet / templates. È possibile trovare la posizione della directory eseguendo il puppet –-configprint templatedir.
I modelli vengono sempre valutati dal parser, non dal client, il che significa che se si utilizza puppetmasterd, il modello deve essere solo sul server e non è mai necessario scaricarli sul client. Non c'è differenza nel modo in cui il client vede tra l'utilizzo di un modello e la specifica di tutto il contenuto di un file come stringa. Ciò indica chiaramente che le variabili specifiche del cliente vengono apprese per prime da Puppetmasterd durante la fase di avvio del pupazzo.
Utilizzo dei modelli
Di seguito è riportato un esempio di generazione della configurazione Tomcat per i siti di test.
define testingsite($cgidir, $tracdir) {
file { "testing-$name":
path => "/etc/tomcat/testing/$name.conf",
owner => superuser,
group => superuser,
mode => 644,
require => File[tomcatconf],
content => template("testsite.erb"),
notify => Service[tomcat]
}
symlink { "testsym-$name":
path => "$cgidir/$name.cgi",
ensure => "/usr/share/test/cgi-bin/test.cgi"
}
}
Di seguito è riportata la definizione del modello.
<Location "/cgi-bin/ <%= name %>.cgi">
SetEnv TEST_ENV "/export/svn/test/<%= name %>"
</Location>
# You need something like this to authenticate users
<Location "/cgi-bin/<%= name %>.cgi/login">
AuthType Basic
AuthName "Test"
AuthUserFile /etc/tomcat/auth/svn
Require valid-user
</Location>
Questo spinge ogni file modello in un file separato e quindi basta dire ad Apache di caricare questi file di configurazione.
Include /etc/apache2/trac/[^.#]*
Combinazione di modelli
È possibile combinare facilmente due modelli utilizzando il seguente comando.
template('/path/to/template1','/path/to/template2')
Iterazione nei modelli
Il modello Puppet supporta anche l'iterazione dell'array. Se la variabile a cui si accede è un array, è possibile iterare su di esso.
$values = [val1, val2, otherval]
Possiamo avere modelli come i seguenti.
<% values.each do |val| -%>
Some stuff with <%= val %>
<% end -%>
Il comando precedente produrrà il seguente risultato.
Some stuff with val1
Some stuff with val2
Some stuff with otherval
Condizioni nei modelli
Il erbla creazione di modelli supporta i condizionali. Il seguente costrutto è un modo semplice e veloce per inserire in modo condizionale un contenuto in un file.
<% if broadcast != "NONE" %> broadcast <%= broadcast %> <% end %>
Modelli e variabili
È possibile utilizzare modelli per inserire variabili oltre a compilare il contenuto del file.
testvariable = template('/var/puppet/template/testvar')
Variabile non definita
Se è necessario verificare se la variabile è definita prima di utilizzarla, il seguente comando funziona.
<% if has_variable?("myvar") then %>
myvar has <%= myvar %> value
<% end %>
Variabile fuori ambito
Si può cercare la variabile fuori ambito esplicitamente con la funzione lookupvar.
<%= scope.lookupvar('apache::user') %>
Modello di progetto di esempio
<#Autogenerated by puppet. Do not edit.
[default]
#Default priority (lower value means higher priority)
priority = <%= @priority %>
#Different types of backup. Will be done in the same order as specified here.
#Valid options: rdiff-backup, mysql, command
backups = <% if @backup_rdiff %>rdiff-backup,
<% end %><% if @backup_mysql %>mysql,
<% end %><% if @backup_command %>command<% end %>
<% if @backup_rdiff -%>
[rdiff-backup]
<% if @rdiff_global_exclude_file -%>
global-exclude-file = <%= @rdiff_global_exclude_file %>
<% end -%>
<% if @rdiff_user -%>
user = <%= @rdiff_user %>
<% end -%>
<% if @rdiff_path -%>
path = <%= @rdiff_path %>
<% end -%>
#Optional extra parameters for rdiff-backup
extra-parameters = <%= @rdiff_extra_parameters %>
#How long backups are going to be kept
keep = <%= @rdiff_keep %>
<% end -%>
<% if @backup_mysql -%>%= scope.lookupvar('apache::user') %>
[mysql]
#ssh user to connect for running the backup
sshuser = <%= @mysql_sshuser %>
#ssh private key to be used
sshkey = <%= @backup_home %>/<%= @mysql_sshkey %>
<% end -%>
<% if @backup_command -%>
[command]
#Run a specific command on the backup server after the backup has finished
command = <%= @command_to_execute %>
<% end -%>