2014-12-24 13 views
5

Devo eseguire un'azione (configurare qualcosa) dopo aver arrestato il servizio tomcat. Una volta completata la configurazione, devo assicurarmi che il servizio tomcat sia attivo e di nuovo in esecuzione. Ho scritto seguente codice di marionette per lo stesso:In burattino, come fermare un servizio, eseguire qualche azione e quindi avviare il servizio?

Service {'tomcat': ensure => stopped } 
-> 
class {'config':} 
-> 
Service {'tomcat': ensure => running } 

Sul fantoccio applicare, si lamenta che

'Error: Duplicate declaration: Service[tomcat] is already declared in file'

Come risolvere questo problema. Qual è la ricetta in puppet per fermare un servizio, eseguire qualche azione e poi riportare di nuovo il servizio?

risposta

5

Nel burattino, non è possibile dichiarare lo stesso servizio di nuovo. questo è l'errore che hai.

Con puppet, non devi preoccuparti dei processi di arresto/avvio di tomcat. Si occupa dello stato finale (chiamato "idemotenza"). Dopo aver definito la relazione tra pacchetto, file di configurazione e servizi, eseguirà tutti i lavori per te. Ad esempio, è necessario comprendere i processi sottostanti in puppet e le differenze tra -> e ~>.

Package['tomcat'] -> File['server.xml'] ~> Service['tomcat'] 

Nel tuo caso, si applica il cambiamento nel file di configurazione Tomcat e marionette si riavviare i servizi Tomcat automaticamente.

Per riferimento, ecco la copia-incolla da Introduction to Puppet blog per spiegare qual è il significato di idempotenza:

One big difference between Puppet and most other tools is that Puppet configurations are idempotent, meaning they can safely be run multiple times. Once you develop your configuration, your machines will apply the configuration often — by default, every 30 minutes — and Puppet will only make any changes to the system if the system state does not match the configured state.

Aggiornamento 2016:

Ecco un altro post del blog Puppet ufficiale su idempotenza: https://puppet.com/blog/idempotence-not-just-a-big-and-scary-word

+1

Vorrei aggiungere che a volte, è necessario essere in grado di avviare e interrompere un servizio. L'ordine non può risolvere tutto. Ad esempio, cambiando l'UID di un utente che ha un processo in esecuzione (ad esempio: tomcat), è necessario prima arrestare il processo. – majikman

+0

per l'esempio, è necessario definire un altro ordine, se l'UID di un utente è cambiato e richiede un riavvio del servizio. – BMW

+0

Questo post spiega il concetto ma in realtà non fornisce una soluzione. Ecco perché propongo di accettare la risposta di Felix Frank come "corretta". – Christian

1

Questo non è direttamente possibile con Puppet, come @BMW si conclude correttamente. Ci sono alcuni altri punti da notare, tuttavia.

C'è un promettente work in progress che aggiungerà supporto limitato per la dichiarazione di stato transitoria. Tuttavia, questo non consentirà (nel suo stato alfa attuale almeno) di entrare in tale stato in preparazione e durante l'applicazione di un'intera classe.

Una soluzione alternativa comune per questo tipo di problema è la gestione dell'entità in questione con due o più risorse. Il tipo exec è una buona soluzione per tutte le catture perché può gestire praticamente qualsiasi cosa. L'ovvio inconveniente è che il exec dovrà essere adattato ai vostri agenti (cosa sapete - c'è un punto nel sistema dei tipi di Puppet dopo tutto ;-). Supponendo che il manifesto sarà per una piattaforma unica, questo è semplice:

exec { 
    'stop-tomcat': 
     command => 'service tomcat stop', 
     onlyif => 'service tomcat status', 
     before => [ 
      Class['config'], 
      Service['config'], 
     ], 
} 

Ordinando la execprimaService['config'] è ridondante (perché il service richiede l'class), ma è buona pratica per esprimere che il service la risorsa dovrebbe avere l'ultima parola.

Problemi correlati