Открываем gitlab.Идем User Settings → Access Tokens. Вводим Name , отмечаем api и нажимаем create personal Access Tokens
Наш токен
Запоминаем id нашего проекта
Создадим фаил test.txt в папке conf с содержимым "test_2019" , в ссылке после files, слеш(/) заменяется на '%2F'
[root@srv backup]# curl -s --request POST --header 'PRIVATE-TOKEN: rQgRBrr-3u2dmSXon7aQ' --header "Content-Type: application/json" --data '{"branch": "master", "author_email": "v.senkevich@s8.ru", "author_name": "v.senkevich","content": "test_2019", "commit_message": "create a new file"}' 'https://gitlab.web.s8.ru/api/v4/projects/36/repository/files/conf%2Ftest.text' | jq
{
"file_path": "conf/test.text",
"branch": "master"
}
Удалим созданный файл
[root@srv backup]# curl -s --request DELETE --header 'PRIVATE-TOKEN: rQgRBrr-3u2dmSXon7aQ' --header "Content-Type: application/json" --data '{"branch": "master", "author_email": "v.senkevich@s8.ru", "author_name": "v.senkevich","content": "test_2019", "commit_message": "create a new file"}' 'https://gitlab.web.s8.ru/api/v4/projects/36/repository/files/conf%2Ftest.text'
Заливаем конфиг файла
#!/bin/bash
content=$(cat /etc/sysconfig/iptables)
request_body='{
"branch": "master",
"author_email": "v.senkevich@s8.ru",
"author_name": "v.senkevich",
"content": "---this content will be replaced---",
"commit_message": "backup_test"
}'
request_body=$(echo $request_body | jq ". + {content: \"$content\"}")
curl -s --request POST --header 'PRIVATE-TOKEN: rQgRBrr-3u2dmSXon7aQ' --header "Content-Type: application/json" --data "$request_body" 'https://gitlab.web.s8.ru/api/v4/projects/36/repository/files/conf%2Fiptables' | jq
[root@srv backup]# ./backup.sh
{
"file_path": "conf/iptables",
"branch": "master"
}
Заливаем архивный фаил
Так как по одному конфигу делать upload не удобно, будем делать архив, но json не поддерживает binary файлы, значит будем делать кодирование в base64
The JSON format natively doesn't support binary data. The binary data has to be escaped so that it can be placed into a string element (i.e. zero or more Unicode chars in double quotes using backslash escapes) in JSON. An obvious method to escape binary data is to use Base64
- Выбираем нужные конфиги и сжимаем в архив tar.gz
- Кодируем архив в base64
- Подготавливаем json и записываем в файл(это обязательно в curl передать фаил, массив такого объема он не съест )
- Делаем Upload в gitlab
- Удаляем наш архив и в gitlab файлы старше 10 дней
#!/bin/bash
dst=$(hostname)_$(date +%d-%m-%Y).tar.gz
dst_10d=$(hostname)_$(date --date="10 days ago" +%d-%m-%Y).tar.gz
src1="/etc/sysconfig/iptables"
src2="/etc/haproxy"
src3="/etc/named.*"
src4="/var/named/slaves"
filename="/opt/backup/$dst"
/usr/bin/tar -zcf $filename $src1 $src2 $src3 $src4 > /opt/backup/log
massiv=$(base64 $filename | tr -d '\n' )
request_body='{
"branch": "master",
"author_email": "v.senkevich@s8.ru",
"author_name": "v.senkevich",
"content": "'"$massiv"'",
"commit_message": "backup_conf"
}'
host="https://gitlab.web.s8.ru/api/v4/projects/36/repository/files/conf%2F$(hostname)%2F$dst"
echo $request_body > /opt/backup/backup.json
curl -s --request POST --header 'PRIVATE-TOKEN: rQgRBrr-3u2dmSXon7aQ' --header "Content-Type: application/json" --data @/opt/backup/backup.json "$host" >> /opt/backup/log
#delete
/bin/rm -rf $filename
host="https://gitlab.web.s8.ru/api/v4/projects/36/repository/files/conf%2F$(hostname)%2F$dst_10d"
curl -s --request DELETE --header 'PRIVATE-TOKEN: rQgRBrr-3u2dmSXon7aQ' --header "Content-Type: application/json" --data @/opt/backup/backup.json "$host" >> /opt/backup/log
Получаем наш фаил и делаем декодирование и проверку архива
[root@srv backup]# curl -s --request GET --header 'PRIVATE-TOKEN: rQgRBrr-3u2dmSXon7aQ' 'https://gitlab.web.s8.ru/api/v4/projects/36/repository/files/conf%2Fqa-rt-main-2%2Fqa-rt-main-2_29-08-2019.tar.gz/raw?ref=master' > base64_file
[root@srv backup]# base64 -d base64_file > test.tar.gz
[root@qa-rt-main-2 backup]# tar -tf test.tar.gz
etc/sysconfig/iptables
etc/haproxy/
etc/haproxy/haproxy.cfg
etc/haproxy/haproxy.cfg_08_08_19
etc/haproxy/haproxy.cfg_18_08_19
etc/haproxy/haproxy.cfg_19_08_19