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.
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.
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.
(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
}
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];
}
}
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.
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:
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.
Respostas:
Se você deseja garantir que um repositório esteja instalado em todo o servidor, sugiro algo como isto
Então, para qualquer nó que se estenda,
base
você pode dizerIsso garantirá que
bar
não será instalado, a menos que o repositório IUS esteja definidofonte
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.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.
fonte
(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":
Em seguida, você atribui o estágio às classes. Você pode fazer isso corretamente na sua definição de nó:
fonte
Você pode usar tags . Isso permitirá que você marque o instalador do repositório
firstrun
ou algo assim,então corra
e executaria apenas os módulos / instruções correspondentes à tag.
fonte
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:
(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.
fonte
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:
Este código acima adicionará o repositório antes de adicionar o pacote.
fonte
require
palavra - chave, que você fez na segunda parte.Algo assim funcionou para mim:
Incluí algo assim no mysite.pp. Dessa forma, seus módulos fantoches estão livres de referências a yum repos.
fonte