puppet file_line: usuwa linię z nieznaną liczbą białych znaków

0

Chciałbym usunąć linię z sudoers. Wszystko działa dobrze, o ile podam dokładną linię. Ale na niektórych komputerach mogą występować różnice w białych znakach. Nie można znaleźć obejścia nawet z „dopasowaniem”.

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

Jakieś pomysły? Dzięki, Acki

Acki
źródło

Odpowiedzi:

2

Nie użyłbym ensure => absenttutaj, ponieważ pozwala tylko na dokładne dopasowanie. Prostym, ale skutecznym obejściem byłoby użycie komentarza (lub pustego) linewraz z matchwyrażeniem regularnym do wyszukania w celu zamiany:

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

Spowodowałoby to wprowadzenie, linenawet jeśli matchnie ma go w pliku, ale ponieważ treść nie jest dostępna, nie powinna powodować żadnych poważnych problemów. Uważaj, aby uniknąć znaków specjalnych wyrażeń regularnych w matchwierszu.

syneticon-dj
źródło
1

file_line to „ok” zasób zapewniający, że linie pojawiają się w pliku, ale nie tak dobry, aby upewnić się, że nie ma tam linii - dlatego całkowicie przestałem go używać.

Jeśli naprawdę potrzebujesz zarządzać tym fragmentarycznym plikiem i musisz upewnić się, że linia całkowicie zniknęła, zasoby augeas osiągną to znacznie lepiej. Jest to dość skomplikowane, ale działa naprawdę dobrze. I powinien już być obiektyw dla pliku sudoers.

Ale lornix ma rację. Nie powinieneś zarządzać tym plikiem w ten sposób. Jest pełen niebezpieczeństw i są tutaj potwory.

Preferuj szablony i dołączaj pliki.

Aby jednoznacznie odpowiedzieć na twoje pytanie: Nie możesz. Jedno spojrzenie na kod źródłowy file_line pokazuje, że szuka on tylko dokładnego dopasowania - białe znaki i wszystko.

  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
Rojs
źródło
0

Umieść informacje o użytkowniku w nowym pliku, umieść ten nowy plik w /etc/sudoers.d

Aby uzyskać szczegółowe informacje, zobacz stronę podręcznika sudoers. (Najczęściej obserwuj tylko, że nazwa pliku w /etc/sudoers.d nie może zawierać „~” ani a. ”. Więc john_doe jest dobry, a john.doe jest zły)

To całkowicie usunie trudności, jakie masz, próbując dokładnie dopasować wpisy w pliku. Wiele usług ma podkatalogi? .D, aby to ułatwić. (cron.d, sysctl.d, /etc/modprobe.d, ... i tak dalej)

lornix
źródło
1
Przepraszam, ale moje pytanie dotyczy bardziej marionetki i linii_pliku. Muszę usunąć wpis! Twoja odpowiedź tak naprawdę nie pomaga.
Acki
0

Oto interesujące rozwiązanie.

file_line { 'sudoers-myuser':
          ensure => 'absent',
          path   => '/etc/sudoers',
          match  => 'myuser.*ALL=NOPASSWD:/bin/su.*-',
          match_for_absence => true,
}

Uwaga: z jakiegoś powodu, jeśli chcemy usunąć wpis oparty na „dopasuj”, „zamień” musi być fałszywe.

Objaśnienie (najlepiej, co mogę zaoferować):

  • linia_pliku nie pozwala na RegEx w parametrze linii, tylko w parametrze dopasowania.
  • Zwykle „linia” jest wymagana, ale match_for_absence eliminuje potrzebę „linii”.
  • W dokumentacji czytamy:
    • match_for_absence(domyślnie: false )

      Opcjonalna wartość określająca, czy należy zastosować dopasowanie, gdy brak => nieobecność. Jeśli ustawiono wartość true i dopasowano, wiersz pasujący do dopasowania zostanie usunięty.

  • Jeśli musisz usunąć wiele dopasowań tego samego RegEx, dodaj ten parametr:
    multiple => true,

Więcej informacji tutaj: file_line nie może usunąć wierszy przez wyrażenie regularne?

Scottie H.
źródło
(1) Czy „odkryłeś” to, myśląc i eksperymentując, czy gdzieś to przeczytałeś? Jeśli gdzieś to czytasz, musisz to powiedzieć i wskazać źródło. Łączenie z dokumentem źródłowym i powiedzenie „Więcej szczegółów tutaj” nie jest wystarczające; musisz powiedzieć , że skopiowałeś stamtąd swoją odpowiedź. (2) Podobnie powołując się na dokumentację, należy podać link do dokumentacji. (Jeśli masz lepsze źródło informacji o match_for_absence, dodaj je.) (3) Ponieważ celem jest dopasowanie białych znaków, prawdopodobnie ­ *raczej powinieneś użyć  (spacja + gwiazda) .*.
Scott
1
Nawiasem mówiąc, zauważyłem, że Twój profil użytkownika zawiera literówkę: „Słowa z kamery później”
Scott
Jest to połączenie obu tych elementów. Przeczytałem link, który opublikowałem, i sam przeprowadziłem eksperymenty. Odpowiedź, którą opublikowałem, jest moją własną odpowiedzią na coś, co robiłam.
Scottie H