On Sat, Aug 28, 2010 at 3:49 PM, Thomas Bellman <[email protected]> wrote: > Nigel Kersten wrote: > >> On Sat, Aug 28, 2010 at 9:04 AM, Douglas Garstang >> <[email protected]> wrote: > >>> I mean that you need to create a new class for each customer you add. >>> That does not scale. >> >> Why can't you have a class that instantiates your defined type? > > I don't know Douglas' circumstances, but assume you have a web > hotel. You then probably have a database of your customers, > telling you things like which domain(s) they have, what features > they pay for (static pages only, CGI scripts, mod_python, > database access, and so on), and how much storage and bandwidth > they are paying for. > > To map all these customers onto your physical machines, you write > a Puppet define that is used something like this: > > virtual_web_host { > "www.example.com": > avg_bandwidth => 4096, # Mbyte/month > peak_bandwidth => 2000, # Kbit/s > storage => 1536, # Mbyte disk space > cgi => true, > mod_python => false, > postgresql => true; > } > > Since you have your customers in a database, it would be nice to > use an external nodes script to basically generate one such > resource for each customer domain, and it will probably use some > information in the database to balance the virtual hosts over the > physical machines. But external nodes scripts *can't* generate > resources. You of course don't want to write a new class for > each customer, because if you are a largish web hotel you may get > dozens of new customers per day (and possibly loose as many), so > that would be too much work. > > But external node classifiers *can't* generate resources. They > can only use resources that already exist in the manifests, and > affect them by setting variables. > > > There is a way to work around this. You can let the external > node classifier set a variable with a value like this: > > $vhosts = [ > > "dom=www.example.com|avgbw=4096|peakbw=2000|storage=1536|cgi=true|...", > > "dom=www.example.org|avgbw=65536|peakbw=512|storage=600|cgi=false|...", > "dom=www.example.net|avgbw=512|peakbw=100|storage=2500|cgi=true|...", > ... > ] > > (although the script needs to output it using YAML syntax, of > course), and tell Puppet to include a class "all-vhosts". The > manifest files would contain code looking something like this: > > class all-vhosts > { > ext_virtual_web_host { > $vhosts: > ; > } > } > > define ext_virtual_web_host() > { > $domain = extract_field('dom', $name) > $avgbw = extract_field('avgbw', $name) > $peakbw = extract_field('peakbw', $name) > $storage = extract_field('storage', $name) > $cgi = extract_field('cgi', $name) > $mod_python = extract_field('mod_python', $name) > $postgresql = extract_field('postgresql', $name) > > virtual_web_host { > $domain: > avg_bandwidth => $avgbw, > peak_bandwidth => $peakbw, > storage => $storage, > cgi => $cgi, > mod_python => $mod_python, > postgresql => $postgresql; > } > } > > And then a custom function extract_field() for parsing the > strings. Doable, but not very pretty... > > Those strings are of course a kind of dictionary/hash/mapping, > and Puppet 2.6 has support for dictionaries directly. But that > would only help you if 2.6 allows you to have a dictionary as the > title/name for a resource; I haven't checked, but I would guess > that you can only use strings for titles/names. > > It would be much easier if external node classifiers could define > resources directly, instead of having to do something like the > above. But I seem to remember Luke saying that they are planning > to add that functionality sometime in the future; I don't think > they have set a timeline for it yet, though
Thomas, thanks for the detailed description. Nigel, Thomas pretty much nailed the issue on the head. It's not practical to add a new class every time you add a customer. The extract_field customer function doesn't exist yet, and I'm not a ruby programmer, so it won't exist any time soon. Even if it did, it's an ugly hack. Doug. -- You received this message because you are subscribed to the Google Groups "Puppet Users" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/puppet-users?hl=en.
