Collect Ansible AWX logs

Parser Version: 1.0

Supported in:

This document explains how to ingest Ansible AWX logs to Google Security Operations using Bindplane. Ansible AWX is an open-source web application that provides a user interface, REST API, and task engine for Ansible. It allows teams to centrally manage automation playbooks, inventories, credentials, and scheduled jobs across the organization. The parser extracts fields from JSON-formatted Ansible AWX logs and maps these values to the Unified Data Model (UDM).

Before you begin

Make sure you have the following prerequisites:

  • A Google SecOps instance.
  • Windows Server 2016 or later, or Linux host with systemd.
  • If running behind a proxy, ensure firewall ports are open per the Bindplane agent requirements.
  • Privileged access to the Ansible AWX management console with administrator permissions.

Get Google SecOps ingestion authentication file

  1. Sign in to the Google SecOps console.
  2. Go to SIEM Settings > Collection Agents.
  3. Download the Ingestion Authentication File. Save the file securely on the system where Bindplane will be installed.

Get Google SecOps customer ID

  1. Sign in to the Google SecOps console.
  2. Go to SIEM Settings > Profile.
  3. Copy and save the Customer ID from the Organization Details section.

Install the Bindplane agent

Install the Bindplane agent on your Windows or Linux operating system according to the following instructions.

Windows installation

  1. Open the Command Prompt or PowerShell as an administrator.
  2. Run the following command:

    msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
    

Linux installation

  1. Open a terminal with root or sudo privileges.
  2. Run the following command:

    sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.sh
    

Additional installation resources

For additional installation options, consult this installation guide.

Configure the Bindplane agent to ingest syslog and send to Google SecOps

  1. Access the configuration file:

    • Locate the config.yaml file. Typically, it is in the /observiq-otel-collector/ directory on Linux or in the installation directory on Windows.
    • Open the file using a text editor (for example, nano, vi, or Notepad).
  2. Edit the config.yaml file as follows:

    receivers:
      udplog:
        # Replace the port and IP address as required
        listen_address: "0.0.0.0:514"
    
    exporters:
      chronicle/ansible_awx:
        compression: gzip
        # Adjust the path to the credentials file you downloaded in Step 1
        creds_file_path: '/path/to/ingestion-authentication-file.json'
        # Replace with your actual customer ID from Step 2
        customer_id: '<customer_id>'
        endpoint: malachiteingestion-pa.googleapis.com
        log_type: 'ANSIBLE_AWX'
        raw_log_field: body
    
    service:
      pipelines:
        logs/ansible_awx:
          receivers:
            - udplog
          exporters:
            - chronicle/ansible_awx
    
  • Replace the port and IP address as required in your infrastructure.
  • Replace <customer_id> with the actual Customer ID.
  • Update /path/to/ingestion-authentication-file.json to the file path where the authentication file was saved in the Get Google SecOps ingestion authentication file section.

Restart the Bindplane agent to apply the changes

To restart the Bindplane agent in Linux:

  1. Run the following command:

    sudo systemctl restart observiq-otel-collector
    
  2. Verify the service is running:

    sudo systemctl status observiq-otel-collector
    
  3. Check logs for errors:

    sudo journalctl -u observiq-otel-collector -f
    

To restart the Bindplane agent in Windows:

  1. Choose one of the following options:

    • Command Prompt or PowerShell as administrator:
    net stop observiq-otel-collector && net start observiq-otel-collector
    
    • Services console:
      1. Press Win+R, type services.msc, and press Enter.
      2. Locate observIQ OpenTelemetry Collector.
      3. Right-click and select Restart.
  2. Verify the service is running:

    sc query observiq-otel-collector
    
  3. Check logs for errors:

    type "C:\Program Files\observIQ OpenTelemetry Collector\log\collector.log"
    

Configure external logging on Ansible AWX

  1. Sign in to the Ansible AWX web interface.
  2. Go to Settings from the left navigation bar.
  3. Select Logging settings under the System section.
  4. Click Edit at the bottom of the Logging settings page.
  5. Provide the following configuration details:
    • Logging Aggregator: Enter the IP address of the Bindplane agent host (for example, 192.168.1.100).
    • Logging Aggregator Port: Enter the Bindplane agent port number (for example, 514).
    • Logging Aggregator Type: Select Other from the dropdown.
    • Logging Aggregator Username: Leave blank (not required for syslog).
    • Logging Aggregator Password/Token: Leave blank (not required for syslog).
    • Logging Aggregator Protocol: Select UDP.
    • Logging Aggregator Level Threshold: Select INFO or your preferred log level.
    • Enable External Logging: Toggle to ON.
    • Loggers to Send Data to the Log Aggregator Form: Select the relevant log types:
      • awx - generic server logs
      • activity_stream - record of changes to AWX objects
      • job_events - Ansible callback module data
      • system_tracking - system facts and configuration data
    • Log System Tracking Facts Individually: Toggle to OFF (default).
  6. Click Save to apply the settings.
  7. Click Test to verify the connection to the Bindplane agent.

UDM mapping table

Log Field UDM Mapping Logic
logger_name intermediary.application Directly mapped
RenderedMessage metadata.description Directly mapped
description metadata.description Directly mapped
event1 metadata.description Directly mapped
message metadata.description Directly mapped
timestamp metadata.event_timestamp Parsed as yyyy-MM-ddTHH:mm:ss.SSSZ
principal_present metadata.event_type Mapped: trueSTATUS_UPDATE
target_present metadata.event_type Mapped: trueNETWORK_CONNECTION
user_present metadata.event_type Mapped: trueUSER_UNCATEGORIZED
event1_data.uuid metadata.product_log_id Directly mapped
Properties.Method network.http.method Directly mapped
agent.type observer.application Directly mapped
agent.id observer.asset_id Directly mapped
agent.type observer.asset_id Directly mapped
agent.hostname observer.hostname Directly mapped
ephemeral_id_label observer.labels Merged
agent.version observer.platform_version Directly mapped
agent.name observer.user.userid Directly mapped
Properties.applicationName principal.application Directly mapped
Properties.MachineName principal.asset.asset_id Directly mapped
Properties.Host principal.asset.hostname Directly mapped
event1_data.remote_addr principal.asset.hostname Directly mapped
principal_device principal.asset.hostname Directly mapped
principal_hostname principal.asset.hostname Directly mapped
Properties.ClientIP principal.asset.ip Merged
ip_address principal.asset.ip Merged
principal_ip principal.asset.ip Merged
src_ip principal.asset.ip Merged
Properties.Host principal.hostname Directly mapped
event1_data.remote_addr principal.hostname Directly mapped
principal_device principal.hostname Directly mapped
principal_hostname principal.hostname Directly mapped
Properties.ClientIP principal.ip Merged
ip_address principal.ip Merged
principal_ip principal.ip Merged
src_ip principal.ip Merged
src_port principal.port Directly mapped
event1_data.task_path principal.process.file.full_path Directly mapped
process_pid principal.process.pid Directly mapped
availability_zone principal.resource.attribute.labels Merged
connectionid_label principal.resource.attribute.labels Merged
endpointname_label principal.resource.attribute.labels Merged
machine_type principal.resource.attribute.labels Merged
provider principal.resource.attribute.labels Merged
cloud.instance.name principal.resource.name Directly mapped
cloud.instance.id principal.resource.product_object_id Directly mapped
Properties.UserName principal.user.userid Directly mapped
user_name principal.user.userid Directly mapped
event1_display security_result.description Directly mapped
ca_id_label security_result.detection_fields Merged
cf_component_label security_result.detection_fields Merged
container_hash_label security_result.detection_fields Merged
container_image_label security_result.detection_fields Merged
container_name_label security_result.detection_fields Merged
messagetemplate_label security_result.detection_fields Merged
parent_uuid_label security_result.detection_fields Merged
requestid_label security_result.detection_fields Merged
requestpath_label security_result.detection_fields Merged
serviceNowId_label security_result.detection_fields Merged
sourcecontext_label security_result.detection_fields Merged
stream_label security_result.detection_fields Merged
task_label security_result.detection_fields Merged
task_uuid_label security_result.detection_fields Merged
threadid_label security_result.detection_fields Merged
wf_env_label security_result.detection_fields Merged
wf_id_label security_result.detection_fields Merged
level security_result.severity Mapped: "DEBUG", "INFO", "AUDIT"INFORMATIONAL, WARNINGMEDIUM
level security_result.severity_details Directly mapped
log security_result.summary Directly mapped
host.fqdn target.administrative_domain Directly mapped
host.id target.asset.asset_id Directly mapped
codename_label target.asset.attribute.labels Merged
json_data target.asset.attribute.labels Mapped: host.*os.*platformcodename_label, host.*os.*platformos_name_label
os_name_label target.asset.attribute.labels Merged
hardware target.asset.hardware Merged
json_data target.asset.hardware Mapped: host.*os.*platformhardware
host.hostname target.asset.hostname Directly mapped
kubernetes.host target.asset.hostname Directly mapped
target_device target.asset.hostname Directly mapped
ips target.asset.ip Merged
json_data target.asset.ip Mapped: host.*os.*platformips
target_ip target.asset.ip Merged
kubernetes.docker_id target.asset_id Directly mapped
host.hostname target.hostname Directly mapped
kubernetes.host target.hostname Directly mapped
target_device target.hostname Directly mapped
target_ip target.ip Merged
json_data target.mac Mapped: host.*os.*platformmacs
macs target.mac Merged
kubernetes.namespace_name target.namespace Directly mapped
json_data target.platform Mapped: host.*os.*platformLINUX
host.os.kernel target.platform_patch_level Directly mapped
host.os.version target.platform_version Directly mapped
io_instance_label target.resource.attribute.labels Merged
io_name_label target.resource.attribute.labels Merged
pod_id_label target.resource.attribute.labels Merged
pod_template_hash_label target.resource.attribute.labels Merged
cluster_name target.resource.name Directly mapped
N/A metadata.event_type Constant: NETWORK_CONNECTION
N/A metadata.product_name Constant: ANSIBLE_AWX
N/A metadata.vendor_name Constant: ANSIBLE_AWX
N/A network.ip_protocol Constant: TCP
N/A principal.resource.resource_type Constant: VIRTUAL_MACHINE
N/A security_result.severity Constant: INFORMATIONAL
N/A target.platform Constant: LINUX

Change Log

View the Change Log for this parser

Need more help? Get answers from Community members and Google SecOps professionals.