Posso fazer com que o Puppet se inscreva em um diretório para que as alterações em qualquer arquivo acionem um recarregamento do serviço?

2

Temos uma classe base 'nginx', e as classes dos nós incluem essa classe base e adicionam seus arquivos de configuração em /etc/nginx/conf.d

Eu gostaria que o serviço nginx se inscrevesse em /etc/nginx/conf.d em um único local, para que as pessoas que escrevem as classes dos nós não precisem se lembrar de adicionar notify => Service['nginx'] . Eu tentei usar este código Puppet abaixo, mas ele não funcionou (ou seja, depois que eu modifiquei o application.conf, o serviço nginx não foi recarregado).

Isso é possível?

modules / nginx / init.pp

class nginx {
  package { 'nginx':
    ensure => installed,
  }

  service { 'nginx':
    ensure     => running,
    enable     => true,
    hasstatus  => true,
    hasrestart => true,
    require    => Package['nginx'],
    subscribe  => File['/etc/nginx', '/etc/nginx/conf.d'],
  }

  file { ['/etc/nginx', '/etc/nginx/conf.d']:
    ensure  => directory,
    owner   => application,
    group   => application,
    recurse => true,
  }
}

modules / application / init.pp

class application {    
  file {'/etc/nginx/conf.d/application.conf': 
    ensure  => present,
    owner   => application,
    group   => application,
    source  => 'puppet:///modules/application/application.conf',
    require => Package['nginx'],
  }
}
    
por Daniel Serodio 08.07.2013 / 23:28

3 respostas

2

Com o Puppet, descobri que, se o que você está fazendo não funcionar imediatamente, você provavelmente está tentando fazer algo que não deveria. Neste caso, você provavelmente não quer que cada site individual simplesmente solte um arquivo de configuração em nginx / conf.d. Em vez disso, você deseja criar um recurso definido que represente um vhost nginx. Dentro desse recurso você tomaria o cuidado de soltar o arquivo de configuração correto em conf.d e notificar o serviço nginx.

Uma vantagem em fazer isso é que você pode padronizar toda a configuração que você precisa. Por exemplo, a maioria dos sites nginx precisará de gzip. Digamos que você esqueça isso, você prefere fazer essa alteração no seu modelo padrão ou precisa encontrar todas as configurações definidas do nginx para alterar? Ou digamos que outra vulnerabilidade seja encontrada nas cifras usadas para HTTPS. Com uma configuração nginx padrão, esse é um lugar onde você precisa alterá-lo. Com cada aplicativo soltando seu próprio arquivo de configuração, você estará alterando-o em todos os lugares.

    
por 17.07.2013 / 04:29
1

Se você precisar abstrair a funcionalidade comum em algo reutilizável, sua melhor opção é criar um tipo definido. Algo como isso deve funcionar:

define nginx::config_fragment (
  $group,
  $owner,
  $source,
) {
  file { "/etc/nginx/conf.d/${title}.conf":
    ensure => 'file',
    group  => $group,
    owner  => $owner,
    source => $source,
  }
}

Em seguida, no seu site.pp , defina um padrão no seu tipo de recurso:

Nginx::Config_fragment {
  group  => 'application',
  owner  => 'application',
  notify => Service['nginx'],
}

O file notificará o tipo definido em anexo sempre que uma atualização for acionada, que então agendará um recarregamento no serviço nginx.

    
por 17.07.2013 / 03:56
0

Não tenho certeza se isso funcionaria, mas que tal criar um executável simples que gere um único arquivo baseado no conteúdo do diretório monitorado, inscreva-se nesse arquivo e acione sua reinicialização ...

por exemplo:

class nginx {
  package { 'nginx':
    ensure => installed,
  }

  service { 'nginx':
    ensure     => running,
    enable     => true,
    hasstatus  => true,
    hasrestart => true,
    require    => Package['nginx'],
    subscribe  => File['/etc/nginx', '/etc/nginx/conf.d'],
  }

  file { ['/etc/nginx', '/etc/nginx/conf.d']:
    ensure  => directory,
    owner   => application,
    group   => application,
    recurse => true,
  }


  exec { "/tmp/nginx-config-checksum":
    path    => "/usr/local/bin/:/bin:/usr/sbin",
    command => 'find /etc/nginx/conf.d | xargs md5sum > /tmp/nginx-config-checksum',
  }
  file { "/tmp/nginx-config-checksum"        
    notify  => Service['nginx']
  }
}
    
por 17.07.2013 / 00:41

Tags