Я раскручиваю несколько виртуальных машин с помощью vagrant, это мой vagrantfile (до первого хоста, удаление комментариев):
# Installed Vagrant Version: 2.2.14
Vagrant.configure("2") do |config|
config.vm.box = "bento/ubuntu-20.04"
config.vm.provider :virtualbox
mount_new_disk = <<-SCRIPT
sudo useradd -m -s /bin/bash -G sudo testuser1
sudo echo -e "123\n123"|sudo passwd testuser1
sudo mkdir /mnt/da
sudo mkfs -t ext4 /dev/sdb
sudo mount /dev/sdb /mnt/da
echo "/dev/sdb /mnt/da ext4 auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0" |sudo tee -a /etc/fstab
SCRIPT
make_default_gw = <<-SCRIPT
superda=$(sudo ip route show|head -1|awk '{print $3}');if ! [[ $superda =~ "192.168.1.254" ]]; then echo "router is not default, removing";sudo ip route del default via $superda ;else echo "yes it's default, gud";fi
SCRIPT
nfs_host = <<-SCRIPT
sudo apt update
sudo apt install nfs-kernel-server
echo "/mnt/da 10.118.8.0/24(rw,sync,no_subtree_check)"|sudo tee -a /etc/exports
sudo chown nobody:nogroup /mnt/da
sudo chmod 777 /mnt/da
sudo systemctl restart nfs-kernel-server
sudo ufw allow from 10.118.8.0/24 to any port nfs
sudo ufw allow from 10.118.8.0/24 to any port ssh
sudo ufw enable
SCRIPT
nfs_client = <<-SCRIPT
sudo apt update
sudo apt install nfs-common
sudo mkdir /mnt/nfs
sudo mount 10.118.8.10:/mnt/da /mnt/nfs
echo "10.118.8.10:/mnt/da /mnt/nfs nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0" |sudo tee -a /etc/fstab
SCRIPT
config.vm.define "da1" do |da1|
da1.vm.synced_folder ".", "/vagrant", disabled: true
da1.vm.disk :disk, name: "backup", size: "10GB"
da1.vm.hostname = "da1"
da1.vm.network "private_network", ip: "10.118.8.10"
da1.vm.network "public_network", use_dhcp_assigned_default_route: true, netmask: "255.255.255.0", bridge: "Intel(R) I211 Gigabit Network Connection"
da1.vm.provision :shell, :inline => mount_new_disk
da1.vm.provision :shell, :inline => make_default_gw
da1.vm.provision :shell, :inline => nfs_host
config.ssh.forward_agent = true
end
config.vm.define "da2" do |da2|
da2.vm.synced_folder ".", "/vagrant", disabled: true
da2.vm.disk :disk, name: "backup", size: "10GB"
da2.vm.hostname = "da2"
da2.vm.network "private_network", ip: "10.118.8.11"
da2.vm.network "public_network", use_dhcp_assigned_default_route: true, netmask: "255.255.255.0", bridge: "Intel(R) I211 Gigabit Network Connection"
config.vm.provision :shell, :inline => mount_new_disk
config.vm.provision :shell, :inline => make_default_gw
config.vm.provision :shell, :inline => nfs_client
config.ssh.forward_agent = true
end
config.vm.define "da3" do |da3|
da3.vm.synced_folder ".", "/vagrant", disabled: true
da3.vm.disk :disk, name: "backup", size: "10GB"
da3.vm.hostname = "da3"
da3.vm.network "private_network", ip: "10.118.8.12"
da3.vm.network "public_network", use_dhcp_assigned_default_route: true, netmask: "255.255.255.0", bridge: "Intel(R) I211 Gigabit Network Connection"
# da3.vm.network "forwarded_port", guest: 22, host: 5555
config.vm.provision :shell, :inline => mount_new_disk
config.vm.provision :shell, :inline => make_default_gw
config.vm.provision :shell, :inline => nfs_client
config.ssh.forward_agent = true
end
Теперь скрипты mount_new_disk
и make_default_gw
должен работать на всех хостах, тогда как nfs_host
должен работать только на da1
, а nfs_client
должен работать только на da [23]
].
Но для некоторых readon каждый сценарий запускается на каждом хосте, и они также запускаются несколько раз.
Обратите внимание, что в руководстве, которому я следовал, было написано config.vm.provision: shell,: inline => mount_new_disk
, но я также пробовал с da1.vm.provision: shell,: inline => mount_new_disk
с тем же результатом.
Например: я напишу эхо «ЗАПУСК СЦЕНАРИЯ: ...»
вверху и эхо «ЗАПУСК КОНЦЕПТА СЦЕНАРИЯ: ...»
внизу каждый скрипт, чтобы узнать, какой и сколько раз он запускался (захватил результат и затем обработал его grep):
unu@here:~/yes$ grep -n 'RUNNING SCRIPT' opt
44: da1: RUNNING SCRIPT START: mount_new_disk
62: da1: RUNNING SCRIPT STOP: mount_new_disk
65: da1: RUNNING SCRIPT START: make_default_gw
67: da1: RUNNING SCRIPT STOP: make_default_gw
70: da1: RUNNING SCRIPT START: nfs_client
120: da1: RUNNING SCRIPT STOP: nfs_client
123: da1: RUNNING SCRIPT START: mount_new_disk
137: da1: RUNNING SCRIPT STOP: mount_new_disk
140: da1: RUNNING SCRIPT START: make_default_gw
142: da1: RUNNING SCRIPT STOP: make_default_gw
145: da1: RUNNING SCRIPT START: nfs_client
174: da1: RUNNING SCRIPT STOP: nfs_client
177: da1: RUNNING SCRIPT START: mount_new_disk
191: da1: RUNNING SCRIPT STOP: mount_new_disk
194: da1: RUNNING SCRIPT START: make_default_gw
196: da1: RUNNING SCRIPT STOP: make_default_gw
199: da1: RUNNING SCRIPT START: nfs_host
261: da1: RUNNING SCRIPT STOP: nfs_host
Как видите, он запускал все скрипты (даже те, которые не были упомянуты в их собственном разделе конфигурации), запускал их несколько раз.
Как ни странно, на da2, который является клиентом nfs, он не запускал скрипт nfs_host
, но все остальное выполнялось дважды:
unu@here:~/yes$ grep -n 'RUNNING SCRIPT' noua
41: da2: RUNNING SCRIPT START: mount_new_disk
61: da2: RUNNING SCRIPT STOP: mount_new_disk
64: da2: RUNNING SCRIPT START: make_default_gw
66: da2: RUNNING SCRIPT STOP: make_default_gw
69: da2: RUNNING SCRIPT START: nfs_client
118: da2: RUNNING SCRIPT STOP: nfs_client
121: da2: RUNNING SCRIPT START: mount_new_disk
134: da2: RUNNING SCRIPT STOP: mount_new_disk
137: da2: RUNNING SCRIPT START: make_default_gw
139: da2: RUNNING SCRIPT STOP: make_default_gw
142: da2: RUNNING SCRIPT START: nfs_client
171: da2: RUNNING SCRIPT STOP: nfs_client
Теперь я знаю, что могу просто поставить все это в самом разделе конфигурации, например:
config.vm.define "da1" do |da1|
da1.vm.synced_folder ".", "/vagrant", disabled: true
da1.vm.disk :disk, name: "backup", size: "10GB"
da1.vm.hostname = "da1"
da1.vm.network "private_network", ip: "10.118.8.10"
da1.vm.network "public_network", use_dhcp_assigned_default_route: true, netmask: "255.255.255.0", bridge: "Intel(R) I211 Gigabit Network Connection"
da1.vm.provision :shell, :inline => mount_new_disk
da1.vm.provision :shell, :inline => make_default_gw
da1.vm.provision :shell, :inline => nfs_host
da1.vm.provision :shell, :inline => <<-SCRIPT
echo "yohoho and a bottle of rum!"
SCRIPT
config.ssh.forward_agent = true
Но другой способ, просто вызвать его при необходимости, намного удобнее.
Кто-нибудь знает, почему это происходит? И как это исправить?
Обнаружил проблему: мне нужно заменить config.vm.provision: shell,: inline => имя_сценария
с соответствующим именем виртуальной машины, в зависимости от блока конфигурации.
Итак, для da1
я сделал da1.vm.provision: shell,: inline => script_name
, для da2
я сделал da2.vm .provision: shell,: inline => script_name
, а для da3
я сделал da3.vm.provision: shell,: inline => script_name
.