puppet file_line: remove a linha com um número desconhecido de espaços em branco

0

Gostaria de remover uma linha dos sudoers. Tudo funciona bem contanto que eu dê a linha exata. Mas pode haver diferenças no espaço em branco em algumas máquinas. Não foi possível encontrar uma solução alternativa mesmo com "correspondência".

file_line { '/etc/sudoers':
          ensure => absent,
          path   => '/etc/sudoers',
          line   => 'myuser  ALL=NOPASSWD:/bin/su -', }

Alguma ideia? obrigado Acki

    
por Acki 26.05.2014 / 15:35

4 respostas

2

Eu não usaria ensure => absent aqui, pois isso permite apenas uma correspondência exata. Uma solução simples, mas eficaz, seria usar um comentário (ou vazio) line junto com um match regex para procurar substituir:

file_line { 'sudoers-myuser':
          path   => '/etc/sudoers',
          line   => '# myuser  ALL=NOPASSWD:/bin/su -', 
          match  => 'myuser.*ALL=NOPASSWD:/bin/su.*-',
}

Isso introduziria line mesmo se o match não estivesse presente no arquivo, mas como o conteúdo não é um op, ele não deve apresentar problemas sérios. Tenha cuidado para escapar caracteres especiais regex na linha match .

    
por 09.06.2015 / 17:14
1

file_line é um recurso "ok" para garantir que as linhas apareçam em um arquivo, mas não tão boas para garantir que as linhas não estejam lá - e é por isso que parei completamente de usá-lo.

Se você realmente precisa gerenciar este arquivo aos poucos e precisa garantir que a linha esteja totalmente resolvida, os augeas recurso irá realizar muito melhor. É bastante complicado, mas faz o trabalho muito bem. E já deve haver uma lente para o arquivo sudoers.

Mas o lornix está correto. Você não deveria estar gerenciando este arquivo dessa maneira. Está carregado de perigos e existem monstros aqui.

Prefira modelos e inclua arquivos.

Para responder à sua pergunta explicitamente: você não pode. Uma olhada no código-fonte para file_line mostra que ele só procura uma correspondência exata - espaço em branco e tudo mais.

  def destroy
    local_lines = lines
    File.open(resource[:path],'w') do |fh|
      fh.write(local_lines.reject{|l| l.chomp == resource[:line] }.join(''))
    end
  end
    
por 01.06.2014 / 19:00
0

Aqui está uma solução interessante que acabei de descobrir. Postando como uma resposta para qualquer um no futuro que possa se beneficiar dele.
file_line { 'sudoers-myuser': ensure => 'absent', path => '/etc/sudoers', match => 'myuser.ALL=NOPASSWD:/bin/su.-', match_for_absence => true, }

Observação: por algum motivo, se quisermos remover uma entrada com base em "correspondência", "substituir" deve ser falso.

Explicação (o melhor que posso oferecer).
file_line não permite um RegEx no parâmetro de linha, apenas no parâmetro de correspondência.

Normalmente, 'line' é obrigatório, mas match_for_absence elimina a necessidade de 'line'.

A documentação declara "match_for_absence: um valor opcional para determinar se a correspondência deve ser aplicada quando assegure = > ausente. Se definido como verdadeiro e a correspondência estiver definida, a linha que corresponde à correspondência será excluída."

Se você precisar remover várias correspondências do mesmo RegEx, adicione este parâmetro:% multiple => true,

mais detalhes aqui file_line não pode excluir linhas por regexp?

    
por 16.05.2019 / 01:12
0

Coloque as informações do usuário em um novo arquivo, coloque este novo arquivo em /etc/sudoers.d

Veja a página de manual do sudoers para maiores detalhes. (Na maioria das vezes apenas observe que o nome do arquivo em /etc/sudoers.d não pode conter '~' ou a '.'. Então john_doe é bom, enquanto john.doe é ruim)

Isso removerá completamente a dificuldade que você está tendo, tentando corresponder exatamente as entradas em um arquivo. Muitos serviços possuem subdiretórios .d para facilitar isso. (cron.d, sysctl.d, /etc/modprobe.d, ... e assim por diante)

    
por 27.05.2014 / 15:17

Tags