I have two different versions of linux/unix each running cfengine3. Is it possible to have one promises.cf file I can put on both machines that will copy different files based on what os is on the clients? I have been searching around the internet for a few hours now and have not found anything useful yet.
Is there an easy way for cfengine3 to copy different files based on the OS its running
1.9k views Asked by Mlove At
1
There are 1 answers
Related Questions in CONFIGURATION
- Ubuntu wsl2 in windows, my /etc/fonts/fonts.conf keeps reloading
- I am trying to run java application in Eclipse, When I try to do Run > Run as > Java Application it starts to show little processing but nothing happe
- CISCO refuses to turn off spanning tree for specific vlans
- Resolve paths dynamically based on directory where test (or tested files) is located in Jest
- `android` Does Not Exist in `~/Android/Sdk/platform-tools`
- jboss configuration via ipv6 version jboss-eap-7.4
- I can't find a conenction diagarm for the OV7670 camera to the ESP8266
- Locally testing OS environmental variables in Ballerina
- Why is the build configuration always choosing production?
- App Configuration affecting VS Web Server Hosting
- IServiceCollectionConfigurator' does not contain a definition for 'UsingRabbitMq'
- Localhost Not Working After Creating Virtual Host in XAMPP
- Why am i unable to download MySql?
- Azure App Configuration - Replica for 429 HTTP responses
- TYPO3: tx-form custom fluid templates and class for submit button
Related Questions in CFENGINE
- CFEngine 3.12: how to propagate templates to hosts?
- ExecShellResult doesn't like my pipes
- cfEngine3 - class if package is installed
- Is there any difference between using "ifvarclass => 'class'" or "class::" notation when adding promises?
- CFEngine - set variable if a specific package version is installed
- how to cf-agent run with -D custom classes
- CFE syntax errors
- Learning CFEngine from 3.5 manual and operating in a 3.7 enviornment
- How to use parametrized bundles in cf-serverd?
- Is there any way around the "no dots in hostnames" rule in CFEngine?
- File copy using cf-engine from policy hub to hosts
- How to check current user with cfengine
- CFEngine match hostname in bundle agent
- Challenge response from CFEngine Server Failure while conencting cygwin to CFEngine
- How can CFEngine check that an upgrade is available for a package
Popular Questions
- How do I undo the most recent local commits in Git?
- How can I remove a specific item from an array in JavaScript?
- How do I delete a Git branch locally and remotely?
- Find all files containing a specific text (string) on Linux?
- How do I revert a Git repository to a previous commit?
- How do I create an HTML button that acts like a link?
- How do I check out a remote Git branch?
- How do I force "git pull" to overwrite local files?
- How do I list all files of a directory?
- How to check whether a string contains a substring in JavaScript?
- How do I redirect to another webpage?
- How can I iterate over rows in a Pandas DataFrame?
- How do I convert a String to an int in Java?
- Does Python have a string 'contains' substring method?
- How do I check if a string contains a specific word?
Trending Questions
- UIImageView Frame Doesn't Reflect Constraints
- Is it possible to use adb commands to click on a view by finding its ID?
- How to create a new web character symbol recognizable by html/javascript?
- Why isn't my CSS3 animation smooth in Google Chrome (but very smooth on other browsers)?
- Heap Gives Page Fault
- Connect ffmpeg to Visual Studio 2008
- Both Object- and ValueAnimator jumps when Duration is set above API LvL 24
- How to avoid default initialization of objects in std::vector?
- second argument of the command line arguments in a format other than char** argv or char* argv[]
- How to improve efficiency of algorithm which generates next lexicographic permutation?
- Navigating to the another actvity app getting crash in android
- How to read the particular message format in android and store in sqlite database?
- Resetting inventory status after order is cancelled
- Efficiently compute powers of X in SSE/AVX
- Insert into an external database using ajax and php : POST 500 (Internal Server Error)
There are several ways of doing this. At the simplest, you can simply have different files: promises depending on the operating system, for example:
This example can be easily simplified by realizing that the built-in CFEngine variable $(sys.flavor) contains the type and version of the operating system, so we could rewrite this example as follows:
A more flexible way to achieve this task is known in CFEngine terminology as "hierarchical copy." In this pattern, you specify an arbitrary list of variables by which you want files to be differentiated, and the order in which they should be considered, from most specific to most general. When the copy promise is executed, the most-specific file found will be copied.
This pattern is very simple to implement:
As you can see, we are defining a list variable called $(suffixes) that contains the criteria by which we want to differentiate the files. All the variables contained in this list are automatically defined by CFEngine, although you could use any arbitrary CFEngine variables. Then we simply include that variable, as a scalar, in our copy_from parameter. Because CFEngine does automatic list expansion, it will try each variable in turn, executing the copy promise multiple times (one for each value in the list) and copy the first file that exists. For example, for a Linux SuSE 11 machine called superman.justiceleague.com, the @(suffixes) variable will contain the following values:
When the file-copy promise is executed, implicit looping will cause these strings to be appended in sequence to "$(repository)/etc/hosts", so the following filenames will be attempted in sequence: hosts.superman.justiceleague.com, hosts.justiceleague.com, hosts.suse_11, hosts.linux and hosts. The first one to exist will be copied over /etc/hosts in the client, and the rest will be skipped.
For this technique to work, we have to enable "single copy" on all the files you want to process. This is a configuration parameter that tells CFEngine to copy each file at most once, ignoring successive copy operations for the same destination file. The files_single_copy parameter in the agent control body specifies a list of regular expressions to match filenames to which single-copy should apply. By setting it to
".*"we match all filenames.For hosts that don't match any of the existing files, the last item on the list (an empty string) will cause the generic hosts file to be copied. Note that the dot for each of the filenames is included in $(suffixes), except for the last element.
I hope this helps.
(p.s. and shameless plug: this is taken from my upcoming book, "Learning CFEngine 3", published by O'Reilly)