Бродячая команда выполнения для определенного гостя после того, как другие гости работают

У меня есть следующий Vagrantfile:

Vagrant.configure(VAGRANT_API_VERSION) do |config|
  config.vm.provider "virtualbox" do |vb|
    vb.memory = 1024
    vb.cpus = 2
  end

  config.vm.define :master do |master_config|
    master_config.vm.box = "centos/7"
    master_config.vm.host_name = 'saltmaster.local'
    master_config.vm.network "private_network", ip: "172.16.10.10"
    master_config.vm.synced_folder ".", "/vagrant", disabled: true
    master_config.vm.synced_folder "states", "/vagrant/states", type: "virtualbox"
    master_config.vm.synced_folder "pillar", "/vagrant/pillar", type: "virtualbox"

    master_config.vm.provision :salt do |salt|
      salt.master_config = "etc/master"
      salt.install_type = "git"
      salt.install_args = "v2016.11.7"
      salt.no_minion = true
      salt.install_master = true
      salt.verbose = true
      salt.colorize = true
      salt.bootstrap_options = "-P -c /tmp"
    end
  end

  config.vm.define :minion1 do |minion_config|
    minion_config.vm.box = "centos/7"
    minion_config.vm.host_name = 'saltminion1.local'
    minion_config.vm.network "private_network", ip: "172.16.10.11"
    minion_config.vm.synced_folder ".", "/vagrant", disabled: true

    minion_config.vm.provision :salt do |salt|
      salt.minion_config = "etc/minion1"
      salt.install_type = "git"
      salt.install_args = "v2016.11.7"
      salt.verbose = true
      salt.colorize = true
      salt.bootstrap_options = "-P -c /tmp"
    end
  end

  config.vm.define :minion2 do |minion_config|
    minion_config.vm.box = "centos/7"
    minion_config.vm.host_name = 'saltminion2.local'
    minion_config.vm.network "private_network", ip: "172.16.10.12"
    minion_config.vm.synced_folder ".", "/vagrant", disabled: true

    minion_config.vm.provision :salt do |salt|
      salt.minion_config = "etc/minion2"
      salt.install_type = "git"
      salt.install_args = "v2016.11.7"
      salt.verbose = true
      salt.colorize = true
      salt.bootstrap_options = "-P -c /tmp"
    end
  end

end

Теперь, когда все машины запущены и работают, я хочу выполнить команду на мастере соли, используя master_config.vm.provision "shell", inline: "salt '*' state.apply".

Но проблема в том, что как только Vagrant завершит подготовку minion2, он больше не сможет получить доступ к машине master_config. Я думаю, что должен быть способ выполнить эту команду, не выполняя vagrant ssh master -c stalt '*' state.apply. Я не хочу использовать команду на хосте. И высокое состояние необходимо применять ПОСЛЕ того, как все миньоны включены, из-за некоторых конфигураций и состояний, связанных с сетью.

Кто-нибудь может мне помочь?


person Haije Ploeg    schedule 07.09.2017    source источник
comment
вы можете посмотреть плагин бродячих триггеров (github.com/emyl/vagrant-triggers)   -  person Frederic Henri    schedule 07.09.2017
comment
@FrédéricHenri Да, мы рассмотрели это, но мы хотим, чтобы это выполнялось только при первом запуске vagrant up, а не при каждом изменении, то есть только на этапе начальной загрузки.   -  person Haije Ploeg    schedule 08.09.2017
comment
Начиная с версии 0.5.0, триггеры также можно запускать как средство инициализации, поэтому они будут иметь свойство инициализации и будут запускаться только один раз при инициализации экземпляра.   -  person Frederic Henri    schedule 08.09.2017
comment
@FrédéricHenri, поэтому мне нужно что-то вроде: config.vm.provision "trigger", ... Но тогда мой квест остается. Как запустить это после того, как мастер, миньон1 и миньон2 запущены и работают? Потому что после того, как они встанут, мне нужно выполнить команду на мастере соли. Я не могу уложить это в голове. Потому что как я могу нацелиться на мастер-машину соли?   -  person Haije Ploeg    schedule 08.09.2017


Ответы (1)


... продолжение комментариев, сделанное здесь для примера.

Вы можете использовать плагин бродячих триггеров. Как упоминалось в документе:

Начиная с версии 0.5.0, триггеры также можно запускать в качестве поставщика.

поэтому следующее в конце файла должно работать:

  config.vm.provision "trigger", :vm => "minion_config" do |trigger|
    trigger.fire do
      run "script"
    end
  end
person Frederic Henri    schedule 08.09.2017
comment
Спасибо, что решили одну проблему. Но теперь часть, которая мне нужна, чтобы выполнить highstate на мастере соли. Я хочу, чтобы это был config.vm.provision "shell", inline: "salt '*' state.apply", и я действительно хочу предотвратить использование vagrant ssh salt .... Как я могу получить доступ к объекту saltmaster после того, как он будет подготовлен? - person Haije Ploeg; 08.09.2017
comment
подготовка выполняется по порядку, поэтому, если у вас есть программа подготовки триггера после всех остальных, vagrant выполнит команду в конце, триггер может запустить команду на физическом сервере или удаленной машине, поэтому он позаботится о части vagrant ssh ... - person Frederic Henri; 13.09.2017