2015-05-15 20 views
6

Sto usando hiera per assegnare classi come webserver o dbserver ai miei nodi. La classe webserver include solo apache e ne imposta alcune configurazioni (ad esempio porta). Ovviamente non voglio replicare questa configurazione per ogni nodo, quindi l'ho messo in common.yaml. Tuttavia, il mio common.yaml sta diventando grande, quindi voglio dividerlo. Mi piacerebbe avere un file contenente la configurazione per il ruolo webserver, un altro per il ruolo di dbserver ecc sto immaginando il mio hiera.yaml a cercare qualcosa di simile:Come posso dividere il mio hiera config per ruolo?

:hierarchy: 
    - "fqdn/%{::fqdn}" 
    - "role/%{ROLE}" 
    - common 

dove la cartella role conterrebbe file come webserver.yaml, appserver.yaml, dbserver.yaml. Ho visto vari post sul blog che affermano che la soluzione è creare un "ruolo" personalizzato, ma la maggior parte di essi lo realizza caricando quel fatto da un file sul nodo dell'agente (ad esempio da /etc/role), che per me sembra sconfiggere il punto di burattino (uso puppet in modo specifico in modo da non dover accedere a ciascun nodo e modificare qualche configurazione ogni volta che voglio avere un nuovo ruolo).

Per essere chiari, non voglio dover modificare i file sull'agente per farlo funzionare, voglio farlo tutto usando la configurazione presente sul master.

Immagino di poter avere qualcosa di simile al seguente ed elencare in modo esaustivo ogni ruolo come elemento nella gerarchia, ma non sembra gestibile.

:hierarchy: 
    - "fqdn/%{::fqdn}" 
    - "webserver" 
    - "appserver" 
    - "dbserver" 
    - common 

C'è un modo per risolvere questo?

risposta

3

Per poter utilizzare $Role nella configurazione di hiera, deve essere fornito come fatto/variabile, tuttavia esiste un modo per farlo sul master anziché sul nodo. Questa è una delle cose per cui è possibile utilizzare External Node Classifiers.

Fondamentalmente, è necessario scrivere uno script che prende il nome del nodo e stampa yaml che include il valore del parametro . Ad esempio, è possibile avere un file yaml che è solo una mappa di nomi nodo per i ruoli, quindi lo script esegue una ricerca e stampa il risultato (come parametro nello schema collegato). Ecco an example.

Ci sono anche ENC più robusti là fuori, se siete interessati a nuovi strumenti. Ad esempio, Foreman fornisce un'interfaccia Web per il raggruppamento di host in ruoli simili, l'impostazione di parametri per l'iniezione in marionette, ecc.

1

Ho trovato una soluzione per questo. L'unico svantaggio è che il numero massimo di ruoli è hardcoded. Questo sarà meglio con hiera 3 fino ad allora provate questo:

/etc/puppet/hiera.yaml

--- 
:backends: 
    - yaml 
:yaml: 
    :datadir: /etc/puppet/hieradata 
:hierarchy: 
    - 'nodes/%{::clientcert}' 
    - 'roles/%{::role_4}' 
    - 'roles/%{::role_3}' 
    - 'roles/%{::role_2}' 
    - 'roles/%{::role_1}' 
    - common 

/etc/puppet/manifests/site.pp

# Get roles 
$roles = hiera_array('roles', []) 

# Declare Roles in vars (not needed in puppet 4) 
$role_1 = $roles[0] 
$role_2 = $roles[1] 
$role_3 = $roles[2] 
$role_4 = $roles[3] 

# Include Classes 
hiera_include('classes') 

/etc /puppet/hieradata/roles/webserver.yaml

--- 
classes: 
    - nginx 

# put nginx config here 

/etc/puppet/hieradata/nodes/your_node_name.yaml

--- 
roles: 
- webserver 

classes: 
# put node specific stuff here