Agent Open Source sur une architecture Autosys

Agent open source pour Autosys : Mise en oeuvre

La première partie de l’étude concernait la faisabilité de l’utilisation d’un agent open source scheduler en tant qu’agent distant pour Autosys. Cette seconde partie s’attache à la partie pratique et aux moyens mis en oeuvre pour lier les 2 outils de la manière la plus étroite possible.

  • Configurer la partie Autosys pour envoyer les informations vers Open Source Scheduler
  • Configurer Open Scheduler comme supervisor pour recevoir les demandes et centraliser les informations
  • Configurer le heartbeat pour garder une connexion permanente entre Autosys et Open Source Scheduler
  • Autosys

    L’intégration de l’agent open source scheduler doit être transparente pour les équipes Autosys, on doit donc pouvoir gérer les traitements avec les outils d’Autosys, principalement les outils de pilotage.

    Le principe est donc de disposer de l’ensemble des définitions dans le référentiel d’Autosys tout en ajoutant un minimum de modification pour l’exécution à distance.

    Machine virtuelle

    On va définir dans un premier temps, une machine virtuelle afin de lier la machine distante OSS avec l’agent Autosys. La machine virtuelle est la cible du traitement.

    La machine virtuelle sert à préciser la machine relai sur laquelle on soumet le job tout en ayant une vue sur la machine distante. Ceci se fait par une machine virtuelle, dont le nom contient la machine relai, pointant sur la machine distante.

    Code JIL

    insert_machine: ATS-EXS-unitmpap01
    machine: atsprdweb04
    max_load: 100

    La syntaxe respecte la norme de nommage des cibles tout en ajoutant un nouveau type : E qui signifie Externe à autosys.

    La commande autorep -m ATS-EXS-unitmpap01 permet d’identifier les composants :

    Machine Name                  Max Load   Current Load   Factor O/S
    _____________________________ __________ ______________ ______
    ATS-EXS-unitmpap01.atsprdweb04 100        0              ----  

    Ce qui signifie :

    Machine virtuelle pour l’application ATS soumettant des jobs Unix à la machine unitmpap01 en passant par le relais atsprdweb04.

    Définition du JOB

    Le job autosys aura le format suivant :

     insert_job: ATSR-TSTOSS-EUX-Encapsulation   job_type: c
     box_name: ATSR-TSTOSS-B-Test_OSS
     command: $${ATS-OSS-UNX} hostname
     machine: ATS-EXS-unitmpap01
     owner: autosys
     permission:
     description: "Lancement de la commande en passant par"
     std_out_file: >/tmp/test.log
     std_err_file: >/tmp/test.log
     alarm_if_fail: 0

    Open source scheduler

    On utilisera 2 agent open source scheduler, le premier est sur la même machine que l’agent autosys et est directement utilisé par le script comme un client, on l’appelera superviseur.
    L’autre installation est sur la machine distante, on l’utilisera simplement pour la l’exécution distante des commandes, aucun log n’est créé à distance, et la connexion est persistante dans le cadre de ce projet. On aurait pu aussi l’utiliser comme agent autonome et déléguer l’ensemble de la soumission.

    Superviseur SUPERVISOR

    Le superviseur est installé sur la même machine que l’agent Autosys et fera le lien entre l’agent Autosys et l’agent distant Open source scheduler.
    Il est nécessaire de mettre à jour le fichier de configuration pour définir les « process_class » indiquant les machines distantes :
    config/scheduler.xml

       <process_classes>
         <process_class                    max_processes = "30" /> <!-- max. number of processes in default process class -->
         <process_class name = "single"    max_processes = "10" /> <!-- max. number of processes running in single instances -->
         <process_class name = "multi"     max_processes = "10" /> <!-- max. number of processes running in multiple instances -->

           <process_class name="REMOTE" remote_scheduler="remote:5556" />
       </process_classes>

    Job de test

    Ce job de test permet d’exécuter une commande shell qui sera prise en compte dés sa création sur l’ordonnanceur. Ce job est multiplateforme et sera donc exécuté aussi bien sur unix que sur windows.

    test.job.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <job order="no">
     <script language="shell"><![CDATA[hostname]]></script>
     <run_time once="yes" />
    </job>

    Agent distant REMOTE

    On ajoute le superviseur dans la configuration de l’agent pour remonter les informations dans la base de données dédiées à la partie open scheduler.

     <config tcp_port             = "5556"
             udp_port             = "5556"
             mail_xslt_stylesheet = "config/scheduler_mail.xsl"
            supervisor = "SUPERVISOR:5556" >

    On ajoute ensuite l’adresse IP du superviseur pour lui permettre d’exécuter les commandes sur l’agent :

       <security ignore_unknown_hosts = "yes">
         <allowed_host host = "SUPERVISOR" level = "all"/>
       </security>

    Utilisation du heartbeat

    Le heartbeat permet à un script de réveiller régulièrement l’agent afin que ce dernier indique au serveur que le script est toujours en cours d’exécution. Si la surveillance est activée côté serveur, une alerte est renvoyée si le heartbeat n’arrive pas dans le temps imparti.

    La mise en place est assez simple puisqu’il s’agit simplement d’envoyer un kill -USR2 à l’agent. Dans un script Autosys, la commande unix sera la suivante :

    kill -USR2 $__jc_pid

    Pour retrouver l’information du heartbeat d’un job dans la base de données, on peut utiliser la requête SQL suivante :

    select
            job_name,
            status,
            heartbeat_interval,
            last_heartbeat,
            pid,
            jc_pid
    from
            jobst
    where
            status=1
            and job_name like 'JOB'
    order by
            last_heartbeat desc

    Pour mettre en place la surveillance sur le serveur, il est nécessaire d’ajouter l’option Check_Heartbeat dans le fichier de configuration.

    # Check job heartbeat every 2 minutes.
    Check_Heartbeat=2

    Le test suivant concerne un job renvoyant un heartbeat régulier et souhaitant une alarme si le dernier heartbeat excède 5 minutes :

    Code JIL

    insert_job: ATSR-THEART-CUX-Test_Heart_Beat   job_type: c
    box_name: ATSR-THEART-B  
    command: sleep 600
    machine: atststtt01
    owner: auto_T01
    permission:
    description: "Test du heartbeat"
    alarm_if_fail: 0
    heartbeat_interval: 5

    Event_demon

    [14:11:13.8414] [1] Checking Heartbeats...
    [14:11:24.0308] [3] EVENT: CHANGE_STATUS    STATUS: RUNNING         JOB: ATSC-TSTXIT-B  
    [14:11:24.3002] [1] EVENT: ALARM            ALARM: MISSING_HEARTBEAT JOB: ATSR-THEART-CUX-Test_Heart_Beat

    Demande de kill
    La demande de kill d’un traitement doit être prise en charge et relayé vers l’agent distant. La configuration Autosys ($AUTOUSER/config.INS) indique quels types de signaux sont envoyés :

    # List of Signals to Send to a Job for the KILLJOB event
    KillSignals=2,9

    Ce qui signifie qu’un kill -2 est envoyé puis un kill -9 si le précédent n’a pas répondu assez rapidement.

    Si le signal 9 (SIGTERM) ne peut être récupéré, il est tout de même possible d’exécuter des commandes à la réception de l’avertissement SIGINT (demande d’interruption). Pour information, le SIGINT est similaire à un Control-C.
    La mise en place se fait en 2 temps :
    -  indication de la routine en début de script
    -  ajout de la routine qui relaira le kill sur l’agent distant.

    Extrait du script ATS2OSS.pl

    # Routage du signal INT
    $SIG{INT} = "trapINT";
    &#8230;
    # sous programme de kill
    sub trapINT {
    print "===================================================================\n";
    print timestamp()."\n";
    print "DEMANDE DE KILL\n";
    print "-------------------------------------------------------------------\n";
    print sendmessage($mac,$port,"<kill_task job=\"$job\" id=\"$id\" immediately=\"yes\"></kill_task>");
    unlink($file);
    print "===================================================================\n";
    print timestamp()."\n";
    print "FIN DE JOB - RETOUR AUTOSYS\n";
    print "-------------------------------------------------------------------\n";
    exit(-1);
    }

    5 mars 2011