Re: Puppet versus CFEngine
"'Nick Anderson' via help-cfengine" <[email protected]> Mon, 11 Sep 2023 20:53:42 -0500
| Newsgroups | gmane.comp.sysutils.cfengine.general |
|---|---|
| Message-ID | <CAE46pPt1i7XW1HXWn=Tr5Tj+V8_fD=GC3bOdWWOX==ig8Kt0Mw@mail.gmail.com> |
👏 On Mon, Sep 11, 2023, 7:02 PM Mike Weilgart <[email protected]> wrote: > Hello all, > > To those who know me, sorry for an absence of many years. I was signed up > on this list years ago with an email address I no longer have, and as I > wasn't working with CFEngine on a daily basis by the time I lost access to > that email, I haven't been here in forever. > > I recently started a new job and am ramping up on Puppet, which is in use > in my new work environment. > > To tell the truth, I had no idea just how good I had it with CFEngine > until I started coming to grips with the Puppet way of doing things. I > learned CFEngine "in a vacuum," as it were, fresh and from scratch, with no > prior config management experience. (And I learned it extremely well, as a > perusal of my contributions to the help-cfengine list, and to the CFEngine > bug tracker, will attest.) > > Just in a couple weeks of working with Puppet, I'm running into several > sharp corners, and learning about others. For instance, it is impossible > in Puppet to promise that: > > 1. /foo/bar should have perms 777 (but leave all files and subdirectories > at whatever mode they may have, don't manage those), AND > 2. /foo/bar and everything in it should have owner baz and group baz. > > (This example taken from https://stackoverflow.com/q/25551718/5419599.) > > This of course is a trivial task for a first-day student of CFEngine > policy writing. > > Another pain point I encountered, if you want to promise the existence of > a file, and you just do it the natural way in Puppet, you will likely get > errors on the non-existence of the parent directory and other ancestor > directories. Because you're not writing a promise, as you would in > CFEngine. The language in Puppet is not truly declarative; you can't just > say, "Here is what I want" and leave it to Puppet to figure out how to do > it and to create the parent directories in order to fulfill the promise. > > But okay, I thought, that's a bit annoying to have to do but I can write a > separate stanza for each of the parent directories in /my/very/long/path > and just promise their existence and I'm away. Simple workaround, if kind > of kludgy and something the Puppet language should really handle natively > to be worthy of the name of a configuration management tool.... > > But not so fast! This was all occurring in a directory whose permissions > I was managing separately, that I wanted to have mode, owner, group 640, > someuser, somegroup all the way down, recursively. The fun part is, as > soon as you specify ANY file resource in Puppet underneath that top-level > directory resource, you overwrite the permissions recursively set on the > top-level resource—even if you don't mention them again! > > So in summary, if you want to ensure a particular file contents at > /foo/bar/baz/bof/buz/bip/file.txt — you have to list out each of those > subdirectories separately in your puppet manifest to ensure they all > exist! You can loop through them to save a bit of typing, but you have to > name every one of them out. And then if you ALSO want to ensure > permissions recursively on /foo/bar and EVERYTHING below it, those > permissions settings will have to also be set on each level below it AND > have the recurse attribute set at each level, or you will leave holes in > your permissions management. Again, there is a shorter way you can use, to > make "default" permissions attributes for every level, but that is just a > way to save on typing them all out; the fundamental point that EVERY > attribute has to be set at EVERY level is part of the conceptual structure > of Puppet. > > Some of this can be chalked up to needing to learn the language and the > "typing saving" approaches, but the structure is really different from > CFEngine's, and so far in my learning I have found it conceptually far > inferior. > > I haven't even mentioned how Puppet will take an MD5 hash of every file in > the entire directory tree if you turn on recurse for some directory, even > if you just want to manage the permissions and not the contents. You can > get around this by installing third-party modules for managing permissions > recursively (akin to CFEngine's more recent addition of "custom promise > types"), but Puppet can't do it natively and cleanly. > > And don't even think about trying to do log rotation with Puppet natively, > i.e. delete files older than a certain age or whatever. I haven't dug deep > on that one but I'm pretty sure the only sane way to do it in Puppet would > be to just shell out—i.e. write a script and call it, because Puppet isn't > mature enough to do its own log rotation. (Perhaps there is a third-party > module that can do it, but probably they would just shell out anyway.) As > anyone reading this probably knows, this is again a trivial piece of > CFEngine policy. > > *Now I come to my real point in writing this post.* > > I would like to make the case for CFEngine versus Puppet. I would like to > have a nice collection of examples in CFEngine policy, that showcase how > easy it is to do things with CFEngine. There is of course a collection of > examples here: https://github.com/cfengine/core/tree/master/examples but > it isn't particularly well suited as a TECHNICAL MARKETING TOOL—which is > really what is needed, in my observation, for CFEngine to start being > adopted more widely in the industry and to become as popular as it deserves. > > Like for instance, the fileperms.cf example ( > https://github.com/cfengine/core/blob/master/examples/fileperms.cf) is > overly simple. It could be done trivially in ANY config management tool > with a single line. > > What would be excellent is to keep simple examples, and ADD examples that > are relatively easy to state and are not unrealistic, but that are > impossible or extremely difficult with other config management tools than > CFEngine. > > When all I knew was CFEngine, I became intimately familiar with its > various quirks and idiosyncrasies and I could be vocal in complaining about > them. But now in seeing the wider config management world, I see how > CFEngine really is light-years ahead of its competition and whole > categories of problems simply don't exist with CFEngine policy, because it > is mature enough in its engineering to actually get the job done. > > I invite anyone reading this to give your "oh wow" moments of realizing > how easily CFEngine could handle something, or other pain points you've had > with other config management tools (especially Puppet since that's what I'm > facing) that are resolved trivially with CFEngine. :) > > Best, > --Mike Weilgart > > P.S.: Here's another fun one: since the puppet manifest is compiled into a > catalog on the puppet *server*, you can't condition code on the existence > of a file *local to the host*. A "find_file" function call gets > evaluated on the puppet master, not on the host. You can shell out and use > "test -f", but get this—the "onlyif" attribute in Puppet is ONLY available > for the "exec" resource! (That's Puppet-speak for the equivalent of a > commands promise.) Getting around this requires weird language hacks like > this one: https://serverfault.com/a/516919/313521 > > -- > You received this message because you are subscribed to the Google Groups > "help-cfengine" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To view this discussion on the web visit > https://groups.google.com/d/msgid/help-cfengine/098fdfb9-d25f-4da0-9b65-26389083499cn%40googlegroups.com > <https://groups.google.com/d/msgid/help-cfengine/098fdfb9-d25f-4da0-9b65-26389083499cn%40googlegroups.com?utm_medium=email&utm_source=footer> > . > -- You received this message because you are subscribed to the Google Groups "help-cfengine" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/help-cfengine/CAE46pPt1i7XW1HXWn%3DTr5Tj%2BV8_fD%3DGC3bOdWWOX%3D%3Dig8Kt0Mw%40mail.gmail.com.