playbook-builder/build_ansible.sh

128 lines
4 KiB
Bash
Raw Permalink Normal View History

2024-10-05 17:38:38 -05:00
#!/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`
2024-10-05 17:51:31 -05:00
if [[ `expr $c_time - $l_time` -gt 120 ]]; then
2024-10-05 17:38:38 -05:00
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`
2024-10-05 17:51:31 -05:00
if [ "$count" != "3" ];then
2024-10-05 17:38:38 -05:00
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
2024-10-05 18:11:45 -05:00
echo ${branch}:`date +%s` > /ansible/current
2024-10-05 17:38:38 -05:00
# 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)
2024-10-05 17:51:31 -05:00
if [[ "$parent" != *"$me"* ]];then
2024-10-05 17:38:38 -05:00
/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`
2024-10-05 18:11:45 -05:00
if [ "$count" != "1" ];then
2024-10-05 17:38:38 -05:00
echo "failed to grab current playbook build file for $fqdn, exiting"
exit
fi
# build playbook, retrieve roles and add variables to roles
2024-10-05 18:39:21 -05:00
mkdir -p /ansible/roles/
2024-10-05 17:38:38 -05:00
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
2024-10-05 19:17:01 -05:00
echo "- hosts: localhost
2024-10-05 17:38:38 -05:00
become: true
roles:" > /ansible/new/$fqdn.yml
2024-10-05 18:11:45 -05:00
while read line
2024-10-05 17:38:38 -05:00
do
elements=()
2024-10-05 18:39:21 -05:00
for e in $(echo $line | tr ":" "\n"); do elements+=("$e");done
2024-10-05 17:38:38 -05:00
case ${elements[0]} in
"role")
# format role:role name:branch/tag to use
# clone role repo from specific tag/branch w/o history
2024-10-05 18:39:21 -05:00
git clone -b ${elements[2]} --depth 1 https://git.actcur.com/actcur-ansible/role-${elements[1]}.git /ansible/new/roles/${elements[1]}
2024-10-05 17:38:38 -05:00
# verify branch was cloned successfully
2024-10-05 18:50:14 -05:00
count=`ls /ansible/new/roles/${elements[1]}/ | wc -l`
if [[ $count -lt 5 ]];then
2024-10-05 17:38:38 -05:00
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
2024-10-05 17:38:38 -05:00
# retrieve var file if it exists
2024-10-05 19:17:01 -05:00
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
2024-10-05 17:38:38 -05:00
# verifty file was downloaded successfully
2024-10-05 19:17:01 -05:00
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
2024-10-05 17:38:38 -05:00
fi
;;
"#*")
# this is a comment, ignore it
;;
*)
echo "skipping invalid entry in playbook build file for $fqdn"
echo "entry: $line"
;;
esac
2024-10-05 18:11:45 -05:00
done </tmp/$fqdn
2024-10-05 17:38:38 -05:00
rm -r /ansible/prev/*
mv /ansible/$fqdn.yml /ansible/prev/
mv /ansible/roles/ /ansible/prev
2024-10-05 18:21:13 -05:00
mv /ansible/new/* /ansible/
2024-10-05 17:38:38 -05:00
2024-10-05 19:17:01 -05:00
cd /ansible
ansible-playbook ${fqdn}.yml
2024-10-05 17:38:38 -05:00
# end of build_ansible.sh