Puppet: crie serviço antes do arquivo, mas notifique o serviço se o arquivo for alterado

5

Eu quero que o arquivo "run" seja criado após o serviço nginx, mas também quero notificar o Service nginx se houver mudanças na execução do arquivo. Notificar implica que ele é executado ANTES de nginx.

O caso de uso é o seguinte. Usamos dj bernsteins daemontools para gerenciar o nginx. Como precisamos fazer algumas etapas (criando o / etc / service, adicionando os arquivos de execução ...), criamos um tipo definido que faz essas coisas. Agora nós não queremos que nosso módulo nginx tenha qualquer conexão com o módulo daemontools, é por isso que nós não queremos assinar um arquivo daemontools. Também se inscrever giraria em torno do ciclo de dependência. Estou procurando por algo como, só execute o módulo quando o módulo nginx estiver completamente terminado.

class { daemontools:
  file {'run':
    require => Service[nginx],
    notify => Service[nginx];  # <<< this wont do :(
  }
}

class { nginx: 
  service { 'nginx': }
}    

Alguma idéia?

Thomas

    
por tommics 03.04.2014 / 19:00

2 respostas

2

não foi uma tarefa fácil, já que o problema muda após a primeira execução. O problema descrito na minha pergunta só se aplica quando o servidor que tem que ser configurado é completamente novo.

Primeira execução: aguarde que todos os arquivos sejam copiados (class nginx complete) e, em seguida, coloque o arquivo de execução

Segunda corrida: use a abordagem usual de uma notificação no arquivo de execução. Desta vez, ele pode ser executado antes do serviço. isso não funciona na primeira execução.

Então resolvemos isso adicionando um arquivo "state" adicional chamado nginx-ready

então no nosso tipo definido add_daemontools.pp

  define daemontools::add_service {
      file { "/etc/service/${service}/run":
         ensure => file,
         mode    => 0755,
         owner   => root,
         group   => root,
         content => template("daemontools/service.erb"),
         path    => "/etc/service/$service/run",
         # create run file when service is ready
         require => File["/var/run/${service}-ready"],
         # notify implies before
         notify  => Service["${service}"],
      }
  }

e em nosso módulo criamos o arquivo pronto que depende de tudo que é necessário.

 class nginx ( ... params) {
    ...
     file { '/var/run/nginx-ready':
       require => [ Package[$nginx_dependencies], File[$nginx_files] ],
       before => Service['nginx'],
       content => 'ready file for daemontools',
     }
 }

Muito obrigado pela sua ajuda!

    
por 07.04.2014 / 15:52
2

Você pode tentar usar o estágios se o seu caso de uso puder lidar com o limitations .

stage { 'first':
  before => Stage['main'],
}
stage { 'last': }
Stage['main'] -> Stage['last']

class { daemontools:
  stage => last;
  file {'run':
    require => Service[nginx],
    notify  => Service[nginx];
  }
}

class { nginx: 
  stage => last;
  service { 'nginx': }
}
    
por 03.04.2014 / 22:30