Genders Jim Garlick High Performance Computing Systems Group Livermore Computing Lawrence Livermore National Laboratory June 19, 2000 (Revised by Albert Chu - May 2003, April 2004) (Revised by Ben Casses - July 2015) ------------------------------------------------------------------------ NOTE: This document is part of the "Genders" software package, approved by LLNL for public release. Please see the DISCLAIMER file distributed with the package for restrictions. ------------------------------------------------------------------------ Introduction Genders is a simple concept that has been extended to address configuration management issues that arise on MPP clusters[1]. The basic concept is that a genders file containing a list of node names and their attributes is replicated on each node in a cluster. By representing the configuration of an MPP in this file, scripts and rdist Distfiles that might otherwise contain hard-coded node lists, can be generalized to work with different configurations of the same cluster, and even with multiple clusters. The framework has proven to be useful on clusters ranging in size from the ASCI Blue-Pacific SST system at 1464 nodes, to collections of two or three workstations. Basic Operation This section describes the formats of the genders file and the nodeattr command. The genders file, briefly described in the introduction, contains a list of node names and attributes. The genders file is typically found in /etc (on Linux when installed from the genders RPM) or /admin/etc (on other systems). Genders Format Each line of the genders file may have one of the following formats. See the section "Host Ranges" below for most information on host ranges. nodename attr[=value],attr[=value],... nodename1,nodename2,... attr[=value],attr[=value],... nodenames[A-B] attr[=value],attr[=value],... The nodename(s) is the shortened[2] hostname of a node. This is followed by any number of spaces or tabs, and then the comma-separated list of attributes, each of which can optionally have a value. The substitution string "%n" can be used in an attribute value to represent the nodename. Nodenames can be listed on multiple lines, so a node's attributes can be specified on multiple lines. However, no single node may have duplicate attributes. There must be no spaces embedded in the attribute list and there is no provision for continuation lines. Commas and equal characters are special and cannot appear in attribute names or their values. Comments are prefixed with the hash chracter (#) and can appear anywhere in the file. The active genders file is typically found at /etc/genders or /admin/etc/genders. Here is an example genders file from a small 16-node linux cluster: # slc cluster genders file slci,slcj,slc[0-15] eth2=e%n,cluster=slc,all slci passwdhost slci,slcj management slc[1-15] compute Host Ranges As noted in section above, the genders database accepts ranges of nodenames in the general form: prefix[n-m,l-k,...], where n < m and l < k, etc., as an alternative to explicit lists of nodenames. This range syntax is meant only as a convenience on clusters with a prefixNN naming convention and specification of ranges should not be considered necessary -- the list foo1,foo9 could be specified as such, or by the range foo[1,9]. Some examples of range usage follow: foo01,foo02,foo03,foo04,foo05: foo[01-05] foo3,foo7,foo9,foo11: foo[3,7,9-11] fooi,fooj,foo0,foo1,foo2: fooi,fooj,foo[0-2] Host ranges with suffixes, i.e. foo[0-2]x, are generally supported, but behavior may differ. Nodeattr Usage A program called nodeattr is used to query data in the genders file. Because the genders file is replicated on all nodes in a cluster, this query is a local operation, not dependent on the network. Nodeattr is invoked as follows: nodeattr [-f genders] [-q | -c | -n | -s] [-r] attr[=val] nodeattr [-f genders] [-v] [node] attr[=val] nodeattr [-f genders] -l [node] nodeattr [-f genders] -k The -f option specifies a genders file path other than the default. The -q, -c, -n, or -s options followed by an attribute name cause a list of nodes having the specified attribute to be printed on stdout, formatted according to the option specified: -q (default) is host range, -c is comma-separated, -n is newline separated, and -s is space separated. If none of the formatting options are specified, nodeattr returns a zero value if the local node has the specified attribute, else nonzero. The -v option causes any value associated with the attribute to go to stdout. If a node name is specified before the attribute, it is queried instead of the local node. The -l option is used to generate a list of attributes for a particular node. If no node is listed, all attributes appearing in the genders file will be listed. The -k option checks the genders file for proper formatting. Information about improper formatting will be output to standard error. Nodeattr can usually be found in /usr/bin (Linux RPM) or /admin/scripts (other systems). Programming with Genders Three different APIs have been developed that allow programmers to parse and query the genders file. "libgenders" is a C API which can be linked by including genders.h and linking the library libgenders. "Libgenders" is a Perl module developed with Perl extensions. "Genders" is another Perl modules, but offers a more traditional Perl API than "Libgenders." The reader can learn more about these libraries by reading the manpages libgenders(3), Libgenders(3), and Genders(3). Example: Rc Script The nodeattr command can enable a single script to behave differently depending on the role or gender of the node it is executing on, simplifying configuration management of the MPP. For example, all nodes in an MPP could have the same rc.local file: #!/bin/sh if nodeattr raid; then initialize_raid fi if nodeattr login; then sshd fi ... If the node has "raid" in its attribute list, it would execute initialize_raid; if it had "login" in its attribute list, it would start the secure shell daemon. This technique is simpler and less prone to failure than adding code to test for "clues" to a nodes function, such as the existence of a RAID device in /dev or a different set of installed products on a login node. Further, changing the role of a node does not require a laborious audit of scripts; one simply changes the genders file and all genders-enabled scripts change their behavior. Attribute values might be used to store node configuration information such as a node's default IP route. For example, the node may have an attribute: iprouter=big-rtr.llnl.gov and rc script could extract this value and pass it to the route command: route add net default `nodeattr -v iprouter` Example: Host Lists Host lists are commonly needed on MPP's to set up parallel jobs or to run system administration commands on particular sets of nodes. In the following example, nodeattr generates a newline-separated list of nodes with the login attribute to pass to the fping parallel ping command: fping `nodeattr -c login` Batch system configurations typically need lists of nodes that belong to batch queues. These might be generated by assigning nodes belonging to a particular queue an attribute in the genders file and then using nodeattr to generate the batch configuration. For example, an NQS manager host might get its configuration as follows, assuming the nqsmgr and nqscompute attributes are appropriately assigned in the genders file: #!/bin/sh # # Configure queues on the nqsmgr node. # if nodeattr nqsmgr; then # All nodes with the nqscompute attribute will be B queue destinations. # Make a comma-separated list of B@host destinations. for host in `nodeattr -n nqscompute`; do CPU_QUEUES=${CPU_QUEUES}B@${host}, done CPU_QUEUES=`echo $CPU_QUEUES|sed 's/,$//'` echo Adding manager queues qmgr << EOT set log_file /var/spool/nqs/log set shell_strategy fixed = (/bin/sh) set default destination_retry wait 1 create pipe_queue X priority = 10 \ server = (/usr/lib/nqs/pipeclient) \ destination = ($CPU_QUEUES) run_limit = 1 set default batch_request queue X enable queue X start queue X exit EOT fi # # Configure queues on the nqscompute nodes. # if nodeattr nqscompute; then echo Adding compute queues qmgr << EOT2 set log_file /var/spool/nqs/log set shell_strategy fixed = (/bin/sh) create batch_queue A priority=10 create pipe_queue B priority=10 \ server=(/usr/lib/nqs/pipeclient) \ destination=(A) run_limit=1 enable queue A enable queue B start queue A start queue B exit EOT2 fi exit 0 Example: nqs_mknmap The following script uses the Genders library to get a list of all nodes in the cluster. It then adds them to the NMAP database used by NQS: #!/usr/bin/perl # # $Id: TUTORIAL,v 1.9 2004-11-13 19:58:09 achu Exp $ # $Source: /g/g0/achu/temp/genders-cvsbackup-full/genders/TUTORIAL,v $ # use Genders; $prog = "nqs_mknmap"; $path_nmapmgr = "/usr/bin/nmapmgr"; $path_nmapdir = "/etc/nmap"; if (opendir(DIR, $path_nmapdir)) { foreach $file (grep(!/^\.\.?$/, readdir(DIR))) { unlink("$path_nmapdir/$file"); } closedir(DIR); } if (! -d $path_nmapdir) { mkdir($path_nmapdir, 0755); } if (open(PIPE, "|$path_nmapmgr")) { printf PIPE ("create\n"); $i = 0; $obj = Genders->new(); foreach $node ($obj->getnodes()) { printf PIPE ("add mid %d %s\n", $i, $node); $i++; } printf PIPE ("exit\n"); close(PIPE); } else { printf STDERR ("%s: could not exec $path_nmap_mgr\n", $prog); exit(1); } exit(0); ------------------------------------------------------------------------ [1] Here a cluster is a collection of nodes that are administered as a unit, where each node runs its own UNIX operating system image. [2] This should be the hostname as reported by the hostname -s command. Names for other network interfaces on the same node do not appear in the genders file. ------------------------------------------------------------------------ $Id: TUTORIAL,v 1.9 2004-11-13 19:58:09 achu Exp $ $Source: /g/g0/achu/temp/genders-cvsbackup-full/genders/TUTORIAL,v $