Bash function to run commands against ansible hosts
I haven’t posted anything ansible related in a while, so here is a nifty little function I regularly use when I want to execute something on all (or a subset) of ansible hosts. It’s just a wrapper around ansible host -m script -a scriptname.sh but adds –tree so that the output is stored and can easily be parsed by jq
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | ansible_run() { local ansible_directory="${HOME}/svn/ansible/" local command=${1} local target=${2:-all} local dir="${HOME}/ansible_output/${RANDOM:0:5}" local startdir= local script= startdir="$(pwd)" script="$(mktemp)" mkdir -p "${dir}" if [[ $? -eq 0 ]] ; then { echo "#!/usr/bin/env bash" echo "${command}" echo } > "${script}" cd "${ansible_directory}" && time ansible "${target}" -m script -a "${script}" --tree "${dir}" rm "${script}" echo -e "\n${dir}\n" fi rmdir --ignore-fail-on-non-empty "${dir}" cd "${startdir}" || exit } |
Usage example:
1 2 3 4 5 6 | $ ansible_run "iptables -S | grep -E '^-P (INPUT|FORWARD)'" ... /home/user/ansible_output/6599 $ cd ${HOME}/ansible_output/6599 $ jq -r .stdout ./* |