What is the effect of the 'require' metaparameter when ensure is set to absent, i.e. when a resource
is removed? It seems that changes to the required resource are applied before changes to the requiring
resource are applied - is that always the case?
When one resource (R1) depends on another resource (R2) to be able to be created, having R1::require=>R2 works as expected - R2 is created first, then R1. (My case is where R2 is a configuration file that has to be present for R1 to be created). But now in my case, R2 has to be present for R1 to be removed as well. Having R1::require=>R2 and both R1::ensure=>absent and R2::ensure=>absent results in R2 being removed before R1 is removed; where I am trying to get R1 removed before R2 is removed.
Is this possible to achieve with Puppet?
Here's a simple test that I put together:
class test ($ensure) {
file {'test1':
path => '/tmp/test1',
content => 'test1',
ensure => $ensure,
#require => File['test0']
}
}
class outer ($ensure) {
file {'test0':
path => '/tmp/test0',
content => 'test0',
ensure => $ensure,
#
}
class { 'test':
ensure => $ensure,
}
}
class {'outer':
ensure => present,
#ensure => absent,
}
Comment out the 'require => File['test0'], change outer::ensure => present:
Notice: /Stage[main]/Test/File[test1]/ensure: created
Notice: /Stage[main]/Outer/File[test0]/ensure: created
Notice: Finished catalog run in 0.19 seconds
This sequence is as expected.
Change outer::ensure => absent:
Notice: /Stage[main]/Test/File[test1]/ensure: removed
Notice: /Stage[main]/Outer/File[test0]/ensure: removed
Notice: Finished catalog run in 0.26 seconds
This sequence is also as expected, but I don't think there will be a guaranteed order of execution.
Uncomment 'require => File['test0'] and outer::ensure => present:
Notice: /Stage[main]/Outer/File[test0]/ensure: created
Notice: /Stage[main]/Test/File[test1]/ensure: created
Notice: Finished catalog run in 0.19 seconds
Also as expected.
Change outer::ensure => absent:
Notice: /Stage[main]/Outer/File[test0]/ensure: removed
Notice: /Stage[main]/Test/File[test1]/ensure: removed
Notice: Finished catalog run in 0.22 seconds
This is not the desired sequence - I want to get test1 removed first. Any way to do that?