Latest play |
If the process is running, this is the play that's currently being
run. If the process is finished, it is the last play that was run.
Hide Query Show Query #logtype = "ansible"
| processId = ?processId
| selectLast([play])
| Single Value |
Logs |
Displays a list of Ansible logs.
Hide Query Show Query #logtype = "ansible"
| processId = ?processId
| Event List |
Status |
Displays the status of Ansible automation processes (running vs.
finished).
Hide Query Show Query #logtype = "ansible"
| processId = ?processId
| @rawstring = "*PLAY RECAP*"
| count()
| _count match {
0 => Status := "Running...";
* => Status := "Finished"
}
| select(["Status"])
| Single Value |
Latest task |
If the process is running, this is the task that's currently being
run. If the process is finished, it is the last task that was run.
Hide Query Show Query #logtype = "ansible"
| processId = ?processId
| selectLast([task])
| Single Value |
No. of unreachable hosts |
Displays the number of unreachable hosts using Ansible logs.
Hide Query Show Query #logtype = "ansible"
| processId = ?processId
| reason = "UNREACHABLE"
| count(field=host, distinct=true)
| Single Value |
Process overview |
Select a process to investigate. Processes don't have a name, so
they need to be identified by e.g. their plays.
Hide Query Show Query #logtype = "ansible"
| groupBy(processId, function=[{
@rawstring = "*PLAY RECAP*" | count() | _count match { 0 => "Is running?" := "Yes"; * => "Is running?" := "No"} | drop(_count)
},
{
play = * | collect([play], limit=3) | rename(field="play", as="First 3 plays")
},
{
play = * | count(as="No. of plays")
},
{
[
{ failureIgnored = "true" | count(as="ignoredFailures") },
{ state = "fatal" | count(as="failures") }
]
| unignoredFailures := failures - ignoredFailures
| unignoredFailures match { 0 => "Any failure?" := "No"; * => "Any failure?" := "Yes"} | drop(unignoredFailures)
},
{
state = "changed" | count() | _count match { 0 => "Any changes?" := "No"; * => "Any changes?" := "Yes"} | drop(_count)
},
selectLast([@timestamp])
])
| rename(field="processId", as="Process ID")
| sort(@timestamp)
| formatTime(format="%a %T", as="Last seen")
| table(["Process ID", "Last seen", "Is running?", "Any failure?", "Any changes?", "No. of plays", "First 3 plays"])
| Table |
No. of managed hosts |
Displays a list of Ansible managed hosts by process ID.
Hide Query Show Query #logtype = "ansible"
| processId = ?processId
| count(field=host, distinct=true)
| Single Value |
No. of unignored failures |
Displays the number of unignored Ansible failures.
Hide Query Show Query #logtype = "ansible"
| processId = ?processId
| [ { failureIgnored = "true" | count(as="ignoredFailures") },
{ state = "fatal" | count(as="failures") }
]
| unignoredFailures := failures - ignoredFailures
| select([unignoredFailures])
| Single Value |
Failures |
Displays a table of task failures and associated data (task, host,
details, ignored status).
Hide Query Show Query #logtype = "ansible"
| processId = ?processId
| case {
state = "fatal"| failureID := @id;
*
}
| [
// Collect event IDs and task names for task failures, so we can use the ID later to retrieve the "host" and "details" fields.
// "host" and "details" cannot be collected here directly, due to the memory limits imposed on "series".
series([failureID, task], startmatch={ task = * }, endmatch={ @rawstring = "* PLAY *" }),
// For any task failure, look at the next event to determine if the failure was ignored.
{ series([failureID, failureIgnored], startmatch={ state = "fatal" }, endmatch={ @rawstring = "* PLAY *" or task = * }) | drop([@timestamp, _duration]) | rename(field="failureID", as="ignoredFailureID") }
]
| failureID != ""
| splitString(by="\n", field="failureID", as="failureID")
| split(field="failureID")
| case {
test(failureID != ignoredFailureID) | failureIgnored := "false";
*
}
| groupBy(failureID, function=[
selectLast(task),
{ failureIgnored = "true" | count() | _count match { 0 => failureIgnored := "false"; * => failureIgnored := "true"} }
])
| join({
#logtype = "ansible"
| processId = ?processId
| state = "fatal"
}, field="failureID", key="@id", include=[host, details])
| rename(field="task", as="Task")
| rename(field="host", as="Host")
| rename(field="details", as="Details")
| rename(field="failureIgnored", as="Ignored?")
| "Ignored?" match {
"true" => "Ignored?" := "Yes";
"false" => "Ignored?" := "No"
}
| table([Task, Host, "Ignored?", Details])
| Table |
Status of tasks execution per host |
Displays a heat map of the status of executed tasks per host using
Ansible data.
Hide Query Show Query #logtype = "ansible"
| state = *
| processId = ?processId
| groupBy([host, state])
| Heat Map |
List of unreachable hosts |
Displays a list of unreachable hosts using Ansible data.
Hide Query Show Query #logtype = "ansible"
| processId = ?processId
| reason = "UNREACHABLE"
| groupBy([host], function=[])
| rename(field="host", as="Host")
| Table |
No. of ignored failures |
Displays the number of ignored failures using Ansible data.
Hide Query Show Query #logtype = "ansible"
| processId = ?processId
| failureIgnored = "true"
| count()
| Single Value |
List of managed hosts |
Displays a table of managed hosts using Ansible logs.
Hide Query Show Query #logtype = "ansible"
| processId = ?processId
| groupBy([host], function=[])
| rename(field="host", as="Host")
| Table |
Usage |
You can select an Ansible process to investigate by clicking the
⫶ button on your process of interest in the Process
overview widget. Note that processes don't have names,
so you need to identify them by e.g. the plays they run.
| Note |