|  Centralize 
              Your Crontabs
 Richard Hellier
              This article presents a way of centralizing the administration 
              of cron by using NIS (Network Information Service) and may be helpful 
              for systems administrators working with a large number of systems 
              and users and services that need local crontab entries.
              The Problem
              In large-scale installations, the usual approach is to make all 
              the UNIX workstations be clones, meaning each machine is logically 
              the same as any other. Such cloning is usually achieved by technologies 
              such as Sun's JumpStart or HP's Instant Ignition. Installing 
              machines this way makes them field replaceable so that if a disk 
              or processor fails, a spare can replace the machine with no loss 
              of data.
              In my environment, we install machines using JumpStart and then 
              apply a rule specifying no client-side tailoring. In other words, 
              once a machine is installed, we try as hard as possible to avoid 
              applying any customizations to it. Allowing such customizations 
              means an additional burden in recording, backups, incorporation 
              into DR plans, etc. However, one of the main rule breakers is the 
              cron program since the crontab files (the "diaries") must 
              reside on the machine where cron runs.
              Restricting the use of cron (at least to non-privileged users) 
              to a small number of machines, perhaps just one or two, can alleviate 
              this problem. The administration of these cron servers gives more 
              "bang for the buck" than dealing with each workstation 
              individually. Sadly, centralizing cron in this way is, at best, 
              a halfway house and doesn't handle cases where the presence 
              of special devices or other constraints make a local crontab entry 
              essential.
              The Solution
              The solution adopted here is to add a new NIS map, crontab.byname, 
              to the normal set (hosts, passwd, etc). The source file for the 
              NIS map (i.e., the file /etc/crontab.conf on the NIS master), 
              looks like:
              
             
lonws28         root:30 7 * * * /foo/bar/somecmd
loncs50         sys:5,35 * * * * /foo/bar/othercmd
lonws59 root:0 0 * * * /usr/bin/touch /tmp/foo// \
        uucp:2 2 * * * /usr/bin/touch /tmp/baz%%5 5 \
        * * * /usr/bin/touch
/tmp/quux
Each (logical) line of the file contains all the crontab entries to 
            be run on the machine named on the left-hand side. The right-hand 
            side (RHS) of each line is a list of crontab entries for different 
            users within that machine. As usual, "long" lines can be 
            broken by escaping the newlines with a backslash character. Entries 
            for different users are separated with the sequence %%. Although 
            you could argue about the syntax, the one provided here works fine. 
            The file /var/yp/Makefile is augmented in the usual way to 
            build the crontab.byname map along with all the others.  What happens on the client side? At installation time, a shell 
              script is installed along with an entry in root's crontab that 
              runs the script every few minutes. When the script runs (Listing 
              1), it removes any existing crontab entries that came via NIS, which 
              are easy to find since they are bracketed by the following lines:
              
             
#NISCRON-START
#NISCRON-END
Next, the script uses the ypmatch command with the hostname 
            as the key to look up its entry in the crontab.byname map. 
            If a match is found, the crontabs for all users appearing in the entry 
            are updated. The same is then done using * as the key, which 
            gives a simple way to have cron entries run on all machines.  Thereafter, placing, altering, or removing a crontab entry is 
              simply a matter of editing /etc/crontab.conf on the NIS master, 
              and rebuilding the NIS map. At the end of the next update interval, 
              all the necessary updates occur. This mechanism is especially convenient 
              for transferring a crontab entry from one machine to another or 
              for setting up identical entries on many machines. Note that "down" 
              machines behave correctly when they next restart.
              Summary
              A scheme for centralizing the administration of cron has been 
              presented here. By using this scheme, client workstations remain 
              "field-replaceable" while still allowing the effect of 
              client-side tailoring because a machine replaced by a spare with 
              the same name will automatically "inherit" the correct 
              crontab entries. If the new machine is not able to have the same 
              name, the entries will be "inherited" when the NIS map 
              is updated. Although the article describes the use of NIS, other 
              tools such as NISplus could use the same method.
              Further Work
              To achieve the same effect with even less overhead, it would be 
              good if cron were to become "NIS-aware". That is, if the 
              file /etc/nsswitch.conf included cron as one of the services 
              that can be "vectored", then "local" crontabs 
              could run directly from the NIS map -- well, maybe some day!
              Richard Hellier has been around UNIX systems since 1976, first 
              as a user, then a software developer, and most recently as an administrator. 
              He is part of a team that manages the UNIX machines in the European 
              offices of LSI Logic. He can be contacted at: rlh@lsil.com.
           |