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.
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.
Respostas:
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, base
você pode dizer
class foo {
package { "bar": ensure => installed, require => Yumrepo["IUS"] }
}
Isso garantirá que
bar
não será instalado, a menos que o repositório IUS esteja definidoEmbora 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.
(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
}
Você pode usar tags . Isso permitirá que você marque o instalador do repositório firstrun
ou algo assim,
então corra
puppetd --tags firstrun
e executaria apenas os módulos / instruções correspondentes à tag.
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.
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.
require
palavra - chave, que você fez na segunda parte.
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.