Global triggers to run once in multi-machine setup

20 views
Skip to first unread message

Andrii Senkovych

unread,
Feb 17, 2020, 7:05:49 AM2/17/20
to Vagrant
Dear community,

I'm looking for a way to run a single trigger for a single command i(i.e. "vagrant up") inside a multi-machine environment to play with Ansible. I've defined a trigger to download a pubkey that will be used in Dockerfile, i.e. when "vagrant up" command "issues a "docker build" command under the hood, but instead trigger runs for every defined machine. My shortened Vagrantfile looks like this:

Vagrant.configure("2") do |config|
  # Check and download vagrant pubkey to include in the Docker images
  config.trigger.before :up do |trigger|
    trigger.name = "Prepare insecure Vagrant SSH public key"
    trigger.ruby do |env, machine|
      vagrant_pubkey_url = "https://raw.githubusercontent.com/hashicorp/vagrant/master/keys/vagrant.pub"
      vagrant_pubkey_name = ".vagrant/vagrant.pub"

      if (not File.file?(vagrant_pubkey_name))
        trigger.info = "Vagrant's insecure SSH public key is not present. Downloading..."
        open(vagrant_pubkey_url) do |pubkey|
          File.open(vagrant_pubkey_name, "wb") do |pubkey_file|
            pubkey_file.write(pubkey.read)
            trigger.info = "Download complete. Saved key to #{vagrant_pubkey_name}"
          end
        end
      end
    end
  end

  kinds = ["app", "db", "www"]
  images = [{distribution: "debian", dockerfile: "debian10-systemd.Dockerfile"}]

  kinds.each do |server_type|
    (1..images.length).zip(images).each do |index, image|
      node_name = "#{server_type}#{index}-#{image[:distribution]}"
      config.vm.define "#{node_name}" do |node|
        node.vm.network :private_network, type: "dhcp"
        node.vm.provider "docker" do |docker|
          docker.name = node_name
          docker.build_dir = "."
          docker.has_ssh = true
          docker.dockerfile = "dockerfiles/#{image[:dockerfile]}"
          docker.create_args = ["--rm", "--privileged", "-v", "/sys/fs/cgroup:/sys/fs/cgroup:ro"]
        end
      end
    end
  end
end

In this configuration we should get 3 containers named "app1-debian", "db1-debian", "www1-debian".

I expected my trigger would run only once since it is defined outside of node creation loop. But when I run "vagrant up", trigger is fired 3 times. Moreover even though there is some code that checks file existence, it is downloaded 3 times as well. Next time I run "vagrant up", the file won't be downloaded, as if the code is run once on initial Vagrantfile read.

I'd like to use similar global trigger to run Ansible playbook to check network connectivity between all hosts but currently I get it run after each container is up and not after all containers are up that leads to run checks multiple times with different number of hosts (1, 2 and finally, 3 hosts).

Full configuration is available here: https://github.com/jollyroger/test-infra-vagrant-ansible

Brian Cain

unread,
Feb 18, 2020, 12:12:39 PM2/18/20
to vagra...@googlegroups.com
Hey there -

You will need to make your trigger a command trigger. By default, globally defined triggers run for each guest. If you wish for them to run once before or after
a given command, you can make it a command trigger:

config.trigger.before :up, type: :command do |trigger|
  # configuration here
end

More information can be found in this subsection for vagrant triggers in the documentation: https://www.vagrantup.com/docs/triggers/usage.html#commands

Thanks!

--
This mailing list is governed under the HashiCorp Community Guidelines - https://www.hashicorp.com/community-guidelines.html. Behavior in violation of those guidelines may result in your removal from this mailing list.
 
GitHub Issues: https://github.com/mitchellh/vagrant/issues
IRC: #vagrant on Freenode
---
You received this message because you are subscribed to the Google Groups "Vagrant" group.
To unsubscribe from this group and stop receiving emails from it, send an email to vagrant-up+...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/vagrant-up/24d7ebd6-6b23-4474-b184-65e795e4f948%40googlegroups.com.


--
Brian Cain

Andrii Senkovych

unread,
Feb 24, 2020, 5:18:06 AM2/24/20
to vagra...@googlegroups.com
Hi, Brian

Thanks, after setting VAGRANT_EXPERIMENTAL=typed_triggers your snippet worked!

вт, 18 лют. 2020 о 19:12 Brian Cain <bc...@hashicorp.com> пише:
> To view this discussion on the web visit https://groups.google.com/d/msgid/vagrant-up/CADHESCVcunZ%3DOPdHgMwmfkZyERrDza06i32WwwPBTtDjEZ5--g%40mail.gmail.com.



--
WBR, Andrii Senkovych
Reply all
Reply to author
Forward
0 new messages