Increment variable each time a definition is called.

2094 views
Skip to first unread message

Douglas Garstang

unread,
Sep 27, 2011, 6:12:16 PM9/27/11
to Puppet Users
I want to set a variable in a class, and then increment the value of
that variable each time a definition is called. Since I have to
qualify the variable in the definition, like so:

$platform::proxy::config::ssl_port_start

I tried this:

$platform::proxy::config::ssl_port_start =
$platform::proxy::config::ssl_port_start + 1

but then puppet complains:

"Cannot assign to variables in other namespaces at..."

.... and since I have to qualify the original variable.... ugh.... how
can I do this?

Doug

Dan Bode

unread,
Sep 27, 2011, 6:20:18 PM9/27/11
to puppet...@googlegroups.com
I can think of something really hacky that I don't recommend for production, it could be ok for debugging purposes.

notice(inline_template( '<%= $dangerous_counter = $dangerous_counter || 0; $dangerous_counter = $dangerous_counter + 1 %>' ))

will create a global variable in Ruby, I have a feeling that this will increment for all nodes if you are running a master though.


--
You received this message because you are subscribed to the Google Groups "Puppet Users" group.
To post to this group, send email to puppet...@googlegroups.com.
To unsubscribe from this group, send email to puppet-users...@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/puppet-users?hl=en.


Douglas Garstang

unread,
Sep 27, 2011, 6:25:35 PM9/27/11
to puppet...@googlegroups.com
On Tue, Sep 27, 2011 at 3:20 PM, Dan Bode <d...@puppetlabs.com> wrote:
> I can think of something really hacky that I don't recommend for production,
> it could be ok for debugging purposes.
>
> notice(inline_template( '<%= $dangerous_counter = $dangerous_counter || 0;
> $dangerous_counter = $dangerous_counter + 1 %>' ))
>
> will create a global variable in Ruby, I have a feeling that this will
> increment for all nodes if you are running a master though.

I hope that's not the only way. What I'm trying to do here isn't that
unusual. I have an several instances of an application running, each
with different port numbers. The definition sets the values for the
instance, but rather than listing the port numbers, which can cause
copy and paste errors, I wanted to have the port numbers auto
incremented from a base value.

Doug.

Daniel Pittman

unread,
Sep 27, 2011, 6:40:30 PM9/27/11
to puppet...@googlegroups.com
On Tue, Sep 27, 2011 at 15:20, Dan Bode <d...@puppetlabs.com> wrote:
> I can think of something really hacky that I don't recommend for production,
> it could be ok for debugging purposes.

Yeah, this is *totally* not a sane thing to do. Really not sane.
Find a better way to solve your problem.

That said, you can also use defined types recursively in Puppet:

define foo() {
if ($name == 0) {
notice("done")
}
else
{
notice("bar is $name")
$bar = $name - 1
foo { $bar: }
}
}

foo { "4": }

Daniel
--
⎋ Puppet Labs Developer – http://puppetlabs.com
♲ Made with 100 percent post-consumer electrons

Douglas Garstang

unread,
Sep 27, 2011, 6:55:21 PM9/27/11
to puppet...@googlegroups.com
On Tue, Sep 27, 2011 at 3:40 PM, Daniel Pittman <dan...@puppetlabs.com> wrote:
> On Tue, Sep 27, 2011 at 15:20, Dan Bode <d...@puppetlabs.com> wrote:
>> I can think of something really hacky that I don't recommend for production,
>> it could be ok for debugging purposes.
>
> Yeah, this is *totally* not a sane thing to do.  Really not sane.
> Find a better way to solve your problem.
>
> That said, you can also use defined types recursively in Puppet:
>
> define foo() {
>  if ($name == 0) {
>    notice("done")
>  }
>  else
>  {
>    notice("bar is $name")
>    $bar = $name - 1
>    foo { $bar: }
>  }
> }
>
> foo { "4": }

Taking that one step further, I tried:


define platform::proxy::instance ( $ssl_port ) {
if ( $name == 0 ) {
} else {


$bar = $name - 1

$ssl_port = $ssl_port + 1
platform::proxy::instance { $bar: ssl_port => $ssl_port }
}
}

platform::proxy::instance { 16: ssl_port => 8557; }

However, this gives the error:

Cannot reassign variable ssl_port at...

*sigh*

Doug.

Jason Slagle

unread,
Sep 27, 2011, 6:55:20 PM9/27/11
to puppet...@googlegroups.com

On Tue, 27 Sep 2011, Douglas Garstang wrote:

> I hope that's not the only way. What I'm trying to do here isn't that
> unusual. I have an several instances of an application running, each
> with different port numbers. The definition sets the values for the
> instance, but rather than listing the port numbers, which can cause
> copy and paste errors, I wanted to have the port numbers auto
> incremented from a base value.

Call me crazy, but I'm not sure I see the "common use case" here. Puppet
does not process a manifest top down (Well at least not in a way that you
expect).

At best I would expect these port numbers to change at every addition. At
worst, I can see them changing every run. I presume you're going to use
these numbers elsewhere to configure some front end. I'm not sure you'd
want it reloading your apache, etc all the time as the port numbers bounce
around.

If you REALLY wanted to do something like this, I might suggest you
create a type, and define the namevar in such a way as to ensure you
cannot have overlap.

Jason

--
Jason Slagle - RHCE5, VCP4
/"\ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
\ / ASCII Ribbon Campaign .
X - NO HTML/RTF in e-mail .
/ \ - NO Word docs in e-mail .


Douglas Garstang

unread,
Sep 27, 2011, 7:02:37 PM9/27/11
to puppet...@googlegroups.com
On Tue, Sep 27, 2011 at 3:55 PM, Jason Slagle <rais...@tacorp.net> wrote:
>
>
> On Tue, 27 Sep 2011, Douglas Garstang wrote:
>
>> I hope that's not the only way. What I'm trying to do here isn't that
>> unusual. I have an several instances of an application running, each
>> with different port numbers. The definition sets the values for the
>> instance, but rather than listing the port numbers, which can cause
>> copy and paste errors, I wanted to have the port numbers auto
>> incremented from a base value.
>
> Call me crazy, but I'm not sure I see the "common use case" here.  Puppet
> does not process a manifest top down (Well at least not in a way that you
> expect).

How's that relevant? I'm not declaring various resource types. I'm
either calling definitions (in which case I'm pretty sure it does them
in a top-down order), or doing it programatically.

>
> At best I would expect these port numbers to change at every addition.  At
> worst, I can see them changing every run.  I presume you're going to use
> these numbers elsewhere to configure some front end.  I'm not sure you'd
> want it reloading your apache, etc all the time as the port numbers bounce
> around.

I don't follow you. Why would the port numbers change around if they
where programatically generated? Not that I can do that anyway, as
you'll see in a followup post, as I cant reassign variables.

Doug.

Douglas Garstang

unread,
Sep 27, 2011, 7:07:54 PM9/27/11
to puppet...@googlegroups.com

Got it...

define platform::proxy::instance ( $ssl_port ) {
if ( $name == 0 ) {
} else {
$bar = $name - 1

$ssl_port_in = $ssl_port + 1
notice ("ssl_port = $ssl_port_in")
platform::proxy::instance { $bar: ssl_port => $ssl_port_in }
}
}

Jurgen

unread,
Aug 7, 2013, 6:52:06 AM8/7/13
to puppet...@googlegroups.com
Douglas Garstang <doug.garstang <at> gmail.com> writes:

>how can I do this?



you ever find a way to do this? I am looking for the same thing.

jcbollinger

unread,
Aug 7, 2013, 8:51:26 AM8/7/13
to puppet...@googlegroups.com

The values of Puppet variables cannot be changed once set.  If you somehow found a way around that restriction then it would necessarily involve manipulating a Puppet bug, therefore you would have no guarantee that it would continue to work if you change anything.  Just don't do it.

Instead, take a step back and consider the larger objective you are trying to achieve, rather than focusing on this particular, unviable, approach to achieving it.  If you explain, then we may be able to help devise an alternative approach.


John

Reply all
Reply to author
Forward
0 new messages