Vagrant запускает встроенные скрипты несколько раз, и те, которые не были определены

Я раскручиваю несколько виртуальных машин с помощью 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

Но другой способ, просто вызвать его при необходимости, намного удобнее.

Кто-нибудь знает, почему это происходит? И как это исправить?

0
задан 23 April 2021 в 01:02

1 ответ

Обнаружил проблему: мне нужно заменить 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 .

0
ответ дан 23 April 2021 в 23:19

Другие вопросы по тегам:

Похожие вопросы: