Puppet não ignora espaço em branco

0

Eu tenho uma entrada que pode ou não aparecer em /etc/rsyslog.conf :

# Added for Kiwi
*.err;*.emerg;*.alert;*.warning;*.debug;*.notice;*.crit;*.info          @10.19.24.50

Como alguns desses servidores precisariam ser digitados manualmente, não posso presumir que o espaço em branco seja uniforme (e isso varia em pelo menos dois servidores que encontrei). Estou tentando escrever um módulo de fantoches para remover essas linhas.

Segmento relevante desse módulo:

  file_line {'remove_kiwi_comment':

    ensure => absent,
    path   => $confFile,
    match  => "^#.*Kiwi$",
    line   => "# Added for Kiwi",
    match_for_absence => true,

  }

  file_line {'remove_kiwi_forward2':

    ensure => absent,
    match_for_absence => true,
    path   => $confFile,
    match  => '^.*50$',
    line   => '*.err;*.emerg;*.alert;*.warning;*.debug;*.notice;*.crit;*.info @10.19.24.50',
    notify => Service[$serviceName],

  }

O item acima consegue remover o comentário de um dos servidores DEV, mas o redirecionamento real não parece ser removido. Eu brinquei com o regexp em match=> sem sucesso e não tenho certeza do que mais posso tentar para deletar a linha. Se eu adicionar espaços suficientes, ele será removido, mas não quero que meu módulo assuma qualquer quantidade de espaço em branco, apenas que haja uma quantidade de espaço em branco presente para que o rsyslog seja carregado.

A versão do módulo Stdlib é 4.11, master é 3.3, o nó cliente deste servidor é 3.6

    
por Bratchley 14.04.2016 / 22:18

3 respostas

0

Depois de pesquisar um pouco mais, descobri que file_line é mais ou menos uma tentativa de melhor esforço no gerenciamento de arquivos de configuração não invasivos. Havia muitas outras pessoas fazendo queixas semelhantes às minhas. O consenso geral parece ser usar file_line quando você quer fácil ler módulos de marionetes, mas prenda-se ao primeiro sinal de problema e comece a usar Augeas para todo o resto

A versão final do meu módulo de fantoches temporário:

class kiwiprep {

  if ($::syslogng == "ABSENT"){

    case $::operatingsystemmajrelease {

      /^5/: {

        $serviceName="syslog"
        $confFile="/etc/syslog.conf"

      }

      /^(6|7)/: {

        $serviceName="rsyslog"
        $confFile="/etc/rsyslog.conf"

      }

      default:{
        fail("Platform Not Supported")
      }

    }

    service {$serviceName:
      ensure => running,
      enable => true,
    }

    file_line {'remove_kiwi_comment':

      ensure => absent,
      path   => $confFile,
      match  => "^#.*Kiwi$",
      line   => "# Added for Kiwi",
      match_for_absence => true,

    }

    augeas {"kiwi forwarder 1":
      context => "/files$confFile",
      changes => ["rm *[descendant::hostname = '10.19.24.50']"],
    }

    augeas {"kiwi forwarder 2":
      context => "/files$confFile",
      changes => ["rm *[descendant::hostname = '10.18.104.50']"],
    }


  }

}

(você notará que isso é específico do RHEL, alternações precisariam ser feitas para o SUSE ou Debian)

Como você pode ver, meu módulo final manteve o file_line para o comentário, o que funciona bem para mim. Então, reverti para augeas para remover qualquer objeto de nível superior que tivesse um descendente chamado hostname cujo valor fosse o mesmo de um dos meus encaminhadores. Este módulo funcionou perfeitamente para mim quando se trata de limpar o ambiente. Em seguida, voltarei a usar file_line para adicionar os novos encaminhadores, agora que eu limpei o antigo.

    
por 25.04.2016 / 18:47
0

O tipo file_line tem uma opção posterior que deve funcionar para você. O único problema será que você precisa garantir que a regra seja removida antes do comentário.

file_line {'remove_kiwi_comment':
    ensure => absent,
    path   => $confFile,
    match  => '^#.*Kiwi$',
    line   => '# Added for Kiwi',
    match_for_absence => true,
}

file_line {'remove_kiwi_forward2':
    ensure => absent,
    path   => $confFile,
    line   => '# Added for Kiwi',
    after  => '^#.*Kiwi$',
    before => File_line['remove_kiwi_comment'],
    notify => Service[$serviceName],
}

Se você não pode confiar que o comentário estará no arquivo, a solução mais simples que posso imaginar é usar exec com sed .

exec { 'remove-kiwi-rsyslog-line-with-sed':
    command => "sed -i '/@10\.19\.24\.50$/d' $confFile",
    path    => '/usr/bin:/bin',
    onlyif  => "grep -q '@10.19.24.50$' $confFile",
}

Isso só executará o exec se o endereço IP 10.19.24.50 estiver no arquivo.

    
por 18.04.2016 / 19:49
0

Para excluir a linha de redirecionamento, tente usar essa,

file_line {'remove_kiwi_forward2':

    ensure => absent,
    match_for_absence => true,
    path   => $confFile,
    match  => '^.*50$',
    line   => '\*.err;\*.emerg;\*.alert;\*.warning;\*.debug;\*.notice;\*.crit;\*.info.*@10.19.24.50',
    notify => Service[$serviceName],
}
    
por 22.04.2016 / 08:17