<div dir="ltr">Hi Jay,<div><br></div><div>Hiera takes the cake for my love/hate of Puppet. I try really hard to keep the number of hierarchies small and even then I find it awkward sometimes. I love the concept of Hiera, but I find it can be unintuitive. Similar to the other replies, I have a "common" hierarchy where 90% of the data is stored. The other hierarchies either override "common" or append to it. When I need to know where a parameter is ultimately configured, I find myself thinking "is that parameter common across everything or specific to a certain location or node, and if so, why did I make it specific?", then doing a "grep -R" to find where it's located, and finally thinking "oh right - that's why it's there".</div><div><br></div><div>Another area of Puppet that I'm finding difficult to work with is configuring HA environments. There are two main pain points here and they're pretty applicable to using Puppet with OpenStack:</div><div><br></div><div>The first is standing up a cluster of servers. For example MySQL and Galera. The first server in the cluster gets a blank gcomm setting. This means that I either need to have a blank gcomm setting in Hiera just for the first node or I need to remove the list of nodes from Hiera temporarily and add it back after the first node is set up. <a href="https://github.com/dalen/puppet-puppetdbquery">puppetdbquery</a> (very awesome module) can also be used. There are pros and cons to all of these.</div><div><br></div><div>After the first node, the rest of the servers are trickier because Puppet will usually start the MySQL service before all settings are in place. Then after all settings are in place, MySQL will restart. But the timing of ensuring all settings are in place for the new node to connect to the other nodes and sync with Galera is rarely right. This is fixable by doing a lot of forced ordering in Puppet, but (at least in my current setup), that would require a custom MySQL module or modifying the PuppetLabs MySQL module.</div><div><br></div><div>And finally, just coordinating Puppet runs of multiple cluster members is a bear. It can take up to 3 Puppet runs for two nodes to connect. Think syn, syn/ack, ack here.</div><div><br></div><div>The other HA pain point is creating many-to-one configurations, for example putting those MySQL nodes behind HAProxy. I want HAProxy to have an entry for MySQL that lists all nodes. Listing the nodes is easy: each MySQL server can simply export itself as a valid node, but what about the rest of the HAProxy MySQL config that's "singular" (for example, the "listen" and "option" settings)? Only one node can host that data or Puppet will complain about duplicate data. I don't want one node responsible for the data because I feel that creates a "pet" environment vs a "cattle" one. There are two hacks I've done to get around this:</div><div><br></div><div>The first is to create resources in each MySQL server with unique resource names but the same value. A simple example is:</div><div><br></div><div>file_line { '/etc/foobar.conf for node-1':</div><div>  path => '/etc/foobar.conf',</div><div>  line => 'Hello, World!',</div><div>}</div><div><br></div><div><div>file_line { '/etc/foobar.conf for node-2':</div><div>  path => '/etc/foobar.conf',</div><div>  line => 'Hello, World!',</div><div>}</div></div><div><br></div><div>Now if these resources are exported and collected on a central server, Puppet will not complain about duplicate resources and the single line will exist in the foobar.conf file.</div><div><br></div><div>The second hack is more involved and it would take a lot of detail to show a full example. In summary, the Puppet stdlib module has a function called <a href="https://github.com/puppetlabs/puppetlabs-stdlib#ensure_resource">ensure_resource </a>that will only apply a resource if it doesn't already exist. If several nodes export the same ensure_resource with the exact same settings, the single resource will be built on the server that imports them. The problem here is that if the resource is ever modified, then I must comment out the resource, run "puppet apply --noop" so it's removed from PuppetDB, make the change, then run Puppet again. If not, then the first node that runs with the new setting will export the modified resource and Puppet will complain because two resources exist with different data. This might sound very confusing and awkward and it is, but doing this allows me to store resources like firewall rules, MySQL users, HAProxy entries, etc on multiple nodes when those settings should only be applied once in the entire environment.</div><div><br></div><div>I think a cleaner way of doing this is to introduce service discovery into my environment, but I haven't had time to look into this in more detail.</div><div><br></div><div>I should mention that some of these HA pains can be resolved by just moving all of the data to the HAProxy nodes themselves. So when I want to add a new service, such as RabbitMQ, to HAProxy, I add the RabbitMQ settings to the HAProxy role/profiles. But I want HAProxy to be "dumb" about what it's hosting. I want to be able to use it in a Juju-like fashion where I can introduce any arbitrary service and HAProxy configures itself without prior knowledge of the new service.</div><div><br></div><div>I say *some* pains, because this isn't applicable to, say, a MySQL cluster where users and databases are shared across the entire cluster.</div><div> </div><div>There are probably one or two other areas I'm forgetting, but typing the above has cleared my head. :)</div><div><br></div><div>In general, though, I really enjoy working with Puppet. Our current Puppet configurations allow us to stand up test OpenStack environments with little manual input as well as upgrade to newer releases of OpenStack with very little effort. For example, short of our compute nodes, all other OpenStack components run in LXC containers. Our Icehouse upgrade procedure consisted of killing those containers, making new ones based on Ubuntu 14.04, and letting Puppet do the rest.</div><div><br></div><div>Let me know if you'd like more details or clarification.</div><div><br></div><div>Thanks,</div><div>Joe</div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Sep 25, 2014 at 12:12 PM, Jay Pipes <span dir="ltr"><<a href="mailto:jaypipes@gmail.com" target="_blank">jaypipes@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">On 09/25/2014 11:45 AM, Joe Topjian wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hi Mathieu,<br>
<br>
My setup is very similar to yours. Node definitions are in site.pp and<br>
Hiera is used for all configuration. The Hiera hierarchies are also very<br>
similar.<br>
<br>
Overall, I have a love/hate relationship with the setup. I could go on<br>
in detail, but it'd be all Puppet-specific rather than OpenStack. I'd be<br>
happy to discuss off-list.<br>
<br>
Of if there's enough interest, I can post it here. I just don't want to<br>
muddy up this list with non-OpenStack things.<br>
</blockquote>
<br></span>
I certainly would enjoy a good discussion here about your love-hate relationship with your deployment tooling. I have the same relationship with the Chef work we did at AT&T and am curious whether there are Puppetisms that similarly cause grief as some Chefisms.<br>
<br>
/me readies the popcorn.<br>
<br>
Best,<br>
-jay<div class="HOEnZb"><div class="h5"><br>
<br>
______________________________<u></u>_________________<br>
OpenStack-operators mailing list<br>
<a href="mailto:OpenStack-operators@lists.openstack.org" target="_blank">OpenStack-operators@lists.<u></u>openstack.org</a><br>
<a href="http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-operators" target="_blank">http://lists.openstack.org/<u></u>cgi-bin/mailman/listinfo/<u></u>openstack-operators</a><br>
</div></div></blockquote></div><br></div>