diff --git a/README.md b/README.md index 3e2b691..dbca67a 100644 --- a/README.md +++ b/README.md @@ -1 +1,9 @@ -This repository is used to build playbooks based on files that contain role name and version number. \ No newline at end of file +This repository is used to build playbooks based on files that contain role name and version number. + +Usage: + +First, define a branch to use in /ansible/branch. +Next, download just the file build_ansible.sh with the following command: +```curl -k "https://git.actcur.com/actcur-ansible/playbook-builder/raw/branch/prod/build_ansible.sh" -H "accept: application/raw" -o /ansible/build_ansible.sh``` + Note: the prod version of this script can be used. If there is a branch mismatch, this script will download the correct version and restart +Finally, run build_ansible.sh \ No newline at end of file diff --git a/build_ansible.sh b/build_ansible.sh new file mode 100644 index 0000000..407c93f --- /dev/null +++ b/build_ansible.sh @@ -0,0 +1,128 @@ +#!/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