Collect Ansible AWX logs
Parser Version: 1.0
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
- Sign in to the Google SecOps console.
- Go to SIEM Settings > Collection Agents.
- Download the Ingestion Authentication File. Save the file securely on the system where Bindplane will be installed.
Get Google SecOps customer ID
- Sign in to the Google SecOps console.
- Go to SIEM Settings > Profile.
- 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
- Open the Command Prompt or PowerShell as an administrator.
Run the following command:
msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
Linux installation
- Open a terminal with root or sudo privileges.
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
Access the configuration file:
- Locate the
config.yamlfile. 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).
- Locate the
Edit the
config.yamlfile 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.jsonto 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:
Run the following command:
sudo systemctl restart observiq-otel-collectorVerify the service is running:
sudo systemctl status observiq-otel-collectorCheck logs for errors:
sudo journalctl -u observiq-otel-collector -f
To restart the Bindplane agent in Windows:
Choose one of the following options:
- Command Prompt or PowerShell as administrator:
net stop observiq-otel-collector && net start observiq-otel-collector- Services console:
- Press
Win+R, typeservices.msc, and press Enter. - Locate observIQ OpenTelemetry Collector.
- Right-click and select Restart.
- Press
Verify the service is running:
sc query observiq-otel-collectorCheck logs for errors:
type "C:\Program Files\observIQ OpenTelemetry Collector\log\collector.log"
Configure external logging on Ansible AWX
- Sign in to the Ansible AWX web interface.
- Go to Settings from the left navigation bar.
- Select Logging settings under the System section.
- Click Edit at the bottom of the Logging settings page.
- 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 logsactivity_stream- record of changes to AWX objectsjob_events- Ansible callback module datasystem_tracking- system facts and configuration data
- Log System Tracking Facts Individually: Toggle to OFF (default).
- Logging Aggregator: Enter the IP address of the Bindplane agent host (for example,
- Click Save to apply the settings.
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: true → STATUS_UPDATE |
target_present |
metadata.event_type |
Mapped: true → NETWORK_CONNECTION |
user_present |
metadata.event_type |
Mapped: true → USER_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, WARNING → MEDIUM |
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.*platform → codename_label, host.*os.*platform → os_name_label |
os_name_label |
target.asset.attribute.labels |
Merged |
hardware |
target.asset.hardware |
Merged |
json_data |
target.asset.hardware |
Mapped: host.*os.*platform → hardware |
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.*platform → ips |
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.*platform → macs |
macs |
target.mac |
Merged |
kubernetes.namespace_name |
target.namespace |
Directly mapped |
json_data |
target.platform |
Mapped: host.*os.*platform → LINUX |
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.