Dodanie istniejącego użytkownika do grupy z marionetką

16

Czy można dodać istniejącego użytkownika do grupy z marionetką 2.7.18?

Mamy dwa moduły, każdy definiuje jedną klasę:

  • moduł „użytkownik” tworzy wszystkich użytkowników, w tym użytkownika foo i pasek użytkownika.
  • moduł „subversion” zajmuje się różnymi plikami conf i tworzy grupę svn.

Chcielibyśmy dodać użytkownika foo do grupy svn w module „subversion”.

Wypróbowałem parametr członkostwa zgodnie z opisem w istniejącym żądaniu funkcji :

group {
"svn":
    ensure  => present,
    gid     => xxxxx;
}
user {
"foo":
    group      => ["svn"],
    membership => minimum;
}

Ale pojawia się następujący błąd:

err: Nie można pobrać katalogu ze zdalnego serwera: Błąd 400 na SERWERZE: Duplikat deklaracji: Użytkownik [foo] jest już zadeklarowany w pliku /pathto/modules/subversion/manifests/init.pp w linii xx; nie można ponownie ustawić na /pathto/modules/users/manifests/init.pp:xxx w węźle myserver.example.com

Czy ta funkcja jest już zaimplementowana? Jeśli nie, czy istnieje dobre obejście?


źródło

Odpowiedzi:

15

Jeśli zadeklarujesz użytkowników jako zasoby wirtualne , możesz następnie użyć „Realizuj” lub składni kolekcji (Użytkownik <| ... |>). Oto przykład:

@user { 'foo':
  groups     => ['somegroup'],
  membership => minimum,
}

Następnie zdaj sobie sprawę z tego, że użytkownik wirtualny ma wówczas składnię kolekcji:

User <| title == foo |>

A gdzie indziej możesz dodać do parametrów tego wirtualnego zasobu za pomocą plusignment:

User <| title == foo |> { groups +> "svn" }
dotplus
źródło
Sądzę więc, że w tej chwili nie ma alternatywy oprócz wirtualnych zasobów :( Bardzo dziękuję za odpowiedź.
1
Pomiędzy wersjami Puppet zmieniono literówkę lub atrybut: nie jest to grupa, ale grupy (liczba mnoga). Korzystanie z Puppet 3.2.2
Goran Miskovic
1
czy ktoś może rozwinąć tę kwestię krótkim przykładem.
mschuett,
22

Korzystanie z wirtualnych zasobów Puppet jest właściwym sposobem, aby to zrobić - ale jeśli nie możesz zmienić definicji użytkownika i potrzebujesz w międzyczasie poprawki obejścia, poniższe działania są okropne i zhackowane, ale zadziałają:

exec { 'foo somegroup membership':
  unless  => '/bin/grep -q "somegroup\\S*foo" /etc/group',
  command => '/sbin/usermod -aG somegroup foo',
  require => User['foo'],
}

Zasadniczo sprawdzamy tylko, czy jakaś grupa zawiera jeszcze użytkownika foo ... jeśli nie, użyj zwykłych poleceń usermod, aby dodać go oprócz istniejących grup, do których należy foo.

dodokaptain
źródło
1
Marionetka może pokonać w pełni kwalifikowane ścieżki do plików wykonywalnych. Edytowane, aby to odzwierciedlić.
h7r
2
Okropny i zuchwały, ale naprawdę pomocny. Miałem nadzieję, że nie będę musiał uczyć się nowej konstrukcji języka, aby zrobić coś koncepcyjnie prostego, jak dodanie użytkownika do grupy.
BillMan
1
Być może bardziej właściwym (choć wciąż hackującym oczywiście) sposobem byłoby użycie tego, getent group somegroup|cut -d: -f4|grep -q fooaby nie zakładać, że używamy /etc/group.
falstro
Super pomocny - dzięki. Musiałem zmienić „chyba” i „usermod”, aby uwzględnić pełną ścieżkę w następujący sposób: chyba, że ​​=> / / user / bin / grep ... ”polecenie =>„ / user / bin / usermod ... ”
JNP Web Developer
W przypadku @jnpWebDeveloper i podobnych: w dokumentacji można również podać pathparametr. Sugeruję, aby mieć domyślną wartość globalnego zasobu, być może $PATHpochodzącą od faktora.
cincodenada
2

Dzięki - na pewno brzydki hack, ale wykonuje zadanie. Oto załatany przykład (łączący powyższe komentarze), aby dodać „nrpe” do grupy „nagios”. Użyłem wymaganego pakietu, ponieważ tutaj użytkownik ma RPM, a nie marionetkę.

  exec {"nrpe nagios membership":
    unless => "/bin/getent group nagios|/bin/cut -d: -f4|/bin/grep -q nrpe",
    command => "/usr/sbin/usermod -a -G nagios nrpe",
    require => Package['nrpe'],
  }
Bill McGonigle
źródło