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-----
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
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-----
I beleieve that if you have to use an Array, and iterate, then you have
to create a custom type.
-- bk
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
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-----
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
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