I have a general question and a specific question that are related.
The general question: Is it possible to have the dependencies (commands that "require") of a command execute even if the command fails? Meaning create a sort of soft dependency where I would like the command to be performed but if it fails execute the things that depend on it anyway.
Specifically: I have an 'Exec' that runs 'apt-get update'. Several commands 'require' this 'Exec' (e.g. ensuring that a package is installed). However, after an initial provisioning it's not absolutely necessary that 'apt-get update' gets run since those packages will be installed already. The 'apt-get update' is failing occasionally due to a slightly unreliable apt repo. I'd like all of the dependent tasks to execute after the 'apt-get update', but still execute even if it fails. Ideally I would like to be able to have an attribute on an 'Exec' (or really any puppet type) that says that it may fail and to just display a warning. As far as I can tell, such a attribute doesn't exist.
My current thought is to set up a dummy Exec that just runs 'true', but have it notify another Exec that performs the real 'apt-get update'. Something like this (untested):
exec { "apt-get update":
command => "true",
notify => Exec["real apt-get update"]
}
exec { "real apt-get update":
command => "apt-get update"
}
Will this approach work in the way I intend? Commands that want a "soft" dependency on "apt-get update" will `require => Exec["apt-get update"]` which will always succeed but as a side effect perform the "real apt-get update" command. Will the `notify` cause "real apt-get update" to be performed during every deploy? And will the dependency/ordering graph be built such that "real apt-get update" gets executed before any of the other commands that `require => Exec["apt-get update"]`?
This also brings up a third question that I thought of while formulating my thoughts for this question: Why are dependency and ordering linked in puppet? It seems to me that ideally there should be a way to specify that command A is performed before command B without making command B depend on command A. For example:
exec { "apt-get update":
command => "true"
}
exec { "real apt-get update":
command => "apt-get update",
before => Exec["apt-get update"]
}
I should be able to use "before" or "after" to specify ordering and "require" to specify dependence. If I'm missing something fundamental here about dependencies and ordering (or if I am fighting the paradigm) I'd appreciate the enlightenment.
Thanks for your help,
-- Bryan Traywick