puppet: pare o serviço antes de sobrescrever o arquivo

3

Eu tenho a seguinte configuração simplificada:

file {
  '/etc/foo.conf':
    ensure  => file,
    content => epp('my_module/etc/foo.conf.epp'),
  ;
}

service {
  'foo':
    ensure    => running,
    enable    => true,
    subscribe => File['/etc/foo.conf'],
  ;
}

Quando eu atualizo o modelo, o fantoche sobrescreve /etc/foo.conf e depois reinicia o serviço.

Meu problema é que eu preciso parar o serviço antes sobrescrevendo o arquivo porque quando o serviço está parando ele escreve de volta a configuração que ele tem na memória para o arquivo.

Existe uma maneira de fazer isso com fantoches?

    
por skualito 10.11.2017 / 10:28

2 respostas

4

Dê uma olhada no módulo de transição . Com isso, você pode fazer algo assim:

transition { 'stop foo service':
  resource   => Service['foo'],
  attributes => { ensure => stopped },
  prior_to   => File['/etc/foo.conf'],
}

file { '/etc/foo.conf':
  ensure  => file,
  content => epp('my_module/etc/foo.conf.epp'),
}

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

Não é necessário exec .

    
por 10.11.2017 / 19:20
2

Você poderia fazer algo assim:

file { '/etc/foo.conf.tmp':
  ensure  => file,
  content => epp('my_module/etc/foo.conf.epp'),
}

exec { 'stop service':
  command => 'service foo stop',
  refreshonly => true,
  subscribe => File['/etc/foo.conf.tmp']
}

exec { 'update file':
  command => 'cp /etc/foo.conf.tmp /etc/foo.conf',
  subscribe => Exec['stop service'],
  refreshonly => true,
}

exec { 'start service':
  command => 'service foo start',
  subscribe => Exec['update file'],
  refreshonly => true,
}

O atributo refreshonly do recurso exec garantirá que o comando só seja executado quando receber um evento, neste caso por meio do atributo subscribe . Nesse caso, ele só irá parar o servidor e copiar no novo arquivo de configurações quando o arquivo de configurações do tmp for alterado. O arquivo tmp permitirá que você gerencie suas configurações no servidor sem que o serviço seja sobrescrito.

Você pode combinar esses três exec s em um único comando, como

file { '/etc/foo.conf.tmp':
  ensure  => file,
  content => epp('my_module/etc/foo.conf.epp'),
}

exec { 'update settings':
  command => 'service foo stop && cp /etc/foo.conf.tmp /etc/foo.conf && service foo start',
  refreshonly => true,
  subscribe => File['/etc/foo.conf.tmp']
}
    
por 10.11.2017 / 19:11

Tags