Instalación del paquete desde PPA usando Puppet

8

Estoy tratando de aprovisionar máquinas virtuales automáticamente con Docker preinstalado.

Mi init.pp predeterminado se ve así:

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
}

El último comando exec regresa (creo que return 100 es el valor predeterminado para una actualización exitosa de apt-get):

info: / Stage [main] // Apt :: Ppa [ppa: dotcloud / lxc-docker] / Exec [add-apt-repository-ppa: dotcloud / lxc-docker]: Programación de actualización de Exec [apt_update] aviso: / Stage [main] / Apt :: Update / Exec [apt_update] / devuelve: ejecutado con éxito aviso: / Stage [main] / Apt :: Update / Exec [apt_update]: Activado 'actualizar' de 1 eventos

Sin embargo, cuando ssh en la caja docker no está instalada y ejecutándose apt-get install lxc-docker, puedo instalarla. ¿Qué estoy haciendo mal? Parece que no puedo hacerlo funcionar con una multitud de configuraciones diferentes.

digital
fuente

Respuestas:

13

apt-getdevuelve 0 en caso de éxito y 100 en caso de error, como puede ver fácilmente en la apt-getpágina del manual. Entonces lo tienes al revés. Está combinando dos comandos usando &&, lo que significa que el segundo comando solo se ejecuta cuando el primero se completa con éxito (devuelve 0). Entonces, si apt-get updatedevolviera "100", como espera equivocadamente, el segundo comando ni siquiera se ejecutaría.

Y si lee el mensaje de registro cuidadosamente, verá que el recurso Exec aplicado se llama "apt_update" y no "apt-update". El primero se define en la aptclase y se ejecuta cuando apt::ppase aplica el recurso. Este último es su propio recurso Exec, que también aparecería en la salida del registro, pero como Exec[apt-update]. Busca eso.

En cualquier caso, lo que construyó aquí no funciona porque está tratando de usar Puppet como un script de Shell glorificado y lo está haciendo mal. Puppet ignora el orden en el que especifica los recursos en el manifiesto y, en su lugar, los aplica de la manera que mejor le parezca. Por lo tanto, para asegurarse de que el lxc-dockerpaquete se instale desde el PPA especificado, debe asegurarse de que el recurso PPA se aplique antes que el recurso del paquete.

Hay algunas formas de hacerlo, todas ellas involucrando que especifique relaciones o dependencias. Aquí hay una forma, usando flechas de encadenamiento :

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']

Esto significa que el lxc-dockerrecurso del paquete se aplicará después de que se haya aplicado el apt::pparecurso para el PPA "ppa: dotcloud / lxc-docker". Como se explicó, el apt::pparecurso ya se encarga de actualizar el caché APT después de agregar un PPA, por lo que no hay necesidad de llamar explícitamente a apt-get updateninguna parte.

narciso
fuente
Aún necesita exigir Exec['apt_update']en sus paquetes instalados desde un PPA. Requerir el PPA antes del Paquete no impone la relación entre Exec y el Paquete.
daxlerod
1

Y aquí hay una respuesta alternativa, idiomática 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']
}
msanford
fuente