deploy artifacts - but download them only once, not for each host ?

Hi,

we are working on some playbooks that will deploy Maven artifacts (*.tar, *.zip) to our target environments.
Due to the fact the target environment cannot directly access the Nexus Server (artifact repository) we need first to download them onto the control-machine

  • and copy/ synchronize from there to the target servers.

When we implement the “download from Nexus” as just a simple task (inside a role) - it would be executed for each host when the playbook is run.

`
for( host : hosts )
{
task: download
task: copy to host
task: install to host
}

`

Is there any way to execute “run only once” tasks, before looping over all hosts is executed ?

`
pre-task: download
for( host : hosts )
{
task: copy to host
task: install to host
}

`

Some kind of “hook” where we can put preparation tasks ?

Thanx for any hints,

Torsten

separate it into 2 plays, the first using hosts: localhost (or the control server), this runs all the tasks you only want to run once (downloads), the 2nd play can have the deploy to the target hosts.

You can have multiple plays per file and per invocation.

Thanx, Brian,

sounds like an easy solution - but what about encapsulation? I need to break down things than into

  • preparation steps (artifact to be downloaded)
  • roles that are executed - and depend on those artifacts

Can I keep all “encapsulated” in one role ?

Thx, Torsten

not sure why you need to encapsulate at role level, just put both plays in same file.

you cannot do host selection at roles anyway, that is a play property

The get_url module can take a md5sum that can be used to avoid repeated downloads.

There is also a “force” parameter which can avoid downloads if the file is already there.

If using sudo, however, sometimes this force detection, due to permissions, can not engage.