opsi-admin cronjob client list

bademeister
Beiträge: 141
Registriert: 28 Feb 2014, 10:21

opsi-admin cronjob client list

Beitrag von bademeister »

Hallo alle zusammen,

ich bin etwas am Zweifeln meiner Bash-Kenntnisse. Insbesondere in Zusammenhang mit dem opsi-admin.
Das Szenario:
Ich versuche eine Liste von clients (power_clients.txt) nachts mit hostControl_start, _reboot und shutdownwanted mögliche Updates machen zu lassen.
Hier für habe ich ein Bashskript gebaut, welches wie folgt aussieht:

Code: Alles auswählen

while read line
do
       opsi-admin -d method setProductActionRequest shutdownwanted $line once
done < /var/lib/opsi/power_clients.txt
Wenn ich den Befehl mit "echo" ausgebe sieht alles sauber aus. In der live-Ausführung bekomme ich jedoch folgende Meldung:

Code: Alles auswählen

root@opsi:/usr/local/bin# ./shutdown.sh
[2] Traceback: (Logger.py|765)
[2]      line 1661 in '<module>' in file '/usr/bin/opsi-admin' (Logger.py|765)
[2]      line 355 in 'main' in file '/usr/bin/opsi-admin' (Logger.py|765)
[2]      ==>>> Failed to execute u"method setProductActionRequest shutdownwanted client1.example.com once 'client2.example.comclient3.example.comclient4.example.comclient5.example.com'": setProductActionRequest() takes exactly 4 arguments (5 given) (opsi-admin|1671)
Kann mir da jemand weiterhelfen?

Vielen Dank.
dkoch
Beiträge: 309
Registriert: 25 Nov 2011, 14:03

Re: opsi-admin cronjob client list

Beitrag von dkoch »

bademeister hat geschrieben:

Code: Alles auswählen

       opsi-admin -d method setProductActionRequest shutdownwanted $line once

Code: Alles auswählen

[2]      ==>>> Failed to execute u"method setProductActionRequest shutdownwanted client1.example.com once 'client2.example.comclient3.example.comclient4.example.comclient5.example.com'": setProductActionRequest() takes exactly 4 arguments (5 given) (opsi-admin|1671)
Siehst du deinen Fehler ? Wieso das so ist kann ich dir allerdings nicht sagen. Nach "once" kommt bei dir "'client2.example.comclient3.example.comclient4.example.comclient5.example.com'" als Argument
bademeister
Beiträge: 141
Registriert: 28 Feb 2014, 10:21

Re: opsi-admin cronjob client list

Beitrag von bademeister »

Was passiert ist mir soweit auch klar. Das Problem ist wie du schon sagtest: Warum das so ist.

Denn wie gesagt, wenn ich den Befehl so ausgebe:

Code: Alles auswählen

echo opsi-admin -d method setProductActionRequest shutdownwanted $line once
Bekomme ich die gewünschte Ausgabe.
Benutzeravatar
GEI
Beiträge: 229
Registriert: 12 Feb 2010, 13:00
Wohnort: Braunschweig
Kontaktdaten:

Re: opsi-admin cronjob client list

Beitrag von GEI »

bademeister hat geschrieben:

Code: Alles auswählen

echo opsi-admin -d method setProductActionRequest shutdownwanted $line once
ich hab´s mal nachgestellt... kleiner WorkAround mit Redirection in Line 5 hilft

Code: Alles auswählen

#!/bin/bash
while read line
do
        echo $line
        opsi-admin -d method setProductActionRequest shutdownwanted $line once   & > xx.log
done  < ./power_clients.txt
Zuletzt geändert von GEI am 15 Jun 2016, 21:45, insgesamt 1-mal geändert.
Leibniz-Institut für Bildungsmedien | Georg-Eckert-Institut (GEI)
---
'opsi4instituts' = Communityprojekt für wissenschaftliche Einrichtungen
offenes Repository, Update-Notifier
wiki.o4i.org - www.gei.de/institut/direktion/it-service/opsi4instituts
bademeister
Beiträge: 141
Registriert: 28 Feb 2014, 10:21

Re: opsi-admin cronjob client list

Beitrag von bademeister »

Witzig... bin gerade auch dran und kam aufs selbe.
Ist leider nicht zuverlässig. Funktioniert nicht immer.

Insbesondere nicht bei hostControl_start :?
Benutzeravatar
ueluekmen
uib-Team
Beiträge: 1939
Registriert: 28 Mai 2008, 10:53

Re: opsi-admin cronjob client list

Beitrag von ueluekmen »

So eine Konstruktion sieht man auch selten in bash. Mit Umleitungen Allgemein muss man sich schon richtig beschäftigen, dass ist eine kleine Wissenschaft für sich.

Das geht viel eleganter und auch zuverlässiger, wenn jede Zeile der Datei einen Client-fqdn hat dann geht sowas:

Code: Alles auswählen

for client in $(cat clients.txt); do echo opsi-admin -d method setProductActionRequest shutdown wanted $client once; done
Das Ergebnis mit meiner Datei sieht so aus:

Code: Alles auswählen

opsi-admin -d method setProductActionRequest shutdown wanted test-111.vmnat.local once
opsi-admin -d method setProductActionRequest shutdown wanted test-112.vmnat.local once
Das ganze geht natürlich viel flexibler und effizienter mit anderen mitteln, aber man kann mit sowas schon verdammt viel basteln :mrgreen:
opsi support - uib gmbh
For productive opsi installations we recommend support contracts.
http://www.uib.de
bademeister
Beiträge: 141
Registriert: 28 Feb 2014, 10:21

Re: opsi-admin cronjob client list

Beitrag von bademeister »

Mit echo vor dem Befehl hat es ja immer funktioniert wie gewünscht.

Erstaunlicherweise läuft es mit der Vorschleife jetzt auch ohne echo und es werden nicht mehr alle clients in den ersten Aufruf geparsed.

Vielen Dank. Gibt doch noch sooo viel zu lernen...
Benutzeravatar
ueluekmen
uib-Team
Beiträge: 1939
Registriert: 28 Mai 2008, 10:53

Re: opsi-admin cronjob client list

Beitrag von ueluekmen »

Das ist ja auch der Reiz, man lernt nie aus. Egal seit wie viel Jahren man das schon macht, es gibt immer etwas zu lernen ;)
opsi support - uib gmbh
For productive opsi installations we recommend support contracts.
http://www.uib.de
dkoch
Beiträge: 309
Registriert: 25 Nov 2011, 14:03

Re: opsi-admin cronjob client list

Beitrag von dkoch »

Was hier in jedem Aufruf passiert ist:

Code: Alles auswählen

opsi-admin -d "method setProductActionRequest shutdownwanted client1.example.com once" < power_clients.txt
daher kommt die Verkettung.
bademeister
Beiträge: 141
Registriert: 28 Feb 2014, 10:21

Re: opsi-admin cronjob client list

Beitrag von bademeister »

Guten Morgen,
ueluekmen hat geschrieben: Das ganze geht natürlich viel flexibler und effizienter mit anderen mitteln, aber man kann mit sowas schon verdammt viel basteln :mrgreen:
Da würde ich gern nochmal kurz drauf zurück kommen. ;)
Was für andere Mittel sind da gemeitn? :)

Viele Grüße,
Felix
Antworten