Installazione del pacchetto da PPA tramite Puppet


8

Sto cercando di eseguire il provisioning automatico delle VM con la finestra mobile preinstallata.

Il mio init.pp predefinito è simile a:

class { 'apt':
 always_apt_update    => true,
}

package { [
    #'build-essential',
    #'vim',
    #'curl',
    #'zsh',
    #'git-core',
    #'htop',
    #'wget',
    #'linux-image-generic-lts-raring',
    'python-software-properties'
    #'lxc-docker'
  ]:
  ensure  => 'installed',
}

apt::ppa { 'ppa:dotcloud/lxc-docker':}

# refresh apt source
exec { "apt-update":
  command => "/usr/bin/apt-get update && apt-get install lxc-docker --force-yes",
  returns => 100
}

L'ultimo comando exec restituisce (restituire 100 è l'impostazione predefinita per un aggiornamento apt-get riuscito credo):

info: / Stage [main] // Apt :: Ppa [ppa: dotcloud / lxc-docker] / Exec [add-apt-repository-ppa: dotcloud / lxc-docker]: Aggiornamento della pianificazione di Exec [apt_update] avviso: / Stage [main] / Apt :: Update / Exec [apt_update] / Returns: eseguito correttamente avviso: / Stage [main] / Apt :: Update / Exec [apt_update]: attivato 'aggiorna' da 1 eventi

Tuttavia quando ssh nella finestra mobile box non è installato e in esecuzione, apt-get install lxc-dockerposso installarlo. Che cosa sto facendo di sbagliato? Non riesco a farlo funzionare con una moltitudine di diverse configurazioni.

Risposte:


13

apt-getrestituisce 0 in caso di successo e 100 in caso di errore, come puoi facilmente vedere dalla apt-getpagina man. Quindi ce l'hai al contrario. Stai combinando due comandi usando &&, il che significa che il secondo comando viene eseguito solo quando il primo viene completato correttamente (restituendo 0). Quindi, se apt-get updatedovessi restituire "100", come ti aspetti erroneamente, il secondo comando non verrebbe nemmeno eseguito.

E se leggi attentamente il messaggio di log vedrai che la risorsa Exec applicata è chiamata "apt_update" e non "apt-update". Il primo è definito nella aptclasse ed eseguito quando apt::ppaviene applicata la risorsa. Quest'ultima è la tua risorsa Exec, che apparirebbe anche nell'output del registro, ma come Exec[apt-update]. Cerca quello.

In ogni caso, ciò che hai costruito qui non funziona perché stai provando a usare Puppet come uno script Shell glorificato e stai sbagliando. Puppet ignora l'ordine in cui si specificano le risorse nel manifest e le applica invece nel modo che ritiene opportuno. Quindi, per assicurarsi che il lxc-dockerpacchetto venga installato dal PPA specificato, è necessario assicurarsi che la risorsa PPA sia applicata prima della risorsa del pacchetto.

Ci sono alcuni modi per farlo, tutti implicando che si specificano relazioni o dipendenze. Ecco un modo, usando le frecce incatenate :

class { 'apt':
 always_apt_update => true,
}

apt::ppa { 'ppa:dotcloud/lxc-docker':}

# Your regular packages don't know or care about the PPA
package { [
    'build-essential',
    'vim',
    'curl',
    'zsh',
    'git-core',
    'htop',
    'wget',
    'linux-image-generic-lts-raring',
    'python-software-properties'
  ]:
  ensure  => 'installed',
}

# We single lxc-docker out to be able to specify 
# the relationship to Apt::Ppa properly
package { 'lxc-docker':
  ensure => 'installed'
}

Apt::Ppa['ppa:dotcloud/lxc-docker'] ->
Package['lxc-docker']

Ciò significa che la lxc-dockerrisorsa pacchetto verrà applicata dopo l'applicazione della apt::pparisorsa per PPA "ppa: dotcloud / lxc-docker". Come spiegato, la apt::pparisorsa si occupa già di aggiornare la cache APT dopo aver aggiunto un PPA, quindi non è necessario chiamare esplicitamente da apt-get updatenessuna parte.


È ancora necessario richiedere i Exec['apt_update']pacchetti installati da un PPA. Richiedere il PPA prima che il pacchetto non imponga la relazione tra Exec e il pacchetto.
daxlerod,

1

Ed ecco una risposta alternativa e idiomatica usando require:

class { 'apt':
 always_apt_update => true,
}

apt::ppa { 'ppa:dotcloud/lxc-docker':}

package { [others]: }    

package { 'lxc-docker':
  ensure  => 'installed',
  require => Apt::Ppa['ppa:dotcloud/lxc-docker']
}
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.