Puppet, definindo dependências

3

Estou começando a configurar o fantoche. Eu quero configurar as dependências que um agente de transferência de email deve ser instalado antes que essa classe tente instalar ou iniciar qualquer coisa. Com o fantoche, o método padrão parece definir uma dependência parece ser require blah . O desafio é que não uso o mesmo MTA em todos os meus sistemas. Alguns dos sistemas que são servidores de correio reais eu tenho um MTA completo (exim), mas a grande maioria dos meus sistemas tem instalado ssmtp. O que eu quero fazer é configurar um requisito para que qualquer um desses MTAs seja instalado e funcional antes que a classe foo seja processada.

Aqui está uma configuração que demonstra o que estou tentando fazer.

node default {
  if $fqdn in ["mail1.example.org", 
               "mail2.example.org", 
               "mail3.example.org"] {

    include fullmta  # mailhub, and so on
  } else {
    include ssmtp    # really basic send-only mta.
  }
  include foo        # class that requries an mta be installed
}

class foo {
  require MTA # FIXME, A valid mta is required.

  package { foo: ensure => present, }
  ... # also a service, and some files, and so on...
}

Então, na minha classe foo, como eu solicito que uma das classes possíveis de MTAs tenha sido processada?

    
por Zoredache 22.09.2011 / 21:16

3 respostas

4

Se você dividir a lógica do MTA em uma classe separada, poderá manipular a lógica ali - e seus recursos podem exigir que a classe MTA imponha o relacionamento de dependência.

node default {
  include mta
  include foo        # class that requries an mta be installed
}

class mta {
  if $fqdn in ["mail1.example.org", 
               "mail2.example.org", 
               "mail3.example.org"] {

    include fullmta  # mailhub, and so on
  } else {
    include ssmtp    # really basic send-only mta.
  }
}

class foo {
  package { foo: ensure => present,
                 require => Class['mta'], }
  ... # also a service, and some files, and so on...
}
    
por 22.09.2011 / 21:58
3

Use um alias. Algo parecido com isto:

service { "ssmtp":
    ...
    alias => "MTA",
}

service { "fullmta":
    ...
    alias => "MTA",
}

class foo {
    package { foo:
        ensure  => present,
        require => Service["mta"],
        ...
    }
    ...
}
    
por 22.09.2011 / 23:23
2

Você pode especificar require dependencies como arrays e, nesse caso, o Puppet garantirá que todas as dependências sejam atendidas antes de prosseguir. Nesta situação, costumo fazer algo como o seguinte:

node default {
  include mta
  include foo        # class that requries an mta be installed
}

class mta {
  if $fqdn in ["mail1.example.org", 
               "mail2.example.org", 
               "mail3.example.org"] {
    package { "conflicting-package-A": ensure => present, }
    package { "conflicting-package-B": ensure => absent, }
  } else {
    package { "conflicting-package-A": ensure => absent, }
    package { "conflicting-package-B": ensure => present, }
  }
} 

class foo {
  package { foo: ensure => present,
                 require => [Package["conflicting-package-A",
                                     "conflicting-package-B"], }
  ... # also a service, and some files, and so on...
}

Dessa forma, você não apenas garante que o pacote foo dependa explicitamente dos dois outros pacotes, mas configura as coisas para que, se você remover um host da lista mail*.example.org no futuro, "conflite -package-A "será substituído por" conflicting-package-B "automaticamente.

    
por 15.10.2011 / 10:31

Tags