Я довольно новичок в Vagrant, но получил базовый навык.Тем не менее существует проблема после обновления Vagrant до версии 2.2.4.Я запускаю сценарий базовой оболочки для установки sql db и необходимых конфигураций, а затем мне нужно запустить другой скрипт после того, как все готово, чтобы создать db и заполнить его данными.Также, когда среда разрушается, вызывается другой триггер для выгрузки дБ для последующей загрузки.
Часть, относящаяся к Vagrantfile:
Vagrant.configure(2) do |config|
config.vm.box = "ubuntu/trusty64"
config.ssh.insert_key = true
config.vm.define "db" do |db|
db.vm.hostname = "local-db-dev"
db.vm.network "private_network", ip: "192.168.100.20"
db.vm.provider "virtualbox" do |vb|
vb.customize ["modifyvm", :id, "--cpus", "1" ]
vb.customize ["modifyvm", :id, "--memory", "512"]
vb.customize ["modifyvm", :id, "--name", "DB dev"]
end
db.vm.synced_folder "./dbBackup", "/srv/dbBackup", owner: "vagrant", group: "vagrant", type: "nfs"
db.vm.provision :shell, path: "bootstrap-db.sh"
db.trigger.after :up do |trigger|
trigger.info = "DB up procedure ..."
trigger.run = {path: "./dbBackup/bootstrap-db_up.sh"}
end
db.trigger.before :destroy, :halt, :suspend do |trigger|
trigger.info = "DB down procedure ..."
trigger.run = {path: "./dbBackup/bootstrap-db_down.sh"}
end
end
end
bootstrap-db_down.sh:
#!/usr/bin/env bash
export MYSQL_PWD="pass"
USER="user"
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
BACKUP_DIR="/srv/dbBackup/$TIMESTAMP"
mkdir -p "$BACKUP_DIR"
databases=`mysql -u $USER -e "SHOW DATABASES;" | tr -d "| " | grep -v Database`
for db in $databases; do
if [[ "$db" != "information_schema" ]] && [[ "$db" != "performance_schema" ]] && [[ "$db" != "sys" ]] && [[ "$db" != "mysql" ]] && [[ "$db" != _* ]] ; then
echo "Dumping database: $db"
mysqldump -u $USER --databases $db > "$BACKUP_DIR/backupdb.$db.sql"
fi
done
Все хорошо, пока не будет вызван триггер и не будет выполнен скрипт.Например, есть первая команда 'mkdir' перед триггером уничтожения.Ответ на исполнение - отказано в разрешении.Изменил его на «sudo mkdir», но тогда ответ таков: sudo неизвестен.
Я явно недостаточно опытен, чтобы понимать разрешения в этом случае.
РЕДАКТИРОВАТЬ:Некоторый прогресс
Благодаря комментарию Мэтта Шухарда удалось проверить, что на самом деле происходит с каталогом, и увидел, что я не могу получить доступ к каталогу таким образом.Изменение в запущенном скрипте улучшило ситуацию, позволив мне создать папку, но теперь я получаю следующее исключение: «bash: mysql: команда не найдена».Думаю, я не до конца понимаю, как и где запускается мой сценарий.
Отредактировано bootstrap-db_down.sh:
#!/usr/bin/env bash
export MYSQL_PWD="rooter"
USER="root"
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
BACKUP_DIR="./dbBackup/$TIMESTAMP"
mkdir "$BACKUP_DIR"
databases=`mysql -u $USER -e "SHOW DATABASES;" | tr -d "| " | grep -v Database`
for db in $databases; do
if [[ "$db" != "information_schema" ]] && [[ "$db" != "performance_schema" ]] && [[ "$db" != "sys" ]] && [[ "$db" != "mysql" ]] && [[ "$db" != _* ]] ; then
echo "Dumping database: $db"
mysqldump -u $USER --databases $db > "$BACKUP_DIR/backupdb.$db.sql"
fi
done
РЕДАКТИРОВАТЬ: окончательное решение
Наконец-то понял.Проблема снова возникла между стулом и клавиатурой.
Я просто не понимал разницы между trigger.run и trigger.run_remote, поэтому я попытался запустить скрипт локально, но ожидал, что это повлияет на удаленное управление.Я добавлю соответствующие примеры кода на тот случай, если кто-то наткнется на подобную проблему.
Часть, относящаяся к Vagrantfile:
Vagrant.configure(2) do |config|
config.vm.box = "ubuntu/trusty64"
config.ssh.insert_key = true
config.vm.define "db" do |db|
db.vm.hostname = "local-db-dev"
db.vm.network "private_network", ip: "192.168.100.20"
db.vm.provider "virtualbox" do |vb|
vb.customize ["modifyvm", :id, "--cpus", "1" ]
vb.customize ["modifyvm", :id, "--memory", "512"]
vb.customize ["modifyvm", :id, "--name", "DB dev"]
end
db.vm.synced_folder "./dbBackup", "/srv/dbBackup", owner: "vagrant", group: "vagrant", type: "nfs"
db.vm.provision :shell, path: "bootstrap-db.sh"
db.trigger.after :up do |trigger|
trigger.info = "DB up procedure ..."
trigger.run_remote = {inline: "/srv/dbBackup/bootstrap-db_up.sh"}
end
db.trigger.before :destroy, :halt, :suspend do |trigger|
trigger.info = "DB down procedure ..."
trigger.run_remote = {inline: "/srv/dbBackup/bootstrap-db_down.sh"}
end
end
end
bootstrap-db_down.sh:
#!/usr/bin/env bash
export MYSQL_PWD="pass"
USER="user"
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
BACKUP_DIR="/srv/dbBackup/$TIMESTAMP"
mkdir -p "$BACKUP_DIR"
databases=`mysql -u $USER -e "SHOW DATABASES;" | tr -d "| " | grep -v Database`
for db in $databases; do
if [[ "$db" != "information_schema" ]] && [[ "$db" != "performance_schema" ]] && [[ "$db" != "sys" ]] && [[ "$db" != "mysql" ]] && [[ "$db" != _* ]] ; then
echo "Dumping database: $db"
mysqldump -u $USER --databases $db > "$BACKUP_DIR/backupdb.$db.sql"
fi
done