Adicionando um repositório yum ao fantoche antes de fazer qualquer outra coisa

26

Existe uma maneira de forçar o fantoche a fazer certas coisas primeiro? Por exemplo, preciso instalar um RPM em todos os servidores para adicionar um repositório yum (Comunidade IUS) antes de instalar qualquer um dos pacotes.

Jon Haddad
fonte
Para um caso de uso mais complexo, consulte também minha pergunta relacionada .
Matt McClure

Respostas:

37

Se você deseja garantir que um repositório esteja instalado em todo o servidor, sugiro algo como isto

node default {
   include base
}

class base {
   yumrepo { "IUS":
      baseurl => "http://dl.iuscommunity.org/pub/ius/stable/$operatingsystem/$operatingsystemrelease/$architecture",
      descr => "IUS Community repository",
      enabled => 1,
      gpgcheck => 0
   }
}

Então, para qualquer nó que se estenda, basevocê pode dizer

class foo {
   package { "bar": ensure => installed, require => Yumrepo["IUS"] }
}

Isso garantirá que

  • O pacote barnão será instalado, a menos que o repositório IUS esteja definido
  • O pacote não tentará instalar antes que o repositório IUS seja definido
Dave Cheney
fonte
Ah ok. Isso é incrível. Eu não vi o yumrepo lá - obrigado!
Jon Haddad
Ele só funciona com distribuições que usam Yum, assim RHEL5 apenas, não RHEL4
Dave Cheney
2
O que acontece se eu não souber qual repositório possui um pacote? Por exemplo, um pacote pode estar disponível no repositório fedora no Fedora e no repositório epel no RHEL, CentOS etc. Isso significa que se eu usar uma receita / módulo de terceiros, terei que personalizá-lo.
Cristian Ciupitu
17

Embora os estágios possam lidar com isso e as dependências específicas do yum repo, o melhor é declarar o relacionamento genericamente.

Basta colocar Yumrepo <| |> -> Package <| provider != 'rpm' |>no seu manifesto de marionetes.

node default {
  Yumrepo <| |> -> Package <| provider != 'rpm' |>
}

Isso faz com que todos os tipos de yumrepo sejam processados ​​antes de qualquer pacote que não possua 'rpm' como provedor. Essa última exclusão é para que eu possa usar (por exemplo) o pacote RPM epel-release para ajudar a instalar o yum repo.

Steven Roberts
fonte
8

(Encontrei essa pergunta depois de responder quase a mesma coisa . Pensei que minha resposta se aplica aqui também e vale a pena repeti-la (é mais seguro ter uma resposta em dois lugares ..)

Pelo que entendi, é exatamente para isso que estão os estágios - eles permitem agrupar e ordenar execuções de classe. Eu uso "estágios" para atualizar e configurar o APT nos servidores Debian, que devem ser muito semelhantes ao que você fará com o YUM.

Primeiro, você declara o estágio "yum" no nível superior (acima de "nós"), para que as classes no estágio "yum" sejam executadas antes dos "principais":

stage { 'yum' : before => Stage['main'] }

Em seguida, você atribui o estágio às classes. Você pode fazer isso corretamente na sua definição de nó:

node default {
  class { 'yumrepos' : stage => yum }

  include packages
}
Alexander Azarov
fonte
Obrigado por isso :) Eu pessoalmente prefiro essa abordagem à resposta aceita.
Michael Mior 29/03
5

Você pode usar tags . Isso permitirá que você marque o instalador do repositório firstrunou algo assim,

então corra

 puppetd --tags firstrun

e executaria apenas os módulos / instruções correspondentes à tag.

Tom O'Connor
fonte
Era exatamente isso que eu procurava - obrigado Tom!
Jon Haddad
3

A principal coisa que você precisa usar é a palavra-chave require - "Avalie uma ou mais classes, adicionando a classe necessária como uma dependência".

Um exemplo usando um repositório apt pode ser:

class installcustompackages {
   # make sure we have the repository file and public key
   file { "/etc/apt/sources.list.d/myrepo.list":
      source => "puppet://puppet/files/etc/apt/sources.list.d/myrepo.list",
      ensure => present;
          "/etc/apt/trusted.gpg":
      source => "puppet://puppet/files/etc/apt/trusted.gpg",
   }

   # do an update whenever the list or trusted key file change
   exec { "/usr/bin/apt-get update":
      alias => "aptgetupdate",
      require => [ File["/etc/apt/sources.list.d/myrepo.list"], File["/etc/apt/trusted.gpg"] ],
      subscribe => [ File["/etc/apt/sources.list.d/myrepo.list"], File["/etc/apt/trusted.gpg"] ],
      refreshonly => true;
   }

   package { "mypackage":
      ensure => latest,
      require => Exec["aptgetupdate"];
             "mypackage2":
      ensure => latest,
      require => Exec["aptgetupdate"];
   }

   service { "myservice":
      enable => false,
      require => Package[mypackage];
   }
}

(Adaptado deste exemplo de inicialização de fantoche ).

Assim, você pode ver como cada estágio exige que o anterior seja realizado primeiro. Deixarei você descobrir como aplicar isso ao yum, pois não estou familiarizado com o local em que ele armazena seus arquivos.

Hamish Downer
fonte
0

O Puppet lê a configuração de cima para baixo, portanto, se você incluir uma classe com o repositório yum primeiro nessa classe, esse repositório será adicionado antes de qualquer outra coisa.

Se você usar as configurações requeridas em um pacote, garantirá que o tipo de recurso necessário esteja presente antes de adicionar o pacote, como tal:

node 'yournode.domain.com' {
   package { "bar": ensure => installed, require => Yumrepo["IUS"] }
   yumrepo { "IUS":
      baseurl => "http://dl.iuscommunity.org/pub/ius/stable/$operatingsystem/$operatingsystemrelease/$architecture",
      descr => "IUS Community repository",
      enabled => 1,
      gpgcheck => 0
   }
}

Este código acima adicionará o repositório antes de adicionar o pacote.

rasgou-
fonte
10
O Puppet usa uma linguagem declarativa, portanto, não se preocupa com a ordem das coisas no arquivo. Seu primeiro parágrafo está errado, eu tenho medo. A maneira correta de fazer isso é usar a requirepalavra - chave, que você fez na segunda parte.
Hamish Downer
0

Algo assim funcionou para mim:

yumrepo { A:
  descr    => "A repo",
  baseurl  => '',
  enabled  => 1,
  gpgcheck => 1,
  gpgkey   => "",
  priority => 3
}

yumrepo { B:
  descr    => "B repo",
  baseurl  => '',
  enabled  => 1,
  gpgcheck => 1,
  gpgkey   => "",
  priority => 3
}

yumrepo { C:
  descr    => "C repo",
  baseurl  => '',
  enabled  => 1,
  gpgcheck => 1,
  gpgkey   => "",
  priority => 3;
}

Package {
  require => [Yumrepo[A], Yumrepo[B], Yumrepo[C]]
}

Incluí algo assim no mysite.pp. Dessa forma, seus módulos fantoches estão livres de referências a yum repos.

Oscar Montoya
fonte