Instalando o pacote do PPA usando o Puppet

8

Estou tentando provisionar automaticamente as VMs com o docker pré-instalado.

Meu init.pp padrão se parece com:

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
}

O último comando exec retorna (o retorno 100 é o padrão para uma atualização bem-sucedida do apt-get):

info: /Stage[main]//Apt::Ppa[ppa:dotcloud/lxc-docker]/Exec[add-apt-repository-ppa:dotcloud/lxc-docker]: Scheduling refresh of Exec[apt_update] notice: /Stage[main]/Apt::Update/Exec[apt_update]/returns: executed successfully notice: /Stage[main]/Apt::Update/Exec[apt_update]: Triggered 'refresh' from 1 events

No entanto, quando eu ssh na caixa de encaixe da caixa não estiver instalado e executando apt-get install lxc-docker , posso instalá-lo. O que estou fazendo de errado? Parece que não consigo trabalhar com várias configurações diferentes.

    
por digital 29.07.2013 / 00:22

2 respostas

13

apt-get retorna 0 em sucesso e 100 em erro, como você pode ver facilmente na página apt-get man. Então você entendeu isso de trás pra frente. Você está combinando dois comandos usando && , o que significa que o segundo comando só é executado quando o primeiro é concluído com êxito (retornando 0). Portanto, se apt-get update retornasse "100", como você erroneamente espera, o segundo comando nem seria executado.

E se você ler atentamente a mensagem de log, verá que o recurso Exec aplicado é denominado "apt_update" e não "apt-update". O primeiro é definido na classe apt e executado quando o recurso apt::ppa é aplicado. Este último é seu próprio recurso Exec, que também apareceria na saída do log, mas como Exec[apt-update] . Procure por isso.

Em qualquer caso, o que você construiu aqui não funciona porque você está tentando usar o Puppet como um script da Shell glorificado e fazendo errado. O Puppet ignora a ordem em que você especifica recursos no manifesto e, em vez disso, os aplica da maneira que julgar adequada. Portanto, para garantir que o pacote lxc-docker seja instalado a partir do PPA especificado, é necessário certificar-se de que o recurso PPA seja aplicado antes do recurso do pacote.

Existem algumas maneiras de fazer isso, todas envolvendo o fato de você especificar relacionamentos ou dependências. Aqui está uma maneira, usando setas de encadeamento :

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

Isso significa que o recurso do pacote lxc-docker será aplicado depois que o recurso apt::ppa do PPA "ppa: dotcloud / lxc-docker" tiver sido aplicado. Conforme explicado, o recurso apt::ppa já cuida da atualização do cache do APT após adicionar um PPA, portanto, não há necessidade de chamar explicitamente apt-get update em qualquer lugar.

    
por 29.07.2013 / 02:37
1

E aqui está uma resposta idiomática alternativa 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']
}
    
por 19.08.2014 / 21:22