DEV Community

Thomas H Jones II
Thomas H Jones II

Posted on • Originally published at thjones2.blogspot.com on

1

Smashing Walls of Text

On a few projects I work on, we make use of Ansible to automate system-configuration tasks. For better or worse, the automation relies on some upstream content that is outside the control of the customer. Translation: every few months, automation that has worked for months will suddenly no longer work.

By itself, this is more an inconvenience than a real problem. However, because the automation is handed off to other, more-junior people to execute, when errors are encountered, those others are frequently at a loss as to what to do.

Frequently, they don't bother to include logs of any sort ...or if they do, they include log snippets (or, worse: screen-caps of text-based log snippets!), the snippets frequently don't contain the information critical to solve the problem. So, first response in the support request is a "send me all the logs" type of reply.

Now, depending on the size of the Ansible job, the associate log-file might be HUGE. Generally, I'm only interested in where Ansible has failed. Parsing through an entire Ansible log-file can be like trying to find a specific brick in the Great Wall of China. So, to help preserve my sanity, I cooked up a quick BASH script to both help "cut to the chase" and provide more-easily readable log-output. That script looks like:

#!/bin/bash
#
# Script to filter the output of Ansible log files to something more-readable
#
###########################################################################
OUTFILE="${1:-/tmp/Ansible.log}"

mapfile -t ERROUT < grep ^failed: "${OUTFILE}"
)

# Make sure we got a mount-string
if [[${#ERROUT[@]} -lt 1 ]]
then
echo "No failure-messages found in ${OUTFILE}"
fi

# Iterate over error-string
ITER=0
while [[${ITER} -lt ${#ERROUT[@]} ]]
do
printf '##########\n## %s\n##########\n' "$(
echo "${ERROUT[${ITER}]}" | sed 's/^failed:.* => //' | 
python3 -c "import sys, json; print(json.load(sys.stdin)['item'])"
)"

echo "${ERROUT[${ITER}]}" | sed 's/^failed:.* => //' | \
python3 -c "import sys, json; print(json.load(sys.stdin)['stderr'])" | sed 's/^/ /'

printf '####################\n\n\n'
ITER=$(( ITER + 1 ))
done

Heroku

Build apps, not infrastructure.

Dealing with servers, hardware, and infrastructure can take up your valuable time. Discover the benefits of Heroku, the PaaS of choice for developers since 2007.

Visit Site

Top comments (0)

Image of Docusign

🛠️ Bring your solution into Docusign. Reach over 1.6M customers.

Docusign is now extensible. Overcome challenges with disconnected products and inaccessible data by bringing your solutions into Docusign and publishing to 1.6M customers in the App Center.

Learn more