Hallo zusammen,
ich hoffe, ich habe jetzt die richtige Kategorie ausgewählt.
Für mein internes Monitoring möchte ich über einen jenkins Server automatisiert Skripte aus meinem Git auf meine Ubuntu Maschine ausliefern lassen. Dazu cloned Jenkins das Repository von mir auf seiner eigenen Maschine aus, tar't die Dateien, schiebt sie per SSH auf die Ubuntu Maschine und packt sie dort aus. Alles geschieht als User "jenkins_de" und funktioniert wunderbar.
Nun müssen aber die Skripte in den Ordner /usr/lib64/nagios/plugins verschoben werden, wo sie im allgemeinen hin gehören. Das Verzeichnis gehört root und die Dateien / Skripte ebenfalls. Daran möchte ich auch nichts ändern.
Ich habe nun das folgende Skript geschrieben
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | #!/bin/bash ############################################################################### # description: # script for rolling out monitoring scripts to nagios plugin folder # author: dpasternak # last change done by: me # last change done at: 10.08.2017 # $Id: $ # $HeadURL: $ ############################################################################### # ***************************************************************************** # deklarations # ***************************************************************************** # ***************************************************************************** # functions # ***************************************************************************** # usage - check the usage of script and close with exit 1 if parameters not OK usage() { [ $# == 0 ] || abort 'usage '${0##*/}' without any options\n' } # msg - give out any message msg() { [ $# == 1 ] || msg 'wrong params @ msg()' typeset msg="$*" echo -e "$msg" } # abort - abort function for other functions abort() { [ $# == 1 ] || msg 'wrong params @ abort()' typeset message="$*" msg "$message" exit 1 } # start_process - starting copying of scripts start_process() { [ $# == 0 ] || abort ''${0##*/}' - wrong params @ start_process()' target_directory="/usr/lib64/nagios/plugins/" source_directory="/home/jenkins_de/scripts_monitoring" /bin/sudo -u root /bin/cp -rv $source_directory/plugins/* $target_directory } # ***************************************************************************** # main # ***************************************************************************** usage "$@" start_process |
Den Befehl "/bin/sudo -u root /bin/cp -rv $source_directory/plugins/* $target_directory" habe ich in der allgemeinen sudoers auf der Ubuntu Maschine eingetragen, das sieht dort so aus:
1 | jenkins_de ALL = (root) NOPASSWD: /bin/cp -rv /home/jenkins_de/scripts_monitoring/plugins/* /usr/lib64/nagios/plugins/ |
Natürlich alles fein mit "visudo" gemacht 😉
Führe ich das Skript nun direkt auf der Maschine aus, funktioniert das Kopieren der Dateien wunderbar.
Führe ich aber den Job auf dem Jenkins aus (auf dem Jenkins redet man von Job bauen), dann kommt letztlich der folgende Fehler:
1 | sudo: Kein TTY vorhanden und kein »askpass«-Programm angegeben |
Skript
Der Aufruf im Jenkins ist ganz einfach nur voller Pfad + Skript:
1 | /home/jenkins_de/scripts_monitoring/rollout_monitoring_scripts.sh |
So funktioniert es zumindest wunderbar lokal:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | [jenkins_de@ubu_server scripts_monitoring]$ /home/jenkins_de/scripts_monitoring/rollout_monitoring_scripts.sh „/home/jenkins_de/scripts_monitoring/plugins/check_asm“ -> „/usr/lib64/nagios/plugins/check_asm“ „/home/jenkins_de/scripts_monitoring/plugins/check_dummy“ -> „/usr/lib64/nagios/plugins/check_dummy“ „/home/jenkins_de/scripts_monitoring/plugins/check_grid“ -> „/usr/lib64/nagios/plugins/check_grid“ „/home/jenkins_de/scripts_monitoring/plugins/check_hugepages.sh“ -> „/usr/lib64/nagios/plugins/check_hugepages.sh“ „/home/jenkins_de/scripts_monitoring/plugins/check_iowait“ -> „/usr/lib64/nagios/plugins/check_iowait“ „/home/jenkins_de/scripts_monitoring/plugins/check_oracle_asm“ -> „/usr/lib64/nagios/plugins/check_oracle_asm“ „/home/jenkins_de/scripts_monitoring/plugins/check_ora_db“ -> „/usr/lib64/nagios/plugins/check_ora_db“ „/home/jenkins_de/scripts_monitoring/plugins/check_splex.sh“ -> „/usr/lib64/nagios/plugins/check_splex.sh“ „/home/jenkins_de/scripts_monitoring/plugins/check_test“ -> „/usr/lib64/nagios/plugins/check_test“ „/home/jenkins_de/scripts_monitoring/plugins/db_scripts/create_public_synonym_oraerror.sql“ -> „/usr/lib64/nagios/plugins/db_scripts/create_public_synonym_oraerror.sql“ „/home/jenkins_de/scripts_monitoring/plugins/db_scripts/grants_nagios_user.sql“ -> „/usr/lib64/nagios/plugins/db_scripts/grants_nagios_user.sql“ „/home/jenkins_de/scripts_monitoring/plugins/db_scripts/create_nagios_user.sql“ -> „/usr/lib64/nagios/plugins/db_scripts/create_nagios_user.sql“ „/home/jenkins_de/scripts_monitoring/plugins/db_scripts/create_table_system_oraerror.sql“ -> „/usr/lib64/nagios/plugins/db_scripts/create_table_system_oraerror.sql“ „/home/jenkins_de/scripts_monitoring/plugins/db_scripts/create_trigger_after_error.sql“ -> „/usr/lib64/nagios/plugins/db_scripts/create_trigger_after_error.sql“ „/home/jenkins_de/scripts_monitoring/plugins/db_scripts/create_export_tables.sql“ -> „/usr/lib64/nagios/plugins/db_scripts/create_export_tables.sql“ „/home/jenkins_de/scripts_monitoring/plugins/include/common.global.functions“ -> „/usr/lib64/nagios/plugins/include/common.global.functions“ „/home/jenkins_de/scripts_monitoring/plugins/include/common.global.statics“ -> „/usr/lib64/nagios/plugins/include/common.global.statics“ „/home/jenkins_de/scripts_monitoring/plugins/libexec/check_oracle_health“ -> „/usr/lib64/nagios/plugins/libexec/check_oracle_health“ [jenkins_de@ubu_serverscripts_monitoring]$ |
So langsam verstehe ich nur noch Bahnhof. Ich vermute fast, dass es an dem sudoers Eintrag letztlich nicht liegt, sondern entweder an der "Art und Weise", wie ich den copy Befehl im Skript ausführe oder wie das Skript im Jenkins aufgerufen wird.
Habt ihr noch Ideen?
Danke euch und beste Grüße, David