Instalando o pacote do PPA usando o Puppet


8

Estou tentando provisionar VMs automaticamente com 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, eu acho):

info: / Stage [main] // Apt :: Ppa [ppa: dotcloud / lxc-docker] / Exec [add-apt-repository-ppa: dotcloud / lxc-docker]: agendando a atualização do aviso do Exec [apt_update]: / Estágio [principal] / Apt :: Atualizar / Exec [apt_update] / retorna: executado com êxito aviso: / Estágio [principal] / Apt :: Atualização / Exec [apt_update]: 'Atualização' acionada de 1 eventos

No entanto, quando o ssh na caixa de encaixe não está instalado e em execução apt-get install lxc-docker, posso instalá-lo. O que estou fazendo errado? Não consigo fazê-lo funcionar com uma infinidade de configurações diferentes.

Respostas:


13

apt-getretorna 0 em caso de sucesso e 100 em erro, como você pode ver facilmente na apt-getpágina de manual. Então você tem isso ao contrário. Você está combinando dois comandos usando &&, o que significa que o segundo comando é executado apenas quando o primeiro é concluído com êxito (retornando 0). Portanto, se você apt-get updateretornar "100", como você espera erroneamente, o segundo comando nem será executado.

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

De qualquer forma, o que você construiu aqui não funciona porque você está tentando usar o Puppet como um script Shell glorificado e está fazendo errado. O Puppet ignora a ordem em que você especifica os recursos no manifesto e os aplica da maneira que achar melhor. Portanto, para garantir que o lxc-dockerpacote seja instalado a partir do PPA especificado, é necessário garantir que o recurso PPA seja aplicado antes do recurso do pacote.

Existem algumas maneiras de fazer isso, todas elas envolvendo a especificação de relacionamentos ou dependências. Aqui está uma maneira, usando as 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 lxc-dockerrecurso do pacote será aplicado após a aplicação do apt::pparecurso para o PPA "ppa: dotcloud / lxc-docker". Conforme explicado, o apt::pparecurso já cuida de atualizar o cache do APT após adicionar um PPA, portanto, não há necessidade de chamar explicitamente em apt-get updatequalquer lugar.


Você ainda precisa exigir Exec['apt_update']dos seus pacotes instalados a partir de um PPA. Exigir o PPA antes do pacote não impõe o relacionamento entre o Exec e o pacote.
daxlerod 25/10

1

E aqui está uma resposta alternativa e 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']
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.