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 best solutions below
Related Questions in CONFIGURATION
- Logback stopped logging after splitting shared config file
- Understanding Grizzly 1.9.36 internals
- Symfony 2 and php.yml configuration
- Tree configuration to turn on/off the features in java
- Deleting Repeated Services from Android GCM Config File
- What does the dot mean in Symfony service names?
- How to manage configuration data in large projects?
- org.apache.commons.configuration.INIConfiguration: section name with dot (period)
- How to include js files in a Visual Studio project on build
- What is the correct way to use app.config for my plugin when using MEF?
- How run several instances of GWT application in IntelliJIDEA
- ejabberd block messages from users that don't stay in my friend list
- CMake error while configuring "install TARGETS given no RUNTIME DESTINATION for executable target "assimp_simpletexturedogl"."
- Need help in configuring Jenkins with Coverity. Getting Error Message
- How do I access the service provider when registering using typescript class
Related Questions in CFENGINE
- Configuration Management for Windows
- How to check current user with cfengine
- Manage authorized_keys using cfengine
- Is there an easy way for cfengine3 to copy different files based on the OS its running
- CFEngine 3.12: how to propagate templates to hosts?
- Cfengine vs Chef
- CFengine Redefinition of body "control" for "common" is a broken promise
- reparing user list on a linux system using cfengine
- Is there any way around the "no dots in hostnames" rule in CFEngine?
- CFEngine policy not executed on Ubuntu nodes
- Host group on CFEngine
- CFEngine. I want to distribute a set of files which are different for different versions of ubuntu for eg 13.04 and 14.04.
- CFEngine 3.5 Oracle JDK promise
- How to make an argument for why system build tools shouldn't automatically do SVN checkin
- cfengine 3.4 - cygwin build instructions
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)
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?
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)