Création d'un dossier d'exécution pour la détection

Créez un dossier d'exécution pour analyser et identifier les répertoires de base Apache Tomcat installés sur les ressources dans la gestion des applications de parc.

  1. Créez un dossier d'exploitation pour détecter les répertoires de base Apache Tomcat.
    Fournissez des informations de base telles que le nom du dossier d'exécution (Apache Tomcat Discovery), sélectionnez le produit personnalisé Apache Tomcat, l'opération de cycle de vie (Discovery) et le système d'exploitation requis (Linux).

    Ajoutez des groupes de ressources parallèles ou non simultanés en fonction de la façon dont vous voulez que l'exécution de la tâche soit exécutée sur toutes les ressources et configurez-les.

  2. Ajoutez une tâche au dossier d'exploitation.
    Note

    Veillez à sélectionner Marquer cela comme tâche de sortie de détection.
    Cette action identifie la tâche de résultat cible, indiquant à Fleet Application Management que la réponse de la tâche doit être lue et interprétée pour la collecte de l'inventaire logiciel.
  3. Charger le script de tâche de dossier d'exploitation à partir du système de fichiers ou du stockage d'objets . Voir Exemple de script pour la détection d'un produit.
    Le script doit saisir des informations telles que le répertoire de base ou le chemin cible du produit, la version du produit, les correctifs installés (le cas échéant), ainsi que le répertoire de base Java et sa version. Fleet Application Management peut exécuter le script ou le programme sur l'instance de calcul s'il prend en charge un environnement d'exécution approprié ou si les ensembles logiciels ou les bibliothèques sont installés. Le script doit sortir les conclusions dans un format JSON tel que fourni par le modèle de téléchargement de détection. Voir Exemple YAML pour la détection.
    Exemple :
    • Les détails du script peuvent être les suivants : Object Storage > compartment: mycompartment > my_bucket > apache_tomcat_discovery.zip (plusieurs fichiers de ce type)
    • La zone Commande peut contenir les commandes suivantes : unzip -o -q apache_tomcat_discovery.zip; chmod +x apache_tomcat_discovery.py; python apache_tomcat_discovery.py

    Pour un exemple de script de détection de apache_tomcat_discovery.py, voir Exemple de script de détection.

Vous avez maintenant le runbook avec des tâches qui découvrent les maisons Apache Tomcat.

Exemple de script pour la détection d'un produit

Voici un exemple de script Python pour la découverte d'Apache Tomcat.
import json
import os
import subprocess
import datetime


class TOMCAT:

    def _get_all_tomcats(self):
        command = ['find', '/', '-type', 'd', '-name', 'webapps']
        sp = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        tomcat_paths = sp.stdout.decode("utf-8").strip().replace('/webapps', '').split('\n')

        #tomcat_paths=[path for path in tomcat_paths if not 'backup' in path]

        return tomcat_paths

    def _get_details(self, path):
        tomcat_details = dict()

        try:
            command = f'{path}/bin/version.sh'
            sp = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
            stdout, stderr = sp.communicate(timeout=10)
            info_list = stdout.decode("utf-8")

            for line in info_list.splitlines():
                if ':' in line:
                    key, value = line.split(':', 1)
                    tomcat_details[key.strip()] = value.strip()

            return tomcat_details

        except Exception as E:
           pass

    def _get_timestamp(self, file_path):
        if os.path.exists(file_path):
            timestamp = os.path.getmtime(file_path)
            modified_date = datetime.datetime.fromtimestamp(timestamp).strftime("%Y-%d-%m %H:%M:%S")
            return modified_date

    def _get_java_details(self):
        try:
            java_details = dict()
            command = "java -version 2>&1 | head -n 1"
            sp = subprocess.run(command, shell=True, stdout=subprocess.PIPE)
            java_version = sp.stdout.decode("utf-8").split('"')[1]

            # Getting Java Home
            command = "java -XshowSettings:properties -version 2>&1    | sed '/^[[:space:]]*java\.home/!d;s/^[[:space:]]*java\.home[[:space:]]*=[[:space:]]*//'"
            sp = subprocess.run(command, shell=True, stdout=subprocess.PIPE)
            java_home = sp.stdout.decode("utf-8").replace("\n", '')

            java_details['java_home'] = java_home
            java_details['java_version'] = java_version.split('_')[0]

            return java_details

        except Exception as E:
            pass

    def _instance(self, path, new_version_exists):
        properties = []
        installed_patches = []
        tomcat_details = self._get_details(path)

        instance = {"product": "Apache Tomcat"}
        instance.update({"version": '.'.join(tomcat_details['Server number'].split('.')[:2])})
        instance.update({"target_name": path})
        instance.update({"resource_name": ""})
        instance.update({"components": []})
        instance.update({"available_patches": []})

        if new_version_exists:
            installed_patches = [
                {
                    "patch_name": tomcat_details['Server number'],
                    "patch_applied_dt": self._get_timestamp(path),
                    "patch_description": tomcat_details['Server number'],
                    "patch_type":"Critical Patch Update",
                    "released_date":self._get_timestamp(path),
                    "severity":"CRITICAL"
                }
            ]

        else:
            installed_patches = [
                {
                    "patch_name": tomcat_details['Server number'],
                    "patch_applied_dt": self._get_timestamp(path),
                    "patch_description": tomcat_details['Server number'],
                    "patch_type": "Critical Patch Update"

                }
            ]

        instance.update({"installed_patches": installed_patches})

        for key, value in self._get_java_details().items():
            properties.append({"property_name": key, "property_value": value})

        instance.update({"properties": properties})

        return instance

    def _discovery_tomcat(self):
        targets = []
        tomcat_paths = self._get_all_tomcats()
        new_version_exists = any(['backup' in path for path in tomcat_paths])

        for path in tomcat_paths:
            if not 'backup' in path:
                targets.append(self._instance(path, new_version_exists))

        discovery_output = ({"targets": targets})

        return discovery_output


if __name__ == "__main__":
    SCRIPTS_DIR = "/opt/fams/.scripts"
    os.makedirs(SCRIPTS_DIR, exist_ok=True)
    tomcat = TOMCAT()
    tomcat_output = tomcat._discovery_tomcat()

    json_obj = json.dumps(tomcat_output, indent=4)
    print(json_obj)

    with open("{}/tomcat_discovery.json".format(SCRIPTS_DIR), 'wb') as outfile:
        outfile.write(json_obj.encode())

Exemple de fichier JSON pour la détection

Voici un exemple de représentation JSON d'Apache Tomcat que Fleet Application Management analyse pour sa détection.

{
  "compartmentId": "<your_root_compartment_ocid>",
  "displayName": "Apache Tomcat Discovery",
  "description": "Runbook to discovery Apache Tomcat Product Homes on an instance",
  "operation": "DISCOVERY",
  "runbookRelevance": "PRODUCT",
  "platform": "Apache Tomcat",
  "isDefault": false,
  "osType": "LINUX",
  "estimatedTime": "1",
  "associations": {
    "groups": [
      {
        "name": "Parallel_resource_group",
        "type": "PARALLEL_RESOURCE_GROUP",
        "properties": {
          "actionOnFailure": "ABORT",
          "condition": null
        }
      }
    ],
    "tasks": [
      {
        "stepName": "Apache_Tomcat_discovery_task",
        "associationType": "TASK",
        "taskRecordDetails": {
          "scope": "LOCAL",
          "executionDetails": {
            "executionType": "SCRIPT",
            "variables": null,
            "content": {
              "sourceType": "OBJECT_STORAGE_BUCKET",
              "namespaceName": "mytenancynamespace",
              "bucketName": "demo_bucket",
              "objectName": "my_apache_tomcat_discovery.zip",
              "checksum": "APLIeko3yTq4CXNWzxcVKvHg=="
            },
            "command": "unzip -o -q my_apache_tomcat_discovery.zip; chmod +x apache_tomcat_discovery.py ; python apache_tomcat_discovery.py",
            "credentials": []
          },
          "description": null,
          "platform": "Apache Tomcat",
          "isCopyToLibraryEnabled": false,
          "osType": "LINUX",
          "properties": {
            "numRetries": 0,
            "timeoutInSeconds": 3000
          },
          "isDiscoveryOutputTask": true,
          "isApplySubjectTask": false,
          "name": "Apache Tomcat_discovery_task"
        },
        "stepProperties": {
          "actionOnFailure": "ABORT",
          "condition": null
        },
        "outputVariableMappings": []
      }
    ],
    "executionWorkflowDetails": {
      "workflow": [
        {
          "groupName": "Parallel_resource_group",
          "type": "PARALLEL_RESOURCE_GROUP",
          "steps": [
            {
              "type": "TASK",
              "stepName": "Apache_Tomcat_discovery_task"
            }
          ]
        }
      ]
    }
  }
}

Exemple YAML pour la découverte

Voici un exemple de représentation YAML d'Apache Tomcat que Fleet Application Management analyse pour sa détection.

compartmentId: <your_root_compartment_ocid>
displayName: Apache Tomcat Discovery
description: Runbook to discovery Apache Tomcat Product Homes on an instance
operation: DISCOVERY
runbookRelevance: PRODUCT
platform: Apache Tomcat
isDefault: false
osType: LINUX
estimatedTime: "1"
associations:
  groups:
    - name: Parallel_resource_group
      type: PARALLEL_RESOURCE_GROUP
      properties:
        actionOnFailure: ABORT
        condition: null
  tasks:
    - stepName: Apache_Tomcat_discovery_task
      associationType: TASK
      taskRecordDetails:
        scope: LOCAL
        executionDetails:
          executionType: SCRIPT
          variables: null
          content:
            sourceType: OBJECT_STORAGE_BUCKET
            namespaceName: mytenancynamespace
            bucketName: demo_bucket
            objectName: my_apache_tomcat_discovery.zip
            checksum: APLIeko3yTq4CXNWzxcVKvHg==
          command: unzip -o -q my_apache_tomcat_discovery.zip; chmod +x
            apache_tomcat_discovery.py ; python apache_tomcat_discovery.py
          credentials: []
        description: null
        platform: Apache Tomcat
        isCopyToLibraryEnabled: false
        osType: LINUX
        properties:
          numRetries: 0
          timeoutInSeconds: 3000
        isDiscoveryOutputTask: true
        isApplySubjectTask: false
        name: Apache Tomcat_discovery_task
      stepProperties:
        actionOnFailure: ABORT
        condition: null
      outputVariableMappings: []
  executionWorkflowDetails:
    workflow:
      - groupName: Parallel_resource_group
        type: PARALLEL_RESOURCE_GROUP
        steps:
          - type: TASK
            stepName: Apache_Tomcat_discovery_task