playbook-builder/build_ansible.sh

128 lines
No EOL
4 KiB
Bash

#!/bin/bash
# ensure we are running the latest version of the script from the correct branch
if [ -f /ansible/branch ];
then
branch=`cat /ansible/branch`
else
branch="prod"
fi
#determine if we need to download the latest version
regrab=false
if [ -f /ansible/current ]; then
latest=`cat /ansible/current`
echo $latest
l_branch=`echo "$latest" | grep -Po ".+:" | grep -Po "[^:]+"`
l_time=`echo "$latest" | grep -Po ":.+" | grep -Po "[^:]+"`
if [ ! "$l_branch" = "$branch" ]; then
regrab=true
else
c_time=`date +%s`
if [[ `expr $c_time - $l_time` -gt 120 ]]; then
regrab=true
fi
fi
else
regrab=true
fi
if $regrab;then
# download latest version
curl -k "https://git.actcur.com/actcur-ansible/playbook-builder/raw/branch/$branch/build_ansible.sh" -H "accept: application/raw" -o /tmp/build_ansible.sh
# verify that download was sucessful
count=`grep -P "(#!/bin/bash)|(end of build_ansible.sh)" /tmp/build_ansible.sh | wc -l`
if [ "$count" != "3" ];then
echo "failed to grab latest build_ansible.sh file, exiting"
exit
fi
# update build_ansible file and update branch/timestamp info in current
cp /tmp/build_ansible.sh /ansible/build_ansible.sh
echo ${branch}:`date +%s` > /ansible/current
# verify the parent script is not build_ansible.sh (to prevent the possibility of recurring until the system crashes in the case of an issue)
me=$(basename "$0")
parent=$(ps -o args= $PPID)
if [[ "$parent" != *"$me"* ]];then
/bin/bash /ansible/build_ansible.sh
fi
exit
fi
fqdn=`hostnamectl hostname`
curl -k "https://git.actcur.com/actcur-ansible/playbook-builder/raw/branch/$branch/playbook_templates/$fqdn" -H "accept: application/raw" -o /tmp/$fqdn
# verify file was downloaded successfully
count=`grep -P "end of file" /tmp/$fqdn | wc -l`
if [ "$count" != "1" ];then
echo "failed to grab current playbook build file for $fqdn, exiting"
exit
fi
# build playbook, retrieve roles and add variables to roles
mkdir -p /ansible/roles/
mkdir -p /ansible/new/roles
mkdir -p /ansible/prev/roles
# delete roles from previous attempt to update them
rm -r /ansible/new/roles/*
# create base playbook
echo "- hosts: localhost
become: true
roles:" > /ansible/new/$fqdn.yml
while read line
do
elements=()
for e in $(echo $line | tr ":" "\n"); do elements+=("$e");done
case ${elements[0]} in
"role")
# format role:role name:branch/tag to use
# clone role repo from specific tag/branch w/o history
git clone -b ${elements[2]} --depth 1 https://git.actcur.com/actcur-ansible/role-${elements[1]}.git /ansible/new/roles/${elements[1]}
# verify branch was cloned successfully
count=`ls /ansible/new/roles/${elements[1]}/ | wc -l`
if [[ $count -lt 5 ]];then
echo "issue grabbing role $role - dir/file count less than 9, exiting"
exit
fi
#get tags and add role
if [ -n "${elements[3]}" ];then
tags="\"${elements[3]//,/\",\"}\""
echo " - { role: ${elements[1]}, tags: [${tags}] }" >> /ansible/new/$fqdn.yml
else
echo " - ${elements[1]}" >> /ansible/new/$fqdn.yml
fi
# retrieve var file if it exists
curl -k "https://git.actcur.com/actcur-ansible/playbook-builder/raw/branch/$branch/var_files/${elements[1]}/$fqdn" -H "accept: application/raw" -o /tmp/main.yml
# /ansible/new/roles/${elements[1]}/vars/main.yml
# verifty file was downloaded successfully
count=`grep -P "(---)|(end of file)" /tmp/main.yml | wc -l`
if [ "$count" == "2" ];then
mv /tmp/main.yml /ansible/new/roles/${elements[1]}/vars/main.yml
fi
;;
"#*")
# this is a comment, ignore it
;;
*)
echo "skipping invalid entry in playbook build file for $fqdn"
echo "entry: $line"
;;
esac
done </tmp/$fqdn
rm -r /ansible/prev/*
mv /ansible/$fqdn.yml /ansible/prev/
mv /ansible/roles/ /ansible/prev
mv /ansible/new/* /ansible/
cd /ansible
ansible-playbook ${fqdn}.yml
# end of build_ansible.sh