Naprawianie usług, które zostały wyłączone w / etc / default / with puppet?

13

Korzystam z marionetki, aby (teoretycznie) uruchomić npcd podczas instalacji, jednak w Ubuntu ta usługa jest instalowana z domyślnym ustawieniem w / etc / default / npcd z RUN = "no":

 $ cat /etc/default/npcd 
 # Default settings for the NPCD init script.

 # Should NPCD be started? ("yes" to enable)
 RUN="no"

 # Additional options that are passed to the daemon.
 DAEMON_OPTS="-d -f /etc/pnp4nagios/npcd.cfg"

Myślałem, że ten blok konfiguracji lalek załatwi sprawy:

    service { "npcd":
       enable   => true,
       ensure   => "running",
       require  => Package["pnp4nagios"],
    }   

Ale niestety tak nie jest, a właściwie przepisywanie pliku w / etc / default, nie jestem pewien, co robić. Czy istnieje prosty sposób włączenia usługi, której nie widzę?

Dla przypomnienia używam Ubuntu 12.04.2 i wersji marionetkowej 3.1.0.

Matt Simmons
źródło
Dlaczego nie po prostu przepisać /etc/default/npcdz filezasobu? fileZależy od packagei servicezależy od file. Zawsze jestem ostrożny w edytowaniu plików za pośrednictwem sedlub augeasjeśli mogę tego uniknąć.
larsks

Odpowiedzi:

12

Aktualizacja tego pliku, a następnie ponowne uruchomienie usługi to jedyny sposób. Możesz wcisnąć nowy plik, a następnie ustawić usługę Wymagaj tego; w ten sposób po zaktualizowaniu zawartości usługa uruchomi się poprawnie.

Jeśli nie chcesz całkowicie zamieniać pliku, możesz użyć narzędzia Puppet augeas, aby po prostu zmodyfikować pojedynczą linię w pliku domyślnym.

W Debianie i jego pochodnych jest kilka usług, które nie uruchamiają się automatycznie po zainstalowaniu pakietu, chyba że są włączone w / etc / default. Trochę irytujące.

Edycja: FYI skrypt init w rzeczywistości odczytuje wartości z tego pliku (zwykle po prostu go pozyskuje).

Łukasz
źródło
1
Ciekawy. Mam ochotę zgłosić błąd. Jeśli ustawisz „enable” na „true”, ma to sens tylko, że w rzeczywistości włącza skrypt (oprócz różnych linków symbolicznych do uruchamiania poziomów).
Matt Simmons,
Myślę, że nie ma łatwego sposobu, aby Puppet wiedział, czy usługa będzie potrzebowała zaktualizować plik „defaults”, aby go nie wkleić; może być łatwiej zgłosić błąd w dystrybucji. Wątpię jednak, czy dostaniesz przyczepność :-)
Luke
użyj zdefiniowanego typu o nazwie coś takiego jak „defaulted_service”, który ma zasób usługi, a także zasób exec, który aktualizuje plik w miejscu za pomocą sed, jeśli to konieczne, lub zasób pliku, który używa augeas, zależnie od ciebie.
Sirex,
@MattSimmons Ludzie tworzący te pakiety powinni korzystać z dowiązań symbolicznych oraz update-rc.ddo włączania / wyłączania usługi, a nie /etc/default- to nie jest standardowy sposób zarządzania usługami, więc nie można tego kontrolować.
Shane Madden
8

Do diabła z tym sprawdziłem kilka standardowych demonów na moich komputerach 12.04. Musisz zarządzać plikiem, w żadnym momencie nie można go obejść.

snmpd

# snmpd control (yes means start daemon).
SNMPDRUN=yes

zebrane

# 0: start collectd on boot, 1: do not start collectd on boot
# default: 0
DISABLE=0

marionetka

# Start puppet on boot?
START=yes

mdadm

# START_DAEMON:
#   should mdadm start the MD monitoring daemon during boot?
START_DAEMON=true

haproksy

# Set ENABLED to 1 if you want the init script to start haproxy.
ENABLED=1
kashani
źródło
6

Myślę, że jednym z możliwych sposobów, aby to zrobić, jest użycie narzędzia augeas z marionetką, np

augeas { "npcd_default":
  changes => [
    "set /files/etc/default/npcd/Run yes",
  ],
}

szczegółowe informacje można znaleźć w instrukcji obsługi

DukeLion
źródło
0

Używam sed do modyfikacji pliku. Augeas wydaje się przesadą.

sed -i /etc/default/puppet -e 's/START=no/START=yes/'

Pomysł zaczerpnięty stąd:

http://www.codelord.net/2010/12/19/using-puppet-to-automatically-configure-new-ec2-instances/

Więc w twoim przypadku

sed -i /etc/default/npcd -e 's/RUN="no"/RUN="yes"/'
dmourati
źródło
1
jeśli uważasz, że augeas to przesada, czy marionetka też nie jest przesada? :) Twoje rozwiązanie jest również w porządku, ale zakładasz, że masz plik i potrzebujesz go w wierszu, więc co, jeśli go nie ma? po prostu zawiedzie, nie mówiąc ci nic. Uważam, że augeas jest tak solidny, wygodny i celowy, że warto go zainstalować, jeśli używasz marionetki
DukeLion
Mój przykład pochodzi z ładowania marionetki przez chmurę-inicjację. Spojrzałem na augeas i od razu postanowiłem go unikać, jeśli to w ogóle możliwe. Do tej pory nie potrzebowałem augeas ani nie musiałem uruchamiać innej usługi oprócz marionetki, aby rozpocząć = tak.
dmourati,
Jestem naprawdę ciekawy twojego punktu widzenia. Rozumiem, o co ci chodzi, ale czy augeas i marionetka nie stosują tej samej ideologii zapewniania abstrakcyjnego interfejsu najwyższego poziomu dla zunifikowanego zarządzania? Więc jeśli nie lubisz augeas, dlaczego lubisz marionetkę? Dlaczego więc nie odpowiadasz?
DukeLion,
Wydaje mi się, że lepszym rozwiązaniem jest edytowanie plików konfiguracyjnych kodu pośredniczącego lub fragmentów, takich jak apache conf.d, sysctl.d, sudoers.d itp. Próbowanie przekopania się przez inne pliki konfiguracyjne po prostu mnie nie lubią. W najprostszym przypadku, gdy nie istnieją pofragmentowane pliki konfiguracyjne z katalogami .d, użyj sed / perl / cokolwiek. Dlatego nie ma potrzeby augeas.
dmourati,
0

Robienie tego z augeastypem w Puppet jest jednym ze sposobów (jak sugeruje @DukeLion).

Innym sposobem jest użycie augeasprovidersmodułu z shellvardostawcą:

shellvar { 'npcd_default':
  ensure   => present,
  target   => '/etc/default/npcd',
  variable => 'RUN',
  value    => 'yes',
  comment  => 'We want npcd to run',
}

Jest to lepsze, ponieważ Augeas będzie używany wyłącznie przez dostawcę Ruby. Będzie również automatycznie zarządzać cytowaniem i komentowaniem.

Inkaphink
źródło