171 lines
12 KiB
Bash
Executable File
171 lines
12 KiB
Bash
Executable File
#!/bin/bash
|
|
## author : Dryusdan
|
|
## date : 30/09/2019
|
|
## description : A Nextcloud Update
|
|
## usage : ./nextcloud.sh
|
|
|
|
## Import require config ##############################
|
|
source utils/config
|
|
source utils/color
|
|
source utils/logger
|
|
#######################################################
|
|
|
|
FACTS_FOLDER="$(pwd)/facts"
|
|
|
|
info "Get token for Proxmox"
|
|
PROXMOX_TOKEN=$(curl -s --insecure -d "username=${PROXMOX_USER}@pam&password=${PROXMOX_PASSWORD}" "${PROXMOX_HOST}/api2/json/access/ticket" | jq --raw-output '.data.ticket')
|
|
|
|
info "Get Proxmox node"
|
|
for nodes in $(curl -s --insecure -b "PVEAuthCookie=${PROXMOX_TOKEN}" "${PROXMOX_HOST}/api2/json/nodes" | jq --raw-output '.data[] | @base64')
|
|
do
|
|
nodename=$(echo ${nodes} | base64 --decode | jq --raw-output '.node')
|
|
clusterid=$(curl -s -X GET -H "Authorization: Token ${NETBOX_TOKEN}" -H "Accept: application/json; indent=4" "${NETBOX_URL}${NETBOX_API_PATH}/dcim/devices/?name=${nodename}" | jq --raw-output '.results[0].cluster.id')
|
|
info "Get VM"
|
|
for qemus in $(curl -s --insecure -b "PVEAuthCookie=${PROXMOX_TOKEN}" "${PROXMOX_HOST}/api2/json/nodes/${nodename}/qemu/" | jq --raw-output '.data[] | @base64')
|
|
do
|
|
vmname=$(echo ${qemus} | base64 --decode | jq --raw-output '.name')
|
|
if [ $(curl -s -X GET -H "Authorization: Token ${NETBOX_TOKEN}" -H "Accept: application/json; indent=4" "${NETBOX_URL}${NETBOX_API_PATH}/virtualization/virtual-machines/?name=${vmname}" | jq --raw-output '.count') -eq 0 ]
|
|
then
|
|
curl -s -X POST -H "Content-Type: application/json" -H "Authorization: Token ${NETBOX_TOKEN}" --data '{"name": "'${vmname}'", "cluster": '${clusterid}', "role": 2}' "${NETBOX_URL}${NETBOX_API_PATH}/virtualization/virtual-machines/" &> /dev/null
|
|
fi
|
|
done
|
|
done
|
|
info "Remove facts content"
|
|
/bin/rm -rf "${FACTS_FOLDER}"/*
|
|
info "Get facts"
|
|
/usr/bin/ansible -i "${HOME}/Ansible/hosts" all -m gather_facts -u root --tree "${FACTS_FOLDER}" &> /dev/null || /bin/true
|
|
info "Replace for Emeldiz"
|
|
/bin/mv ${FACTS_FOLDER}/emeldiz ${FACTS_FOLDER}/Emeldiz
|
|
info "Running read facts"
|
|
for fact in $(ls ${FACTS_FOLDER})
|
|
do
|
|
server_facts="${FACTS_FOLDER}/${fact}"
|
|
device_name=$(cat "${server_facts}" | jq --raw-output ".ansible_facts.ansible_nodename")
|
|
info "Get data if device exist"
|
|
if [ $(curl -s -X GET -H "Authorization: Token ${NETBOX_TOKEN}" -H "Accept: application/json; indent=4" ${NETBOX_URL}${NETBOX_API_PATH}/dcim/devices/?name=${device_name} | jq --raw-output ".count" ) -eq 1 ];
|
|
then
|
|
info "${device_name} is a physical device"
|
|
DEVICE_URI="/dcim/devices/"
|
|
DEVICE_INT="/dcim/interfaces/"
|
|
DEVICE_REQUEST="device_id"
|
|
DATA_DEVICE="device"
|
|
else
|
|
info "${device_name} is a vm"
|
|
DEVICE_URI="/virtualization/virtual-machines/"
|
|
DEVICE_INT="/virtualization/interfaces/"
|
|
DEVICE_REQUEST="virtual_machine_id"
|
|
DATA_DEVICE="virtual_machine"
|
|
fi
|
|
device_id=$(curl -s -X GET -H "Authorization: Token ${NETBOX_TOKEN}" -H "Accept: application/json; indent=4" "${NETBOX_URL}${NETBOX_API_PATH}${DEVICE_URI}?name=${device_name}" | jq --raw-output ".results[0].id")
|
|
if [ ${DATA_DEVICE} == "virtual_machine" ]
|
|
then
|
|
info "Get name and cluster id"
|
|
vm_info=$(curl -s -X GET -H "Authorization: Token ${NETBOX_TOKEN}" -H "Accept: application/json; indent=4" "${NETBOX_URL}${NETBOX_API_PATH}/virtualization/virtual-machines/${device_id}/")
|
|
cluster_id=$(echo ${vm_info} | jq --raw-output ".cluster.id" )
|
|
info "Get vCPU"
|
|
vcpu_netbox=$(echo ${vm_info} | jq --raw-output ".vcpus")
|
|
vcpu_facts=$(cat ${server_facts} | jq --raw-output '.ansible_facts["ansible_processor_vcpus"]')
|
|
if [ ${vcpu_netbox} != ${vcpu_facts} ]
|
|
then
|
|
warning "vCPU is not the same, updating"
|
|
curl -s -X PUT -H "Content-Type: application/json" -H "Authorization: Token ${NETBOX_TOKEN}" --data '{"name": "'${device_name}'", "cluster": '${cluster_id}', "vcpus": '${vcpu_facts}'}' "${NETBOX_URL}${NETBOX_API_PATH}/virtualization/virtual-machines/${device_id}/" &> /dev/null
|
|
fi
|
|
info "Get Memory"
|
|
ram_netbox=$(echo ${vm_info} | jq --raw-output ".memory")
|
|
ram_facts=$(cat ${server_facts} | jq --raw-output '.ansible_facts["ansible_memtotal_mb"]')
|
|
ram_facts=$(echo "scale=4; ${ram_facts}/1000*1024" | bc -l | awk '{printf("%d\n",$1 + 0.5)}')
|
|
if [ ${ram_netbox} != ${ram_facts} ]
|
|
then
|
|
warning "RAM is not the same, updating"
|
|
curl -s -X PUT -H "Content-Type: application/json" -H "Authorization: Token ${NETBOX_TOKEN}" --data '{"name": "'${device_name}'", "cluster": '${cluster_id}', "memory": '${ram_facts}'}' "${NETBOX_URL}${NETBOX_API_PATH}/virtualization/virtual-machines/${device_id}/" &> /dev/null
|
|
fi
|
|
info "Get disk size"
|
|
disk_netbox=$(echo ${vm_info} | jq --raw-output ".disk")
|
|
disk_facts=0
|
|
for disk_mount in $(cat ${server_facts} | jq --raw-output ".ansible_facts.ansible_mounts[] | values | .size_total")
|
|
do
|
|
disk_facts=$(echo "${disk_facts}+${disk_mount}" | bc)
|
|
done
|
|
disk_facts=$(echo "scale=4; ${disk_facts}/1000*1024/1024/1024/1024" | bc -l | awk '{printf("%d\n",$1 + 0.5)}')
|
|
if [ ${disk_netbox} != ${disk_facts} ]
|
|
then
|
|
warning "Disk is not the same, updating"
|
|
curl -s -X PUT -H "Content-Type: application/json" -H "Authorization: Token ${NETBOX_TOKEN}" --data '{"name": "'${device_name}'", "cluster": '${cluster_id}', "disk": '${disk_facts}'}' "${NETBOX_URL}${NETBOX_API_PATH}/virtualization/virtual-machines/${device_id}/" &> /dev/null
|
|
fi
|
|
info "Get primary IPv4"
|
|
idip_netbox=$(curl -s -X GET -H "Authorization: Token ${NETBOX_TOKEN}" -H "Accept: application/json; indent=4" "${NETBOX_URL}${NETBOX_API_PATH}/virtualization/virtual-machines/${device_id}/" | jq --raw-output ".primary_ip4.id")
|
|
idip_facts="0"
|
|
ip_facts=$(cat ${server_facts} | jq --raw-output '.ansible_facts.ansible_default_ipv4.address')
|
|
if [ $(curl -s -X GET -H "Authorization: Token ${NETBOX_TOKEN}" -H "Accept: application/json; indent=4" "${NETBOX_URL}${NETBOX_API_PATH}/ipam/ip-addresses/?address=${ip_facts}" | jq --raw-output ".count") -eq 1 ];
|
|
then
|
|
info "Get IP ID"
|
|
idip_facts=$(curl -s -X GET -H "Authorization: Token ${NETBOX_TOKEN}" -H "Accept: application/json; indent=4" "${NETBOX_URL}${NETBOX_API_PATH}/ipam/ip-addresses/?address=${ip_facts}" | jq --raw-output ".results[0].id")
|
|
fi
|
|
if [ ${idip_netbox} != ${idip_facts} ]
|
|
then
|
|
warning "IPv4 is not the same, updating"
|
|
curl -s -X PUT -H "Content-Type: application/json" -H "Authorization: Token ${NETBOX_TOKEN}" --data '{"name": "'${device_name}'", "cluster": '${cluster_id}', "primary_ip4": '${idip_facts}'}' "${NETBOX_URL}${NETBOX_API_PATH}/virtualization/virtual-machines/${device_id}/" &> /dev/null
|
|
fi
|
|
fi
|
|
for interface in $(cat ${server_facts} | jq --raw-output ".ansible_facts.ansible_interfaces | values | .[]")
|
|
do
|
|
if [ $(curl -s -X GET -H "Authorization: Token ${NETBOX_TOKEN}" -H "Accept: application/json; indent=4" "${NETBOX_URL}${NETBOX_API_PATH}${DEVICE_INT}?name=${interface}&${DEVICE_REQUEST}=${device_id}" | jq --raw-output ".count") -eq 0 ];
|
|
then
|
|
warning "Create new interface called ${interface}"
|
|
curl -s -X POST -H "Content-Type: application/json" -H "Authorization: Token ${NETBOX_TOKEN}" --data '{"'${DATA_DEVICE}'": '${device_id}',"name": "'${interface}'"}' "${NETBOX_URL}${NETBOX_API_PATH}${DEVICE_INT}" &> /dev/null
|
|
else
|
|
info "${interface} exist"
|
|
fi
|
|
interface_id=$(curl -s -X GET -H "Authorization: Token ${NETBOX_TOKEN}" -H "Accept: application/json; indent=4" "${NETBOX_URL}${NETBOX_API_PATH}${DEVICE_INT}?name=${interface}&${DEVICE_REQUEST}=${device_id}" | jq --raw-output ".results[0].id" )
|
|
info "Check mac address"
|
|
mac_address=$(curl -s -X GET -H "Authorization: Token ${NETBOX_TOKEN}" -H "Accept: application/json; indent=4" "${NETBOX_URL}${NETBOX_API_PATH}${DEVICE_INT}${interface_id}/" | jq --raw-output ".mac_address")
|
|
macaddress=$(cat ${server_facts} | jq --raw-output '.ansible_facts["ansible_'${interface}'"]["macaddress"]')
|
|
if [ "${mac_address^^}" != "${macaddress^^}" ];
|
|
then
|
|
warning "Updating ${interface} MAC address to ${macaddress^^}"
|
|
curl -s -X PATCH -H "Content-Type: application/json" -H "Authorization: Token ${NETBOX_TOKEN}" --data '{"'${DATA_DEVICE}'": '${device_id}',"name": "'${interface}'", "mac_address": "'${macaddress^^}'"}' "${NETBOX_URL}${NETBOX_API_PATH}${DEVICE_INT}${interface_id}/" &> /dev/null
|
|
fi
|
|
info "Check MTU"
|
|
mtu_netbox=$(curl -s -X GET -H "Authorization: Token ${NETBOX_TOKEN}" -H "Accept: application/json; indent=4" "${NETBOX_URL}${NETBOX_API_PATH}${DEVICE_INT}${interface_id}/" | jq --raw-output ".mtu")
|
|
mtu=$(cat ${server_facts} | jq --raw-output '.ansible_facts["ansible_'${interface}'"]["mtu"]')
|
|
if [ "${mtu_netbox}" != "${mtu}" ];
|
|
then
|
|
warning "Change MTU to ${mtu}"
|
|
curl -s -X PATCH -H "Content-Type: application/json" -H "Authorization: Token ${NETBOX_TOKEN}" --data '{"'${DATA_DEVICE}'": '${device_id}',"name": "'${interface}'", "mtu": '${mtu}'}' "${NETBOX_URL}${NETBOX_API_PATH}${DEVICE_INT}${interface_id}/" &> /dev/null
|
|
fi
|
|
ipv4=$(cat ${server_facts} | jq --raw-output '.ansible_facts["ansible_'${interface}'"]["ipv4"]["address"]')
|
|
broadcast=$(cat ${server_facts} | jq --raw-output '.ansible_facts["ansible_'${interface}'"]["ipv4"]["broadcast"]')
|
|
netmask=$(cat ${server_facts} | jq --raw-output '.ansible_facts["ansible_'${interface}'"]["ipv4"]["netmask"]')
|
|
network=$(cat ${server_facts} | jq --raw-output '.ansible_facts["ansible_'${interface}'"]["ipv4"]["network"]')
|
|
if [ ${ipv4} != null ]
|
|
then
|
|
info "IPv4 exist"
|
|
if [ $(curl -s -X GET -H "Authorization: Token ${NETBOX_TOKEN}" -H "Accept: application/json; indent=4" "${NETBOX_URL}${NETBOX_API_PATH}/ipam/ip-addresses/?interface_id=${interface_id}&?address=${ipv4}" | jq --raw-output ".count") -eq 0 ]
|
|
then
|
|
vrfidipv4=$(curl -s -X GET -H "Authorization: Token ${NETBOX_TOKEN}" -H "Accept: application/json; indent=4" "${NETBOX_URL}${NETBOX_API_PATH}/ipam/prefixes/?prefix=${ipv4}/${netmask}" | jq --raw-output '.results[0].vrf.id')
|
|
echo "${NETBOX_URL}${NETBOX_API_PATH}/ipam/prefixes/?prefix=${ipv4}/${netmask}"
|
|
echo '{"address": "'${ipv4}'/'${netmask}'","vrf": '${vrfidipv4}', "status": "active", "interface": '${interface_id}'}'
|
|
curl -s -X POST -H "Content-Type: application/json" -H "Authorization: Token ${NETBOX_TOKEN}" --data '{"address": "'${ipv4}'/'${netmask}'","vrf": '${vrfidipv4}', "status": "active", "interface": '${interface_id}'}' "${NETBOX_URL}${NETBOX_API_PATH}/ipam/ip-addresses/" &> /dev/null
|
|
fi
|
|
else
|
|
error "${interface} haven't any IPv4"
|
|
fi
|
|
if [ "$(cat ${server_facts} | jq --raw-output '.ansible_facts["ansible_'${interface}'"]["ipv6"]')" != null ]
|
|
then
|
|
for ipv6s in $(cat ${server_facts} | jq --raw-output '.ansible_facts["ansible_'${interface}'"]["ipv6"][] | @base64')
|
|
do
|
|
ipv6=$(echo ${ipv6s} | base64 --decode | jq --raw-output '.address')
|
|
prefix=$(echo ${ipv6s} | base64 --decode | jq --raw-output '.prefix')
|
|
if [ $(curl -s -X GET -H "Authorization: Token ${NETBOX_TOKEN}" -H "Accept: application/json; indent=4" "${NETBOX_URL}${NETBOX_API_PATH}/ipam/ip-addresses/?interface_id=${interface_id}&?address=${ipv6}" | jq --raw-output ".count") -eq 0 ]
|
|
then
|
|
warning "Adding ${ipv6}/${prefix}"
|
|
vrfidipv6=$(curl -s -X GET -H "Authorization: Token ${NETBOX_TOKEN}" -H "Accept: application/json; indent=4" "${NETBOX_URL}${NETBOX_API_PATH}/ipam/prefixes/?prefix=${ipv6}/${prefix}" | jq --raw-output '.results[0].vrf.id')
|
|
curl -s -X POST -H "Content-Type: application/json" -H "Authorization: Token ${NETBOX_TOKEN}" --data '{"address": "'${ipv6}'/'${prefix}'","vrf": '${vrfidipv6}', "status": "active", "interface": '${interface_id}'}' "${NETBOX_URL}${NETBOX_API_PATH}/ipam/ip-addresses/" &> /dev/null
|
|
fi
|
|
done
|
|
else
|
|
error "${interface} haven't any IPv6"
|
|
fi
|
|
done
|
|
done
|