É possível notificar um recurso File [] no Puppet e acionar recursos inscritos nesse arquivo?

2

Estamos usando o Puppet para gerenciar uma instalação do OpenStack. Pilha aberta consiste em um número de peças fracamente conectadas, todas se comunicando via AMQP. Várias das partes usam um arquivo de configuração comum ( /etc/nova/nova.conf ), portanto, um recurso de serviço típico parece isso:

service { 'openstack-nova-network':
  ensure    => running,
  enable    => true,
  subscribe => File['/etc/nova/nova.conf'],
}

Isso tudo funciona muito bem.

Agora, estamos usando o Puppet para instalar um hotfix em alguns dos recursos subjacentes Código Python. Quando substituímos um dos arquivos de origem do Python, gostaria de reiniciar os serviços que fazem uso dele. Em geral, isso é exatamente o mesmo conjunto de serviços que são assinados /etc/nova/nova.conf .

Eu estava esperando que eu pudesse fazer isso aproveitar o existente dependências notificando o arquivo, assim ...

file { '/path/to/some/file':
  source => 'puppet:///.../',
  notify => File['/etc/nova/nova.conf'],
}

... mas isso não parece funcionar. Além de colocar em explícito notify entradas para cada serviço, existe uma maneira melhor de fazer isso?

UPDATE

Você sabe, estou começando a suspeitar que minha pergunta não estava totalmente clara. Gostaria de pedir desculpas pela confusão e tentar tornar meu pedido um pouco mais explícito:

Sei que posso fazer isso com um conjunto de dependências explícitas, como valores subscribe nos serviços ou valores notify nos arquivos instalados. O problema é que isso significa manter uma matriz M * N de dependências. Introduzir um novo arquivo significa:

  • Atualizando M service resources ou
  • Atualizando N file resources

Esse tipo de trabalho repetitivo de copiar e colar é propenso a erros, especialmente quando várias pessoas são responsáveis pela configuração.

Uma opção seria manter uma lista central de serviços:

$services = [ service1, service2, service ]

Porque então eu poderia fazer isso:

file { '/usr/lib/python/glance/notifier/notify_qpid.py':
  notify => Service[$services],
}

Mas isso não vai funcionar, porque a lista de serviços é diferente em hosts diferentes. Possivelmente eu posso virar isso e manter uma lista de arquivos "hotfix":

$hotfix_files = [
  '/usr/lib/python2.6/site-packages/glance/notifier/notify_qpid.py',
  '/root/puppet/modules/openstack/files/nova/impl_qpid.py',
]

Em seguida, atualize todas as definições de serviço uma vez:

service { 'openstack-nova-network':
  ensure    => running,
  enable    => true,
  subscribe => [
    File['/etc/nova/nova.conf'],
    File[$hotfix_files],
  ]
}

Mas isso ainda requer a manutenção manual da lista de arquivos modificados.

O que eu realmente quero fazer é dizer "notificar todos os serviços que estão inscritos em /etc/nova/nova.conf ".

    
por larsks 02.08.2012 / 18:48

3 respostas

6

A principal coisa que você está depois, "notificar todos os serviços que estão inscritos no /etc/nova/nova.conf", não parece ser possível com file -resources. Mas funciona com exec -resources, com refreshonly -parameter. (Apenas testei configuração similar com Puppet 2.7.11 ). Você deve adicionar um fictício exec -resource:

exec {'dummy-nova-refresh':
    command     => "/bin/true",
    refreshonly => true,
}

Quando o comando é executado, exec envia uma notificação a todos os seus assinantes. E refreshonly -parameter garante que o comando seja executado somente na atualização.

Subscreva todos os serviços para este Exec:

service { 'openstack-nova-network':
    ensure    => running,
    enable    => true,
    subscribe => Exec['dummy-nova-refresh'],
}

E use notificar de todos os recursos de arquivo. (Faça isso também para /etc/nova/nova.conf ou especifique-o na lista de assinaturas para cada service ):

file { '/path/to/some/file':
    source => 'puppet:///.../',
    notify => Exec['dummy-nova-refresh'],
}

E pronto. Uma alteração em qualquer arquivo aciona uma atualização em todos os serviços inscritos em 'dummy-nova-refresh' .

    
por 04.08.2012 / 00:51
0

Não sou especialista em nenhuma das duas tecnologias, mas acho que você precisa assinar o serviço que deseja reiniciar no arquivo substituído. Algo como:

  configfile { "/etc/httpd/conf/httpd.conf":
    source => "/httpd/httpd.conf",
    mode => 644,
  }

  service { httpd:
    running => true,
    subscribe => file["/etc/httpd/conf/httpd.conf"]
  }

Não tenho certeza se essa sintaxe está escrita corretamente, mas espero que você entenda a ideia.

    
por 02.08.2012 / 19:00
0
service { 'openstack-nova-network':
  ensure    => running,
  enable    => true,
  subscribe => [
               File['/etc/nova/nova.conf'],
               File['/path/to/some/file'],
               ],
}

Isso deve funcionar.

    
por 02.08.2012 / 19:16

Tags