Re: Puppet versus CFEngine
"'Bas van der Vlies' via help-cfengine" <[email protected]> Tue, 12 Sep 2023 14:09:26 +0200
| Newsgroups | gmane.comp.sysutils.cfengine.general |
|---|---|
| Message-ID | <[email protected]> |
Hi Mike, I do not know if you have seen this development but it is far more easy to build "masterfiles" configuration with the add of cfbs: * https://build.cfengine.com/ With the aid of above there are many modulus and you can easily demonstrate snippets/code/... I have written module for "easy" configuring services with the add of json/mustache: * https://github.com/basvandervlies/cf_surfsara_lib/ * docker_compose/docker_network promise types: https://github.com/basvandervlies/scl_modules Regards On 12/09/2023 02:02, Mike Weilgart 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] > <mailto:[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>. -- -- Bas van der Vlies | High Performance Computing & Visualization | SURF| Science Park 140 | 1098 XG Amsterdam | T +31 (0) 20 800 1300 | [email protected] | www.surf.nl | -- 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/1d506657-fe40-4a60-bce8-720563748b22%40surf.nl.