how do I override this File resource

28 views
Skip to first unread message

kdo

unread,
Apr 21, 2016, 9:12:21 PM4/21/16
to Puppet Users
Hi all,

i am trying to build a module to install Oracle server on Linux that utilises defined types in the module oradb::installdb.pp

one of the checks in the oradb::installdb is this 

if ! defined(File["${download_dir}/db_install_${version}.rsp"]) 

so in order to override this file definition and source my own custom response file, I would need to have a file resource in my custom manifest that defines File["${download_dir}/db_install_${version}.rsp"] ? 

so in my custom manifest I have that exact file defined as follows :

   file { "${download_dir}/db_install_${version}.rsp":
           ensure  => 'present',
           content => template("${module_name}/oracle/server/db_install_AWS_${version}_binary.rsp.erb"),
           mode    => '0775',
           owner   => $user,
           group   => $group,
       }

the file get's setup ok but then get's over written because this check is true if ! defined(File["${download_dir}/db_install_${version}.rsp"])  so it doesn't find the defined file resource.

can anyone see where I am going wrong ?

jcbollinger

unread,
Apr 22, 2016, 9:19:15 AM4/22/16
to Puppet Users


On Thursday, April 21, 2016 at 8:12:21 PM UTC-5, kdo wrote:
Hi all,

i am trying to build a module to install Oracle server on Linux that utilises defined types in the module oradb::installdb.pp

one of the checks in the oradb::installdb is this 

if ! defined(File["${download_dir}/db_install_${version}.rsp"]) 

so in order to override this file definition and source my own custom response file, I would need to have a file resource in my custom manifest that defines File["${download_dir}/db_install_${version}.rsp"] ? 


If another File resource bearing the specified title has already been declared at the time that conditional is evaluated, then the conditional evaluates to false, and the code it protects is not evaluated.  Typically, that code would be the module's own declaration of the File, but it could be anything.

Note, however, that for this to be effective, the File resource to be tested must already have been declared.  The defined() function is necessarily sensitive to evaluation order, making its use questionable at best in most circumstances.  This is not your present problem, however, because if evaluation order were tripping you up in this case then catalog building would fail with a duplicate resource declaration (so defined() isn't even reliable for its intended purpose).



so in my custom manifest I have that exact file defined as follows :

   file { "${download_dir}/db_install_${version}.rsp":
           ensure  => 'present',
           content => template("${module_name}/oracle/server/db_install_AWS_${version}_binary.rsp.erb"),
           mode    => '0775',
           owner   => $user,
           group   => $group,
       }

the file get's setup ok but then get's over written because this check is true if ! defined(File["${download_dir}/db_install_${version}.rsp"])  so it doesn't find the defined file resource.



Do observe that the name of the File in the condition contains interpolations of two unqualified variables.  If either of those variables has a different value in the scope of your class than it does in class oradb::installdb then your File does not, in fact, prevent the one in oradb from being declared.

 
can anyone see where I am going wrong ?


Consider also that Puppet's catalog builder has no knowledge of symlinks (or hard links) on the target machine.  If there is more than one path to the same physical file, then it is possible to manage it as more than one resource.

Nevertheless, I'm inclined to guess that you are not, in fact, managing the file you think you are managing, on account of differing variable interpolations.  Of course, this supposes that your custom class is being applied to the target node at all.


John

Reply all
Reply to author
Forward
0 new messages