On Tuesday, January 5, 2016 at 11:01:57 AM UTC-6, linux script wrote:
>
> John,
>
> Sorry for the typos in the code.for some reason I had to type the code 
> instead of  copying.I thought it would give a general idea about the format 
> in which I wanted to write it.
>
> Secondly, I used define inside a class because I could not see a way to 
> call the define inside another class which is out of it.
>
> Let's say if I define something like *modules/profile/manifests/**user.pp*
> *:*
> define user (username=$name){
> }
>


That declaration is not what you want.  Compare it to my example: you are 
declaring a defined type named "user", but you put it in the file where 
Puppet will look for one named "profile::user".  Puppet uses class and 
defined type names to find and load their definitions, but it does not use 
filesystem paths to *assign* class or defined type names.  You always get 
exactly the name you declare.  With the declaration you presented, in the 
file you specified, Puppet will not be able to find defined type "user" (it 
would look in file modules/user/manifests/init.pp, instead), and it will 
not be able to find any defined type "profile::user" because you have not, 
in fact, defined such a type.

 

> I want to call it into parms.pp where I assign all my variables related to 
> this module something like below.$name should expand into actual user name 
> which is passed through init.pp
>
> class profile::params {
>   $bashrc_host        = "modules/profile/$fqdn_$name_bashrc"
>   $bashrc                  = '/home/$name/.bashrc'
> }
>


It seems unlikely to be a good design to declare defined-type instances in 
a params class, but once you get the name and location sorted out you 
certainly could do so.  You should reference it by its full name, for 
example

profile::user { 'user1': }

If you mean that you want profile::user instances to be able to access 
variables from class profile::params, then it could hardly be simpler: you 
can reference those variables from anywhere in your manifest set by means 
of their qualified names.  For example, $profile::params::bashrc.

The only caveat (and it applies everywhere), is that the definition of the 
host class (profile::params) must have been evaluated before that access -- 
but not necessarily in the same scope as the variable reference.  Because 
classes are singletons, and especially for unparameterized classes such as 
yours, it is safe to declare the same class multiple times via include-like 
declarations.  For Puppet 2.7, that means via either the 'include' function 
or the 'require' function.

As such, it might be entirely reasonable and appropriate for the defined 
type body to 'include' class profile::params:

define profile::user($param1, $param2) {
  include '::profile::params'
  # now assuredly safe to access $profile::params::bashrc, etc.

  # ...
}

 

> I am using puppet 2.7.hence I cannot use iterations to make it happen.
>
>

Puppet 4's iteration features are convenient*, *but not essential.  In any 
event, I don't see how it makes a difference for this purpose whether they 
are available or not.  That is, I know you must be using an array title to 
declare multiple defined type instances, but

   1. myself, I'd strongly consider doing this particular job that way 
   anyway;
   2. as I already said, data access does not depend on lexical scope; and
   3. the central problem seems to revolve around how to create a defined 
   type, which is substantially the same in Puppet 4 as it was in Puppet 2.
   


John

-- 
You received this message because you are subscribed to the Google Groups 
"Puppet Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to puppet-users+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/puppet-users/bd9c3d49-144a-4b96-8d20-a65506e14a22%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to