Problem with duplicate definitions

8 views
Skip to first unread message

tarjei

unread,
Jul 3, 2008, 6:00:20 AM7/3/08
to puppet...@googlegroups.com
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Hi, I'm trying to set up a system to deploy a set of different python
services that each will be run as a separate user with different
packages installed.

The basic code is:

define easy_install($app, $user , $log = True) {
exec { "su - $user -c 'easy_install $app'": }
}

define twisted_instance($app, $appConfig,$port = 8000, $python_deps =
["twisted"], $packages = [] ) {

easy_install { $python_deps : user=> $user , log => false}

}

There is a lot more to the template than this, but I'm trying to keep
this message short.

Then I define servers like this:

twisted_instance{"name":
app => http://svn....",
appConfig => "path/to/template",
port => 7001,
python_deps => ["twisted", "pysqlite", "uuid",
"ConfigObj", "storm"],
packages => [
"fonts-bengali"
]}


This works well for one instance, but when I define two instances I get:

err: Could not retrieve catalog: Puppet::Parser::AST::Resource failed
with error ArgumentError: Duplicate definition: Easy_install[twisted] is
already defined in file /etc/puppet/modules/twisted/manifests/init.pp at
line 57; cannot redefine at
/etc/puppet/modules/twisted/manifests/init.pp:57 on node skryme.scanmine.com

The problem here is that it is the user that varies.

Now, this isn't a big problem if I new how to do an iteration. Then I
could change :
easy_install { $python_deps : user=> $user , log => false}

to:

easy_install { "something" : python_deps => $python_deps, user=> $user ,
log => false}

and the define to something like:
define easy_install($apps, $user , $log = True) {
for $app in $apps:
exec { "su - $user -c 'easy_install $app'": }
}

So how can I do this? Any suggestions?

Kind regards,
Tarjei
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iD8DBQFIbKM0YVRKCnSvzfIRAnCYAJ9idPsA1aEmA5l+0H4Z/posrWTgEwCfeIr8
p4m90v2PeocG2RMKBx+i5bo=
=uUrJ
-----END PGP SIGNATURE-----

Bryan Kearney

unread,
Jul 3, 2008, 7:06:30 AM7/3/08
to puppet...@googlegroups.com

Pass in the app as a parameter, and mangle the name

define twisted_instance($app, $appConfig,$port = 8000, $python_deps =
["twisted"], $packages = [] ) {

easy_install { "install_depdencies_$name": app => $python_deps :

user=> $user , log => false}

}


You are overloading app as the namevar.

-- bk

tarjei

unread,
Jul 3, 2008, 7:20:58 AM7/3/08
to puppet...@googlegroups.com
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Hi,


>> So how can I do this? Any suggestions?
>>
>
> Pass in the app as a parameter, and mangle the name
>
> define twisted_instance($app, $appConfig,$port = 8000, $python_deps =
> ["twisted"], $packages = [] ) {
>
> easy_install { "install_depdencies_$name": app => $python_deps :
> user=> $user , log => false}
>
> }

I've tried this, but how do I iterate over the packages? If I just pass
app => ["storm", "pylons"] then I end up executing
su -c 'easy_install stormpylons'

instead of running it as multiple commands.

Kind regards,
Tarjei

>
> You are overloading app as the namevar.
>
> -- bk
>
>
> >

-----BEGIN PGP SIGNATURE-----


Version: GnuPG v1.4.6 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iD8DBQFIbLYaYVRKCnSvzfIRAt6oAJ9/nktHpYWCPbUHGtiSMupRXmsOywCgiC8D
84Ad3X1NRzO4p0Im4xkhm6k=
=ftY4
-----END PGP SIGNATURE-----

Bryan Kearney

unread,
Jul 3, 2008, 7:24:26 AM7/3/08
to puppet...@googlegroups.com
tarjei wrote:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
>
> Hi,
>>> So how can I do this? Any suggestions?
>>>
>> Pass in the app as a parameter, and mangle the name
>>
>> define twisted_instance($app, $appConfig,$port = 8000, $python_deps =
>> ["twisted"], $packages = [] ) {
>>
>> easy_install { "install_depdencies_$name": app => $python_deps :
>> user=> $user , log => false}
>>
>> }
>
> I've tried this, but how do I iterate over the packages? If I just pass
> app => ["storm", "pylons"] then I end up executing
> su -c 'easy_install stormpylons'
>
> instead of running it as multiple commands.

I beleieve that if you have to use an Array, and iterate, then you have
to create a custom type.

-- bk

Andreas Rogge

unread,
Jul 3, 2008, 7:29:37 AM7/3/08
to puppet...@googlegroups.com
Bryan Kearney schrieb:

>
> I beleieve that if you have to use an Array, and iterate, then you have
> to create a custom type.
>
Not really. What actually works is something like that:

Exec { "foo":
command => template('foo.erb'),
}

Then you only have to iterate the array in the template and generate the
required commands.

Not very nice, but works :)

Regards,
Andreas

--
Solvention
Egermannstr. 6-8
53359 Rheinbach

Tel: +49 2226 158179-0
Fax: +49 2226 158179-9

http://www.solvention.de
mailto:in...@solvention.de

tarjei

unread,
Jul 3, 2008, 7:36:56 AM7/3/08
to puppet...@googlegroups.com
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Ok. Do you have a pointer to a custom type example? I tried to find info
about this in the documentation, but I couldn't find it for some reason.

Kind regards,
Tarjei


>
> -- bk
>
>
> >

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iD8DBQFIbLnYYVRKCnSvzfIRAuNRAKC8Eo65ortNd9uMUAs6GiRNPr7QVQCcCaJT
rfI4RZJykRiV9E8rsM4n468=
=jJEr
-----END PGP SIGNATURE-----

Bryan Kearney

unread,
Jul 3, 2008, 7:39:37 AM7/3/08
to puppet...@googlegroups.com

tarjei wrote:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
>
> Bryan Kearney wrote:
>> tarjei wrote:
>>> -----BEGIN PGP SIGNED MESSAGE-----
>>> Hash: SHA1
>>>
>>> Hi,
>>>>> So how can I do this? Any suggestions?
>>>>>
>>>> Pass in the app as a parameter, and mangle the name
>>>>
>>>> define twisted_instance($app, $appConfig,$port = 8000, $python_deps =
>>>> ["twisted"], $packages = [] ) {
>>>>
>>>> easy_install { "install_depdencies_$name": app => $python_deps :
>>>> user=> $user , log => false}
>>>>
>>>> }
>>> I've tried this, but how do I iterate over the packages? If I just pass
>>> app => ["storm", "pylons"] then I end up executing
>>> su -c 'easy_install stormpylons'
>>>
>>> instead of running it as multiple commands.
>> I beleieve that if you have to use an Array, and iterate, then you have
>> to create a custom type.
>
> Ok. Do you have a pointer to a custom type example? I tried to find info
> about this in the documentation, but I couldn't find it for some reason.
>
> Kind regards,
> Tarjei
>

Best to start here:
http://www.reductivelabs.com/trac/puppet/wiki/PracticalTypes

Then here:

http://www.reductivelabs.com/trac/puppet/wiki/CreatingCustomTypes

Evan Hisey

unread,
Jul 3, 2008, 10:18:31 AM7/3/08
to puppet...@googlegroups.com
> Hi, I'm trying to set up a system to deploy a set of different python
> services that each will be run as a separate user with different
> packages installed.
>
> The basic code is:
>
> define easy_install($app, $user , $log = True) {
> exec { "su - $user -c 'easy_install $app'": }
> }
>
> define twisted_instance($app, $appConfig,$port = 8000, $python_deps =
> ["twisted"], $packages = [] ) {
>
> easy_install { $python_deps : user=> $user , log => false}
>
> }
>
> There is a lot more to the template than this, but I'm trying to keep
> this message short.
>
> Then I define servers like this:
>
> twisted_instance{"name":
> app => http://svn....",
> appConfig => "path/to/template",
> port => 7001,
> python_deps => ["twisted", "pysqlite", "uuid",
> "ConfigObj", "storm"],
> packages => [
> "fonts-bengali"
> ]}

Okay I don't think iteration is going to solve your problem here. You
can only ever have one occurrence of the namespace
easy_install{twisted: } and you have set to try and happen several
times. this happening becuase you are calling the twisted every time
you use the twisted_instances. Defines have to be setup in such a way
that they can be used multiple times. Instead of just reinstalling
twisted everytime you run the twisted_instance( which is what you are
doing), change python_deps from the be handled as a require => instead
of just reinstalling so you get something more like this:

define twisted_instance($app, $appConfig,$port = 8000, $python_deps =
["twisted"], $packages = [] ) {

easy_install { $app:
require => $python_deps,


user=> $user ,
log => false
}
}

$base-twisted=["twisted", "pysqlite", "uuid",
"ConfigObj", "storm"]

easy_install{$base-twisted; } twisted_instance{"name":


app => "http://svn....",
appConfig => "path/to/template",
port => 7001,

python_deps => ["Easy_install[twisted]",
"Easy_install[pysqlite]", "Easy_install[uuid]",
"Easy_install[ConfigObj]", "Easy_install[storm]"], # You can't just
pass an array to Easy_install [$array] yet. This in the tracker to get
fixed
packages => "fonts-bengali",
}


> This works well for one instance, but when I define two instances I get:
>
> err: Could not retrieve catalog: Puppet::Parser::AST::Resource failed
> with error ArgumentError: Duplicate definition: Easy_install[twisted] is
> already defined in file /etc/puppet/modules/twisted/manifests/init.pp at
> line 57; cannot redefine at
> /etc/puppet/modules/twisted/manifests/init.pp:57 on node skryme.scanmine.com
> The problem here is that it is the user that varies.

This caused by the namespace collision of trying to name 2 instances
of easy_install the same.

>
> Now, this isn't a big problem if I new how to do an iteration. Then I
> could change :
> easy_install { $python_deps : user=> $user , log => false}
>
> to:
>
> easy_install { "something" : python_deps => $python_deps, user=> $user ,
> log => false}
>
> and the define to something like:
> define easy_install($apps, $user , $log = True) {
> for $app in $apps:
> exec { "su - $user -c 'easy_install $app'": }
> }
>
> So how can I do this? Any suggestions?

Puppet does not do this kind of looping. This type of looping is
mostly not supported because it tends to make you think at a less
abstract level, as I understand it, and abstraction is the key to a
good puppet manifest.

That is probably not the perfect solution to your problem but based on
the available manifest I think can give you a good idea of how to
solve it.

Evan

Reply all
Reply to author
Forward
0 new messages