8343-New-machine-id #48
|
@ -0,0 +1,24 @@
|
||||||
|
- name: List all disks
|
||||||
|
hosts: all
|
||||||
|
tasks:
|
||||||
|
- name: Get info disk information 2
|
||||||
|
shell: blkid | grep LABEL | awk {'print $2'}
|
||||||
|
register: blkid
|
||||||
|
|
||||||
|
- name: Print valid labels
|
||||||
|
debug:
|
||||||
|
var: blkid
|
||||||
|
|
||||||
|
- name: Parsear stdout_lines para buscar etiquetas específicas
|
||||||
|
set_fact:
|
||||||
|
found_labels: >-
|
||||||
|
{{
|
||||||
|
blkid.stdout_lines
|
||||||
|
| map('regex_search', 'LABEL="(?P<label>[^"]+)"')
|
||||||
|
| select('defined')
|
||||||
|
| list
|
||||||
|
}}
|
||||||
|
|
||||||
|
- name: Print valid labels
|
||||||
|
debug:
|
||||||
|
var: found_labels
|
|
@ -0,0 +1,22 @@
|
||||||
|
- name: Change machine-id in Debian
|
||||||
|
hosts: all
|
||||||
|
gather_facts: no
|
||||||
|
become: yes
|
||||||
|
tasks:
|
||||||
|
- name: Remove files with old machine-id
|
||||||
|
file:
|
||||||
|
path: "{{ item }}"
|
||||||
|
state: absent
|
||||||
|
loop:
|
||||||
|
- /etc/machine-id
|
||||||
|
- /var/lib/dbus/machine-id
|
||||||
|
|
||||||
|
- name: Ensure a new UUID is generated for /etc/machine-id
|
||||||
|
command:
|
||||||
|
cmd: dbus-uuidgen --ensure=/etc/machine-id
|
||||||
|
|
||||||
|
- name: Create symbolic link for /var/lib/dbus/machine-id
|
||||||
|
file:
|
||||||
|
src: /etc/machine-id
|
||||||
|
dest: /var/lib/dbus/machine-id
|
||||||
|
state: link
|
|
@ -0,0 +1,7 @@
|
||||||
|
- name: Configure Directory, Time, and Database Services
|
||||||
|
hosts: all
|
||||||
|
tasks:
|
||||||
|
- name: Configure services to install in the server
|
||||||
|
import_role:
|
||||||
|
name: services
|
||||||
|
|
|
@ -0,0 +1,45 @@
|
||||||
|
samba_client_services:
|
||||||
|
- smbd
|
||||||
|
- nmbd
|
||||||
|
- winbind
|
||||||
|
dcsamba_base_packages:
|
||||||
|
- samba
|
||||||
|
- krb5-user
|
||||||
|
- winbind
|
||||||
|
- acl
|
||||||
|
mariadb_base_packages:
|
||||||
|
- mariadb-server
|
||||||
|
- mariadb-backup
|
||||||
|
- pmm2-client
|
||||||
|
mariadb_requeriments:
|
||||||
|
- curl
|
||||||
|
- apt-transport-https
|
||||||
|
certificates:
|
||||||
|
- { content: '{{ ca_mysql }}', dest: '/etc/mysql/ca.pem', mode: 'u=rw,g=r,o=r' }
|
||||||
|
- { content: '{{ cert_mysql }}', dest: '/etc/mysql/cert.pem', mode: 'u=rw,g=r,o=r' }
|
||||||
|
required_directories:
|
||||||
|
- { path: /mnt/local-backup, owner: root, group: root, mode: 'u=rwx,g=rx,o=rx' }
|
||||||
|
- { path: /mnt/mysqlbin, owner: root, group: root, mode: 'u=rwx,g=rx,o=rx' }
|
||||||
|
- { path: /mnt/mysqltmp, owner: root, group: root, mode: 'u=rwx,g=rwx,o=rwxt' }
|
||||||
|
- { path: /mnt/mysqlbin/binlog, owner: mysql, group: mysql, mode: 'u=rwx,g=,o=' }
|
||||||
|
- { path: /root/scripts, owner: root, group: root, mode: 'u=rwx,g=rx,o=rx' }
|
||||||
|
- { path: /root/mariabackup, owner: root, group: root, mode: 'u=rwx,g=rx,o=rx' }
|
||||||
|
required_files_and_mariabackup_files_and_root_scripts:
|
||||||
|
- { src: "mariadb_override.conf", dest: "/etc/systemd/system/mariadb.service.d/override.conf", mode: "u=rw,g=r,o=r" }
|
||||||
|
- { src: "mysql-flush.sh", dest: "/etc/qemu/fsfreeze-hook.d/mysql-flush.sh", mode: "u=rwx,g=rx,o=rx" }
|
||||||
|
- { src: "files/mariabackup/bacula-before.sh", dest: "/root/mariabackup/bacula-before.sh", mode: "u=rwx,g=rx,o=rx" }
|
||||||
|
- { src: "files/mariabackup/config.sh", dest: "/root/mariabackup/config.sh", mode: "u=rwx,g=rx,o=x" }
|
||||||
|
- { src: "files/mariabackup/inc-backup.sh", dest: "/root/mariabackup/inc-backup.sh", mode: "u=rwx,g=rx,o=rx" }
|
||||||
|
- { src: "files/mariabackup/my.cnf", dest: "/root/mariabackup/my.cnf", mode: "u=rw,g=,o=" }
|
||||||
|
- { src: "files/mariabackup/restore-backup.sh", dest: "/root/mariabackup/restore-backup.sh", mode: "u=rwx,g=rx,o=rx" }
|
||||||
|
- { src: "files/scripts/check-memory.sh", dest: "/root/scripts/check-memory.sh", mode: "u=rwx,g=rx,o=rx" }
|
||||||
|
- { src: "files/scripts/export-privs.sh", dest: "/root/scripts/export-privs.sh", mode: "u=rwx,g=rx,o=rx" }
|
||||||
|
- { src: "files/scripts/mysqltuner.pl", dest: "/root/scripts/mysqltuner.pl", mode: "u=rwx,g=rx,o=rx" }
|
||||||
|
- { src: "files/scripts/promote-master.sh", dest: "/root/scripts/promote-master.sh", mode: "u=rwx,g=rx,o=rx" }
|
||||||
|
- { src: "files/scripts/promote-slave.sh", dest: "/root/scripts/promote-slave.sh", mode: "u=rwx,g=rx,o=rx" }
|
||||||
|
- { src: "files/scripts/README.md", dest: "/root/scripts/README.md", mode: "u=rw,g=r,o=r" }
|
||||||
|
- { src: "files/scripts/scheduler-log.sh", dest: "/root/scripts/scheduler-log.sh", mode: "u=rwx,g=rx,o=rx" }
|
||||||
|
- { src: "files/scripts/sync-conf.sh", dest: "/root/scripts/sync-conf.sh", mode: "u=rwx,g=rx,o=rx" }
|
||||||
|
downloads:
|
||||||
|
- { url: "https://r.mariadb.com/downloads/mariadb_repo_setup", dest: "/tmp/mariadb_repo_setup", mode: "u=rwx,g=rx,o=rx" }
|
||||||
|
- { url: "https://repo.percona.com/apt/percona-release_latest.generic_all.deb", dest: "/tmp/percona-release_latest.generic_all.deb", mode: "u=rw,g=r,o=r" }
|
|
@ -0,0 +1,30 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# https://mariadb.com/kb/en/mariabackup/
|
||||||
|
set -e
|
||||||
|
|
||||||
|
myDir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
. "$myDir/config.sh"
|
||||||
|
|
||||||
|
todayDir="$(date +%Y-%m-%d)"
|
||||||
|
backupName="${todayDir}_$(date +"%H-%M")_full"
|
||||||
|
backupFile="$backupDir/$backupName.gz"
|
||||||
|
|
||||||
|
if [ -d "$backupDir" ]; then
|
||||||
|
rm -rf "$backupDir/"*
|
||||||
|
fi
|
||||||
|
|
||||||
|
ulimit -n 8192
|
||||||
|
mariabackup \
|
||||||
|
--defaults-extra-file="$myDir/my.cnf" \
|
||||||
|
--backup \
|
||||||
|
--extra-lsndir="$backupDir/$backupName" \
|
||||||
|
--history="$todayDir" \
|
||||||
|
2>> "$logFile" \
|
||||||
|
| gzip \
|
||||||
|
> "$backupFile"
|
||||||
|
|
||||||
|
if [ $? != "0" ]; then
|
||||||
|
echo "An error ocurred during backup, please take a look at log file: $logFile"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Destination file for backup logs
|
||||||
|
logFile=/var/log/vn-mariabackup.log
|
||||||
|
|
||||||
|
# Temporary local directory to save backups
|
||||||
|
backupDir=/mnt/local-backup
|
||||||
|
|
||||||
|
# Directory for backup history
|
||||||
|
historyDir=/mnt/backup4mariadb
|
||||||
|
|
||||||
|
# Number of days for backup rotation
|
||||||
|
cleanDays=90
|
||||||
|
|
||||||
|
# Directory for temporal restore data
|
||||||
|
restoreDir=/mnt/mysqldata/mysql-restore
|
||||||
|
|
||||||
|
# Directory of MySQL data
|
||||||
|
dataDir=/mnt/mysqldata/mysql
|
||||||
|
|
|
@ -0,0 +1,38 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# https://mariadb.com/kb/en/incremental-backup-and-restore-with-mariabackup/
|
||||||
|
set -e
|
||||||
|
|
||||||
|
myDir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
. "$myDir/config.sh"
|
||||||
|
|
||||||
|
todayDir="$(date +%Y-%m-%d)"
|
||||||
|
todayPath="$historyDir/$todayDir"
|
||||||
|
|
||||||
|
pattern="$todayPath/${todayDir}_??-??_full.xb.gz.enc"
|
||||||
|
files=($pattern)
|
||||||
|
backupFile="${files[0]}"
|
||||||
|
backupBase=$(basename -- "$backupFile")
|
||||||
|
backupName="${backupBase%%.*}"
|
||||||
|
|
||||||
|
incrementalName="${todayDir}_$(date +"%H-%M")_incremental"
|
||||||
|
incrementalFile="$backupDir/${incrementalName}.xb.gz.enc"
|
||||||
|
|
||||||
|
ulimit -n 24098
|
||||||
|
mariabackup \
|
||||||
|
--defaults-extra-file="$myDir/my.cnf" \
|
||||||
|
--backup \
|
||||||
|
--incremental-basedir="$backupDir/$backupName" \
|
||||||
|
--extra-lsndir="$backupDir/$incrementalName" \
|
||||||
|
--incremental-history-name="$todayDir" \
|
||||||
|
2>> "$logFile" \
|
||||||
|
| gzip \
|
||||||
|
| openssl enc -aes-256-cbc -pbkdf2 -kfile "$myDir/xbcrypt.key" \
|
||||||
|
> "$incrementalFile"
|
||||||
|
|
||||||
|
if [ $? != "0" ]; then
|
||||||
|
echo "An error ocurred during backup, please take a look at log file: $logFile"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
cp "$incrementalFile" "$todayPath"
|
||||||
|
cp -r "$backupDir/$incrementalName" "$todayPath"
|
|
@ -0,0 +1,7 @@
|
||||||
|
[mariabackup]
|
||||||
|
host = localhost
|
||||||
|
user = {{ user_mariabackup }}
|
||||||
|
password = {{ password_user_mariabackup }}
|
||||||
|
use-memory = 1G
|
||||||
|
parallel = 2
|
||||||
|
stream = mbstream
|
|
@ -0,0 +1,53 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# https://mariadb.com/kb/en/using-encryption-and-compression-tools-with-mariabackup/
|
||||||
|
set -e
|
||||||
|
|
||||||
|
myDir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
. "$myDir/config.sh"
|
||||||
|
|
||||||
|
backupFile=$1
|
||||||
|
|
||||||
|
if [ -z "$backupFile" ]; then
|
||||||
|
echo "Backup file not defined."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -f "$backupFile" ]; then
|
||||||
|
echo "Backup file does not exist: $backupFile"
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Restoring MySQL data from backup."
|
||||||
|
|
||||||
|
rm -rf "$restoreDir"
|
||||||
|
mkdir -p "$restoreDir"
|
||||||
|
|
||||||
|
echo "Decompresing backup."
|
||||||
|
gzip --decompress --stdout "$backupFile" \
|
||||||
|
| mbstream -x --directory="$restoreDir"
|
||||||
|
|
||||||
|
echo "Preparing backup."
|
||||||
|
mariabackup \
|
||||||
|
--defaults-extra-file="$myDir/my.cnf" \
|
||||||
|
--prepare \
|
||||||
|
--target-dir="$restoreDir"
|
||||||
|
|
||||||
|
echo "Stopping service."
|
||||||
|
service mariadb stop
|
||||||
|
if pgrep mariadbd; then pkill -9 mariadbd; fi
|
||||||
|
|
||||||
|
echo "Restoring data."
|
||||||
|
rm -rf "$dataDir"
|
||||||
|
mariabackup \
|
||||||
|
--defaults-extra-file="$myDir/my.cnf" \
|
||||||
|
--move-back \
|
||||||
|
--target-dir="$restoreDir" \
|
||||||
|
2>> "$logFile"
|
||||||
|
chown -R mysql:mysql "$dataDir"
|
||||||
|
|
||||||
|
rm "$dataDir/mysql/slow_log."*
|
||||||
|
rm "$dataDir/mysql/general_log."*
|
||||||
|
|
||||||
|
echo "Removing restore data."
|
||||||
|
rm -r "$restoreDir"
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
[Service]
|
||||||
|
LimitNOFILE=600000
|
||||||
|
LimitMEMLOCK=2M
|
|
@ -0,0 +1,57 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# https://github.com/qemu/qemu/blob/master/scripts/qemu-guest-agent/fsfreeze-hook.d/mysql-flush.sh.sample
|
||||||
|
# Flush MySQL tables to the disk before the filesystem is frozen.
|
||||||
|
# At the same time, this keeps a read lock in order to avoid write accesses
|
||||||
|
# from the other clients until the filesystem is thawed.
|
||||||
|
|
||||||
|
MYSQL="/usr/bin/mysql"
|
||||||
|
MYSQL_OPTS="-uroot" #"-prootpassword"
|
||||||
|
FIFO=/var/run/mysql-flush.fifo
|
||||||
|
|
||||||
|
# Check mysql is installed and the server running
|
||||||
|
[ -x "$MYSQL" ] && "$MYSQL" $MYSQL_OPTS < /dev/null || exit 0
|
||||||
|
|
||||||
|
flush_and_wait() {
|
||||||
|
printf "FLUSH TABLES WITH READ LOCK \\G\n"
|
||||||
|
trap 'printf "$(date): $0 is killed\n">&2' HUP INT QUIT ALRM TERM
|
||||||
|
read < $FIFO
|
||||||
|
printf "UNLOCK TABLES \\G\n"
|
||||||
|
rm -f $FIFO
|
||||||
|
}
|
||||||
|
|
||||||
|
case "$1" in
|
||||||
|
freeze)
|
||||||
|
mkfifo $FIFO || exit 1
|
||||||
|
flush_and_wait | "$MYSQL" $MYSQL_OPTS &
|
||||||
|
# wait until every block is flushed
|
||||||
|
while [ "$(echo 'SHOW STATUS LIKE "Key_blocks_not_flushed"' |\
|
||||||
|
"$MYSQL" $MYSQL_OPTS | tail -1 | cut -f 2)" -gt 0 ]; do
|
||||||
|
sleep 1
|
||||||
|
done
|
||||||
|
# for InnoDB, wait until every log is flushed
|
||||||
|
INNODB_STATUS=$(mktemp /tmp/mysql-flush.XXXXXX)
|
||||||
|
[ $? -ne 0 ] && exit 2
|
||||||
|
trap "rm -f $INNODB_STATUS; exit 1" HUP INT QUIT ALRM TERM
|
||||||
|
while :; do
|
||||||
|
printf "SHOW ENGINE INNODB STATUS \\G" |\
|
||||||
|
"$MYSQL" $MYSQL_OPTS > $INNODB_STATUS
|
||||||
|
LOG_CURRENT=$(grep 'Log sequence number' $INNODB_STATUS |\
|
||||||
|
tr -s ' ' | cut -d' ' -f4)
|
||||||
|
LOG_FLUSHED=$(grep 'Log flushed up to' $INNODB_STATUS |\
|
||||||
|
tr -s ' ' | cut -d' ' -f5)
|
||||||
|
[ "$LOG_CURRENT" = "$LOG_FLUSHED" ] && break
|
||||||
|
sleep 1
|
||||||
|
done
|
||||||
|
rm -f $INNODB_STATUS
|
||||||
|
;;
|
||||||
|
|
||||||
|
thaw)
|
||||||
|
[ ! -p $FIFO ] && exit 1
|
||||||
|
echo > $FIFO
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
|
@ -0,0 +1,19 @@
|
||||||
|
# Scripts to maintain MariaDB
|
||||||
|
|
||||||
|
## scheduler-log.sh
|
||||||
|
|
||||||
|
The following table should be created into MySQL/MariaDB database.
|
||||||
|
|
||||||
|
```
|
||||||
|
CREATE TABLE `eventLog` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`date` datetime NOT NULL,
|
||||||
|
`event` varchar(512) NOT NULL,
|
||||||
|
`error` varchar(1024) NOT NULL,
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
KEY `date` (`date`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci COMMENT='Event scheduler error log'
|
||||||
|
```
|
||||||
|
|
||||||
|
Then adjust the *$logTable* variable to the correct schema.
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
minFree=1
|
||||||
|
memFree=$(free --gibi | awk '$1 == "Mem:" { print $7 }')
|
||||||
|
|
||||||
|
if [ "$memFree" -le "$minFree" ]; then
|
||||||
|
echo "Free memory is ${memFree}Gi, restarting mariadb service to prevent OOM killer..."
|
||||||
|
systemctl restart mariadb
|
||||||
|
fi
|
|
@ -0,0 +1,25 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
OUTFILE=privs.sql
|
||||||
|
SCHEMA=mysql
|
||||||
|
TABLES=(
|
||||||
|
global_priv
|
||||||
|
db
|
||||||
|
tables_priv
|
||||||
|
columns_priv
|
||||||
|
procs_priv
|
||||||
|
proxies_priv
|
||||||
|
roles_mapping
|
||||||
|
)
|
||||||
|
|
||||||
|
echo "USE \`$SCHEMA\`;" > "$OUTFILE"
|
||||||
|
|
||||||
|
for TABLE in "${TABLES[@]}"
|
||||||
|
do
|
||||||
|
echo "TRUNCATE TABLE \`$SCHEMA\`.\`$TABLE\`;" >> "$OUTFILE"
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "" >> "$OUTFILE"
|
||||||
|
mysqldump --no-create-info --skip-triggers "$SCHEMA" ${TABLES[@]} >> "$OUTFILE"
|
||||||
|
|
||||||
|
echo "FLUSH PRIVILEGES;" >> "$OUTFILE"
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,15 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
mysql -e "SET GLOBAL event_scheduler = OFF"
|
||||||
|
|
||||||
|
echo "SELECT db, name FROM mysql.event WHERE status = 'SLAVESIDE_DISABLED'" | mysql --raw --silent | \
|
||||||
|
awk '{
|
||||||
|
gsub("`", "``", $1);
|
||||||
|
gsub("`", "``", $2);
|
||||||
|
print "`"$1"`.`"$2"`";
|
||||||
|
}' | \
|
||||||
|
while read event; do
|
||||||
|
mysql -e "ALTER EVENT $event ENABLE"
|
||||||
|
done
|
||||||
|
|
||||||
|
mysql -e "SET GLOBAL event_scheduler = ON"
|
|
@ -0,0 +1,16 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
mysql -e "SET GLOBAL event_scheduler = OFF"
|
||||||
|
|
||||||
|
echo "SELECT db, name FROM mysql.event WHERE status = 'ENABLED'" | mysql --raw --silent | \
|
||||||
|
awk '{
|
||||||
|
gsub("`", "``", $1);
|
||||||
|
gsub("`", "``", $2);
|
||||||
|
print "`"$1"`.`"$2"`";
|
||||||
|
}' | \
|
||||||
|
while read event; do
|
||||||
|
mysql -e "ALTER EVENT $event DISABLE ON SLAVE"
|
||||||
|
done
|
||||||
|
|
||||||
|
mysql -e "SET GLOBAL event_scheduler = ON"
|
||||||
|
|
|
@ -0,0 +1,49 @@
|
||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
logFile="/var/log/mysql/error.log"
|
||||||
|
dateFile="/tmp/mysql_scheduler_log-lastdate"
|
||||||
|
logTable="util.eventLog"
|
||||||
|
purgeDays=30
|
||||||
|
|
||||||
|
quote() {
|
||||||
|
local str=${1//\'/\'\'/}
|
||||||
|
local str=${str//\\/\\\\}
|
||||||
|
echo "'$str'"
|
||||||
|
}
|
||||||
|
|
||||||
|
mysql -e "SELECT TRUE" > /dev/null 2>&1
|
||||||
|
if [ "$?" -ne "0" ]; then
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -f "$dateFile" ]; then
|
||||||
|
fromDate=$(cat "$dateFile")
|
||||||
|
else
|
||||||
|
fromDate=0
|
||||||
|
fi
|
||||||
|
|
||||||
|
lastDate=$(tail -n1 "$logFile" | awk '{print $1" "$2}')
|
||||||
|
toDate=$(date +%s -d "$lastDate")
|
||||||
|
|
||||||
|
awk -v fromDate="$fromDate" -v toDate="$toDate" '{
|
||||||
|
split($1, date, "-");
|
||||||
|
split($2, time, ":");
|
||||||
|
timestamp = mktime(date[1]" "date[2]" "date[3]" "time[1]" "time[2]" "time[3])
|
||||||
|
if (timestamp >= fromDate && timestamp < toDate && $4" "$5" "$6 == "[ERROR] Event Scheduler:") {
|
||||||
|
printf $1" "$2" "$7;
|
||||||
|
for (i=8; i<=NF; i++) printf FS $i ;
|
||||||
|
print "";
|
||||||
|
}
|
||||||
|
}' "$logFile" | \
|
||||||
|
\
|
||||||
|
while read line; do
|
||||||
|
date="$(echo "$line" | cut -d' ' -f1,2)"
|
||||||
|
event="$(echo "$line" | cut -d' ' -f3)"
|
||||||
|
error="$(echo "$line" | cut -d' ' -f4-)"
|
||||||
|
echo "INSERT INTO $logTable (date, event, error)" \
|
||||||
|
"VALUES ($(quote "$date"), $(quote "$event"), $(quote "$error"))" | mysql
|
||||||
|
done
|
||||||
|
|
||||||
|
echo -n "$toDate" > "$dateFile"
|
||||||
|
echo "DELETE FROM $logTable WHERE date < TIMESTAMPADD(DAY, -$purgeDays, NOW())" | mysql
|
|
@ -0,0 +1,21 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
partner=root@db2.static.verdnatura.es
|
||||||
|
confDir=/etc/mysql/mariadb.conf.d
|
||||||
|
files=(
|
||||||
|
z90-vn.cnf
|
||||||
|
z95-production.cnf
|
||||||
|
)
|
||||||
|
|
||||||
|
#echo "Reloading service."
|
||||||
|
#service mariadb reload
|
||||||
|
|
||||||
|
if [ $? -eq "0" ]; then
|
||||||
|
echo "Synchronizing partner configuration."
|
||||||
|
for file in "${files[@]}"; do
|
||||||
|
scp "$confDir/$file" $partner:$confDir
|
||||||
|
done
|
||||||
|
|
||||||
|
#echo "Reloading partner service."
|
||||||
|
#ssh $partner service mariadb reload
|
||||||
|
fi
|
|
@ -0,0 +1,119 @@
|
||||||
|
[mysqld]
|
||||||
|
# Docs: https://mariadb.com/kb/en/server-system-variables
|
||||||
|
|
||||||
|
lc_messages = es_ES
|
||||||
|
lc_time_names = es_ES
|
||||||
|
character-set-server = utf8
|
||||||
|
collation-server = utf8_unicode_ci
|
||||||
|
explicit_defaults_for_timestamp = ON
|
||||||
|
datadir = /var/lib/mysql
|
||||||
|
tmpdir = /mnt/mysqltmp
|
||||||
|
log_bin_trust_function_creators = 1
|
||||||
|
sql_mode = NO_ENGINE_SUBSTITUTION
|
||||||
|
bind-address = 0.0.0.0
|
||||||
|
max_password_errors = 50
|
||||||
|
|
||||||
|
#++++++++++++++++++++++++++++++++++++++++ Threads
|
||||||
|
|
||||||
|
thread_stack = 512K
|
||||||
|
join_buffer_size = 2M
|
||||||
|
sort_buffer_size = 4M
|
||||||
|
net_buffer_length = 256K
|
||||||
|
max_allowed_packet = 16M
|
||||||
|
read_buffer_size = 1M
|
||||||
|
read_rnd_buffer_size = 512K
|
||||||
|
|
||||||
|
#++++++++++++++++++++++++++++++++++++++++ Performance
|
||||||
|
|
||||||
|
thread_cache_size = 450
|
||||||
|
interactive_timeout = 1800
|
||||||
|
wait_timeout = 1800
|
||||||
|
open_files_limit = 20000
|
||||||
|
low_priority_updates = 1
|
||||||
|
table_open_cache = 40000
|
||||||
|
table_definition_cache = 10000
|
||||||
|
table_open_cache_instances = 1
|
||||||
|
key_buffer_size = 256K
|
||||||
|
max_heap_table_size = 128M
|
||||||
|
tmp_table_size = 128M
|
||||||
|
concurrent_insert = ALWAYS
|
||||||
|
group_concat_max_len = 10000
|
||||||
|
max_connect_errors = 50
|
||||||
|
|
||||||
|
#++++++++++++++++++++++++++++++++++++++++ Binary log
|
||||||
|
|
||||||
|
log-bin = /mnt/mysqlbin/binlog/bin.log
|
||||||
|
max_binlog_size = 1GB
|
||||||
|
binlog_cache_size = 16M
|
||||||
|
binlog_stmt_cache_size = 16M
|
||||||
|
binlog_row_image = noblob
|
||||||
|
binlog_format = row
|
||||||
|
relay_log = /mnt/mysqlbin/binlog/relay.log
|
||||||
|
|
||||||
|
binlog-ignore-db = tmp
|
||||||
|
binlog-ignore-db = PERCONA_SCHEMA
|
||||||
|
|
||||||
|
#++++++++++++++++++++++++++++++++++++++++ Replication
|
||||||
|
|
||||||
|
event-scheduler = ON
|
||||||
|
slave_exec_mode = STRICT
|
||||||
|
|
||||||
|
replicate-ignore-db = tmp
|
||||||
|
replicate-ignore-table = util.eventLog
|
||||||
|
replicate-ignore-table = cache.cache_calc
|
||||||
|
replicate-ignore-table = cache.available
|
||||||
|
replicate-ignore-table = cache.availableNoRaids
|
||||||
|
replicate-ignore-table = cache.cache_valid
|
||||||
|
replicate-ignore-table = cache.stock
|
||||||
|
replicate-ignore-table = cache.visible
|
||||||
|
|
||||||
|
#++++++++++++++++++++++++++++++++++++++++ InnoDB
|
||||||
|
|
||||||
|
transaction-isolation = READ-COMMITTED
|
||||||
|
idle_transaction_timeout = 60
|
||||||
|
innodb_io_capacity = 100
|
||||||
|
innodb_io_capacity_max = 100
|
||||||
|
innodb_monitor_enable = all
|
||||||
|
innodb_read_io_threads = 16
|
||||||
|
innodb_write_io_threads = 16
|
||||||
|
innodb_checksum_algorithm = crc32
|
||||||
|
innodb_adaptive_hash_index = 0
|
||||||
|
innodb_flush_method = O_DIRECT
|
||||||
|
innodb_log_buffer_size = 32M
|
||||||
|
innodb_log_file_size = 8G
|
||||||
|
innodb_purge_threads = 4
|
||||||
|
innodb_buffer_pool_dump_at_shutdown = ON
|
||||||
|
innodb_buffer_pool_load_at_startup = ON
|
||||||
|
|
||||||
|
#++++++++++++++++++++++++++++++++++++++++ Logging
|
||||||
|
|
||||||
|
log_error = /var/log/mysql/error.log
|
||||||
|
log_warnings = 1
|
||||||
|
log_output = TABLE
|
||||||
|
general_log = OFF
|
||||||
|
slow_query_log = ON
|
||||||
|
long_query_time = 2
|
||||||
|
min_examined_row_limit = 0
|
||||||
|
log_slow_admin_statements = ON
|
||||||
|
log_queries_not_using_indexes = OFF
|
||||||
|
max_error_count = 100
|
||||||
|
|
||||||
|
#++++++++++++++++++++++++++++++++++++++++ SSL
|
||||||
|
|
||||||
|
ssl-ca = /etc/mysql/ca.pem
|
||||||
|
ssl-cert = /etc/mysql/cert.pem
|
||||||
|
ssl-key = /etc/mysql/key.pem
|
||||||
|
|
||||||
|
#++++++++++++++++++++++++++++++++++++++++ Query cache
|
||||||
|
|
||||||
|
query_cache_limit = 0
|
||||||
|
query_cache_type = OFF
|
||||||
|
query_cache_size = 0
|
||||||
|
|
||||||
|
#++++++++++++++++++++++++++++++++++++++++ Performance Schema
|
||||||
|
|
||||||
|
performance_schema = ON
|
||||||
|
performance_schema_digests_size = 20000
|
||||||
|
performance-schema-consumer-events-statements-history = ON
|
||||||
|
performance_schema_consumer_events_statements_history_long = ON
|
||||||
|
userstat = ON
|
|
@ -0,0 +1,6 @@
|
||||||
|
[mysqld]
|
||||||
|
|
||||||
|
port = 3306
|
||||||
|
max_connections = 1000
|
||||||
|
expire_logs_days = 7
|
||||||
|
innodb_buffer_pool_size = 64G
|
|
@ -0,0 +1,7 @@
|
||||||
|
[mysqld]
|
||||||
|
|
||||||
|
server-id = 1
|
||||||
|
#bind-address = 127.0.0.1
|
||||||
|
#event-scheduler = OFF
|
||||||
|
#skip-log-bin
|
||||||
|
#skip-slave-start
|
|
@ -0,0 +1,13 @@
|
||||||
|
- name: restart-chrony
|
||||||
|
systemd:
|
||||||
|
name: chrony
|
||||||
|
state: restarted
|
||||||
|
- name: reload systemd
|
||||||
|
command:
|
||||||
|
cmd: systemctl daemon-reload
|
||||||
|
- name: restart-mariadb
|
||||||
|
systemd:
|
||||||
|
name: mariadb
|
||||||
|
state: restarted
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,49 @@
|
||||||
|
- name: Install adSamba packages
|
||||||
|
package:
|
||||||
|
name: "{{ dcsamba_base_packages }}"
|
||||||
|
state: present
|
||||||
|
install_recommends: no
|
||||||
|
|
||||||
|
- name: Add adsamba host to hosts file
|
||||||
|
blockinfile:
|
||||||
|
path: /etc/hosts
|
||||||
|
marker: "# {mark} ANSIBLE-MANAGED SAMBA DC ENTRY"
|
||||||
|
block: |
|
||||||
|
{{ dc1 }} dc1-test.samba-test.{{ resolv_domain }}
|
||||||
|
|
||||||
|
- name: Disable Samba client services and mask them
|
||||||
|
systemd:
|
||||||
|
name: "{{ item }}"
|
||||||
|
state: stopped
|
||||||
|
enabled: no
|
||||||
|
masked: yes
|
||||||
|
loop: "{{ samba_client_services }}"
|
||||||
|
|
||||||
|
- name: Check if server is already joined to domain
|
||||||
|
command:
|
||||||
|
cmd: samba-tool domain info localhost
|
||||||
|
register: domain_info
|
||||||
|
failed_when: domain_info.rc != 0 and 'Cannot contact' not in domain_info.stderr
|
||||||
|
changed_when: false
|
||||||
|
|
||||||
|
- name: Join domain as DC if not already joined
|
||||||
|
command:
|
||||||
|
cmd: samba-tool domain join samba."{{ resolv_domain }}" DC -U"SAMBA\\administrator" --option='idmap_ldb:use rfc2307 = yes'
|
||||||
|
when: "'Cannot contact' in domain_info.stderr"
|
||||||
|
register: domain_join
|
||||||
|
changed_when: "'Joined domain' in domain_join.stdout"
|
||||||
|
|
||||||
|
- name: Copy Kerberos configuration
|
||||||
|
copy:
|
||||||
|
src: krb5.conf
|
||||||
|
dest: /etc/krb5.conf
|
||||||
|
remote_src: true
|
||||||
|
owner: root
|
||||||
|
group: root
|
||||||
|
mode: '0644'
|
||||||
|
|
||||||
|
- name: Enable and start Samba AD DC service
|
||||||
|
systemd:
|
||||||
|
name: samba-ad-dc
|
||||||
|
state: started
|
||||||
|
enabled: yes
|
|
@ -0,0 +1,6 @@
|
||||||
|
- import_tasks: timeserver.yml
|
||||||
|
tags: timeserver
|
||||||
|
- import_tasks: mariadb.yml
|
||||||
|
tags: mariadb
|
||||||
|
- import_tasks: adsamba.yml
|
||||||
|
tags: adsamba
|
|
@ -0,0 +1,109 @@
|
||||||
|
# Review /root/scripts/check-memory.sh --> It's not optimal to do what this program does
|
||||||
|
# Also review the cron task /root/scripts/scheduler-log.sh
|
||||||
|
|
||||||
|
- name: Ensure Install requirements for MariaDB repository setup script
|
||||||
|
apt:
|
||||||
|
name: "{{ mariadb_requeriments }}"
|
||||||
|
state: present
|
||||||
|
install_recommends: no
|
||||||
|
|
||||||
|
- name: Download required setup files
|
||||||
|
get_url:
|
||||||
|
url: "{{ item.url }}"
|
||||||
|
dest: "{{ item.dest }}"
|
||||||
|
mode: "{{ item.mode }}"
|
||||||
|
loop: "{{ downloads }}"
|
||||||
|
|
||||||
|
- name: Run MariaDB repository setup script
|
||||||
|
command:
|
||||||
|
cmd: "/bin/bash /tmp/mariadb_repo_setup --mariadb-server-version=10.11.10"
|
||||||
|
creates: "/etc/apt/sources.list.d/mariadb.list"
|
||||||
|
|
||||||
|
- name: Install Percona repository package
|
||||||
|
apt:
|
||||||
|
deb: "/tmp/percona-release_latest.generic_all.deb"
|
||||||
|
state: present
|
||||||
|
install_recommends: no
|
||||||
|
|
||||||
|
- name: Install MariaDB packages
|
||||||
|
apt:
|
||||||
|
name: "{{ mariadb_base_packages }}"
|
||||||
|
state: present
|
||||||
|
install_recommends: no
|
||||||
|
|
||||||
|
- name: Ensure required directories exist
|
||||||
|
file:
|
||||||
|
path: "{{ item.path }}"
|
||||||
|
state: directory
|
||||||
|
owner: "{{ item.owner }}"
|
||||||
|
group: "{{ item.group }}"
|
||||||
|
mode: "{{ item.mode }}"
|
||||||
|
loop: "{{ required_directories }}"
|
||||||
|
|
||||||
|
- name: Ensure required custom and Mariabackup files are copied to their destinations and root scripts
|
||||||
|
copy:
|
||||||
|
src: "{{ item.src }}"
|
||||||
|
dest: "{{ item.dest }}"
|
||||||
|
owner: root
|
||||||
|
group: root
|
||||||
|
mode: "{{ item.mode }}"
|
||||||
|
loop: "{{ required_files_and_mariabackup_files_and_root_scripts }}"
|
||||||
|
notify: reload systemd
|
||||||
|
|
||||||
|
- name: Add tmpfs in /etc/fstab
|
||||||
|
blockinfile:
|
||||||
|
path: /etc/fstab
|
||||||
|
marker: "# {mark} ANSIBLE-MANAGED TMPFS ENTRY"
|
||||||
|
block: |
|
||||||
|
tmpfs /mnt/mysqltmp tmpfs rw,size=6144M 0 0
|
||||||
|
register: fstab
|
||||||
|
|
||||||
|
- name: Mount all filesystems from /etc/fstab
|
||||||
|
command: mount -a
|
||||||
|
when: fstab.changed
|
||||||
|
|
||||||
|
- name: Set MariaDB Cron to /etc/cron.d
|
||||||
|
template:
|
||||||
|
src: templates/cron_mariadb
|
||||||
|
dest: /etc/cron.d/vn
|
||||||
|
owner: root
|
||||||
|
group: root
|
||||||
|
mode: u=rw,g=r,o=r
|
||||||
|
|
||||||
|
- name: Insert MySQL certificates
|
||||||
|
copy:
|
||||||
|
content: "{{ item.content }}"
|
||||||
|
dest: "{{ item.dest }}"
|
||||||
|
owner: mysql
|
||||||
|
group: mysql
|
||||||
|
mode: "{{ item.mode }}"
|
||||||
|
loop: "{{ certificates }}"
|
||||||
|
notify: restart-mariadb
|
||||||
|
|
||||||
|
- name: Configure MySQL master cert
|
||||||
|
copy:
|
||||||
|
content: "{{ lookup(passbolt, 'private_mysql', folder_parent_id=passbolt_folder).description }}"
|
||||||
|
dest: /etc/mysql/key.pem
|
||||||
|
owner: mysql
|
||||||
|
group: mysql
|
||||||
|
mode: u=rw,g=,o=
|
||||||
|
|
||||||
|
- name: Set MariaDB custom configuration
|
||||||
|
copy:
|
||||||
|
src: "{{ item }}"
|
||||||
|
dest: /etc/mysql/mariadb.conf.d/
|
||||||
|
owner: root
|
||||||
|
group: root
|
||||||
|
mode: u=rw,g=r,o=r
|
||||||
|
with_fileglob:
|
||||||
|
- "files/z9*.cnf"
|
||||||
|
notify: restart-mariadb
|
||||||
|
|
||||||
|
- name: Reminder to check mount points
|
||||||
|
debug:
|
||||||
|
msg: |
|
||||||
|
Remember to check the following mount points:
|
||||||
|
- /var/lib/mysql
|
||||||
|
- /mnt/mysqlbin
|
||||||
|
- /mnt/local-backup
|
||||||
|
Make sure they are correctly configured and accessible.
|
|
@ -0,0 +1,15 @@
|
||||||
|
- name: Install CHRONY packages
|
||||||
|
apt:
|
||||||
|
name: chrony
|
||||||
|
state: present
|
||||||
|
install_recommends: no
|
||||||
|
- name: Set CHRONY generic configuration
|
||||||
|
template:
|
||||||
|
src: timeserver_custom.conf
|
||||||
|
dest: /etc/chrony/conf.d/custom.conf
|
||||||
|
owner: root
|
||||||
|
group: root
|
||||||
|
mode: u=rw,g=r,o=r
|
||||||
|
notify: restart-chrony
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
MAILTO="{{ sysadmin_mail }}"
|
||||||
|
|
||||||
|
*/15 * * * * root /root/scripts/check-memory.sh
|
||||||
|
*/30 * * * * root /root/scripts/scheduler-log.sh
|
|
@ -0,0 +1,17 @@
|
||||||
|
# vendor zone
|
||||||
|
{{ timeserver_vendor_zone }}
|
||||||
|
|
||||||
|
# Logging
|
||||||
|
log tracking statistics
|
||||||
|
|
||||||
|
# will serve as local NTP server
|
||||||
|
local stratum 10
|
||||||
|
|
||||||
|
# restrict clients from your subnets
|
||||||
|
allow {{ timeserver_restrict_clients_zone }}
|
||||||
|
|
||||||
|
# in case this server lost INTERNET connection
|
||||||
|
local stratum 10
|
||||||
|
|
||||||
|
# in case you wanna to broadcat time in your subnet
|
||||||
|
{{ timeserver_broadcat_subnet }}
|
|
@ -0,0 +1,148 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# Script to automate Proxmox PVE node backups to a PBS machine.
|
||||||
|
#
|
||||||
|
# Author: Xavi Lleó
|
||||||
|
# Copyright (c) 2025 Verdnatura S.L. All rights reserved.
|
||||||
|
# Version: 1.0.3
|
||||||
|
# ¿Juan Wants add GPL License?
|
||||||
|
#
|
||||||
|
# A configuration file is required in the user's home directory who runs this command.
|
||||||
|
# The file should be sourced using CONFIG_FILE before execution.
|
||||||
|
#
|
||||||
|
# Example of a configuration file:
|
||||||
|
#
|
||||||
|
# Default values
|
||||||
|
# USER_API="root@pam!api"
|
||||||
|
# USER="root@pam"
|
||||||
|
# IP_PBS="192.168.1.250"
|
||||||
|
# POOL="backup-pool"
|
||||||
|
# BACKUP_ITEMS="etc-pve.pxar:/etc/pve,interfaces.pxar:/etc/network"
|
||||||
|
# LOG_FILE="/var/log/proxmox-backup-node-pve.log"
|
||||||
|
# KEY_FILE="mykeyfile.key" #In case you want encrypted backups
|
||||||
|
# PBS_PASSWORD='mypass or api token'
|
||||||
|
# PBS_FINGERPRINT='b0:69:24:75:f0:92:a2:72:37:7c:c1:cb:0d:ba:8e:14:EE:XX:AA:MM:PP:LL:EE:e4:2b:07:02:18:86:9a:df:45'
|
||||||
|
#
|
||||||
|
# If you prefer to use switches in a one-liner, refer to the help section (--help) for available options.
|
||||||
|
# Remember to add the port after the IP address when using an API user for authentication.
|
||||||
|
# Example: IP_PBS="192.168.1.250:8007"
|
||||||
|
|
||||||
|
|
||||||
|
CONFIG_FILE="$HOME/.backup_config.conf"
|
||||||
|
|
||||||
|
# https://pbs.proxmox.com/docs/backup-client.html#environment-variables
|
||||||
|
export PBS_PASSWORD
|
||||||
|
export PBS_FINGERPRINT
|
||||||
|
|
||||||
|
if [ -f "$CONFIG_FILE" ]; then
|
||||||
|
source "$CONFIG_FILE"
|
||||||
|
else
|
||||||
|
echo "Error: Configuration file not found at $CONFIG_FILE"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
show_help() {
|
||||||
|
echo "Usage: $0 [options]"
|
||||||
|
echo
|
||||||
|
echo "Options:"
|
||||||
|
echo " --standard Perform a standard backup."
|
||||||
|
echo " --encrypt Perform an encrypted backup (requires a key file)."
|
||||||
|
echo " --ip Repository IP address (overrides configuration)."
|
||||||
|
echo " --pool Name of the backup pool (overrides configuration)."
|
||||||
|
echo " --items List of backup items in 'name1:source1,name2:source2' format."
|
||||||
|
echo " --user-api Specify user API credentials for backup."
|
||||||
|
echo " --user Specify user credentials for backup."
|
||||||
|
echo " --help Show this help."
|
||||||
|
exit 0
|
||||||
|
}
|
||||||
|
|
||||||
|
exit_from_repo() {
|
||||||
|
proxmox-backup-client logout --repository "$REPOSITORY" 2>>"$LOG_FILE" && echo "$(date '+%Y-%m-%d %H:%M:%S') - Logged out from repository $REPOSITORY" | tee -a "$LOG_FILE"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Check if PBS_PASSWORD and PBS_FINGERPRINT are set
|
||||||
|
if [ -z "$PBS_PASSWORD" ] || [ -z "$PBS_FINGERPRINT" ]; then
|
||||||
|
echo "Error: PBS_PASSWORD or PBS_FINGERPRINT is not set."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
while [[ $# -gt 0 ]]; do
|
||||||
|
case "$1" in
|
||||||
|
--standard)
|
||||||
|
MODE="standard"
|
||||||
|
;;
|
||||||
|
--encrypt)
|
||||||
|
MODE="encrypt"
|
||||||
|
;;
|
||||||
|
--ip)
|
||||||
|
IP_PBS="$2"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
--pool)
|
||||||
|
POOL="$2"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
--items)
|
||||||
|
BACKUP_ITEMS="$2"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
--user-api)
|
||||||
|
USER_API="$2"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
--user)
|
||||||
|
USER="$2"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
--help)
|
||||||
|
show_help
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Error: Unrecognized option '$1'"
|
||||||
|
show_help
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ -z "$MODE" ]; then
|
||||||
|
echo "You must specify --standard or --encrypt."
|
||||||
|
show_help
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "$USER_API" ]; then
|
||||||
|
REPOSITORY="$USER_API@$IP_PBS:$POOL"
|
||||||
|
else
|
||||||
|
REPOSITORY="$USER@$IP_PBS:$POOL"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "$(date '+%Y-%m-%d %H:%M:%S') - Starting backup to repository $REPOSITORY" | tee -a "$LOG_FILE"
|
||||||
|
for item in $(echo "$BACKUP_ITEMS" | tr ',' '\n'); do
|
||||||
|
BACKUP_NAME=$(echo "$item" | cut -d':' -f1)
|
||||||
|
TARGET_DIR=$(echo "$item" | cut -d':' -f2)
|
||||||
|
|
||||||
|
if [ "$MODE" == "encrypt" ]; then
|
||||||
|
if [ ! -f "$KEY_FILE" ]; then
|
||||||
|
echo "The key file $KEY_FILE does not exist." | tee -a "$LOG_FILE"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
proxmox-backup-client backup "$BACKUP_NAME:$TARGET_DIR" --repository "$REPOSITORY" --crypt-mode encrypt --keyfile "$KEY_FILE" --backup-type 'host' 2>>"$LOG_FILE"
|
||||||
|
else
|
||||||
|
proxmox-backup-client backup "$BACKUP_NAME:$TARGET_DIR" --repository "$REPOSITORY" --backup-type 'host' 2>>"$LOG_FILE"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo "Backup failed for $BACKUP_NAME" | tee -a "$LOG_FILE"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
sleep 5
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
exit_from_repo
|
||||||
|
echo -e "$(date '+%Y-%m-%d %H:%M:%S') - Backup completed successfully. You can check the log at $LOG_FILE\n" | tee -a "$LOG_FILE"
|
||||||
|
else
|
||||||
|
exit_from_repo
|
||||||
|
echo -e "$(date '+%Y-%m-%d %H:%M:%S') - Error during backup. You can check the log at $LOG_FILE\n" | tee -a "$LOG_FILE"
|
||||||
|
exit 1
|
||||||
|
fi
|
Loading…
Reference in New Issue