From 4603689886c353d6ab3e26f9a42e7e4398a7febf Mon Sep 17 00:00:00 2001 From: "Paul C. Buetow" Date: Wed, 16 Apr 2014 08:02:07 +0200 Subject: use pod here --- Makefile | 3 +- README.pod | 142 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ README.txt | 125 --------------------------------------------------- docs/fapi.1 | 6 +-- docs/fapi.txt | 4 +- 5 files changed, 149 insertions(+), 131 deletions(-) create mode 100644 README.pod delete mode 100644 README.txt diff --git a/Makefile b/Makefile index 28c5e3f..fc5f669 100644 --- a/Makefile +++ b/Makefile @@ -27,7 +27,8 @@ documentation: # To be replaced with sphynx instead of pod pod2man --release="$(NAME) $$(cat .version)" \ --center="User Commands" ./docs/$(NAME).pod > ./docs/$(NAME).1 - pod2text ./docs/$(NAME).pod | tee ./docs/$(NAME).txt > README.txt + pod2text ./docs/$(NAME).pod > ./docs/$(NAME).txt + cp ./docs/$(NAME).pod README.pod # Build a debian package (don't sign it, modify the arguments if you want to sign it) deb: all dpkg-buildpackage diff --git a/README.pod b/README.pod new file mode 100644 index 0000000..ca02281 --- /dev/null +++ b/README.pod @@ -0,0 +1,142 @@ +=head1 NAME + +fapi - A humble command line tool to manage F5 BigIP loadbalancers + +=head1 SYNOPSIS + +Just run + + fapi -h + +or + + f -h + +because it's shorter to type. + +=head1 ABOUT + +This is a simple command line client to do basic stuff with the iControl F5 API +such as: + + Managing Nodes + Managing Monitors + Managing Pools + Managing Virtual Servers + + +This is a private programming project programmed in my spare time. Therefore I +didn't bother to put it on a public website and github. Please open bug +reports, feature requests and pull requests at +L. + +=head1 BIGSUDS + +=head2 Requirement of bigsuds + +This tool depends on bigsuds. Please install this library from F5 dev central +manually. Otherwise this script will not work. + +You can download bigsuds from here: + +L + +Unzip it and run + + sudo python setyp.py install + +You may also install bigsuds from the contrib dir of the fapi source tree. + +=head2 iControl reference + +Through bigsuds you can do everything what iControl can do: + +L + + +=head1 QUICK START + +Update your sources list: + + curl http://deb.buetow.org/apt/pubkey.gpg | sudo apt-key add - + echo 'deb http://deb.buetow.org/apt wheezy main' > \ + /etc/apt/sourcees.list.d/buetoworg.list + aptitude update + +And run + + aptitude install fapi + cp /usr/share/fapi/fapi.conf.sample ~/.fapi.conf + vim ~/.fapi.conf + + +=head1 EXAMPLES + +=head2 Listing + +If you want to list all configured objects on your partition just run + + f node # To list all nodes + f pool # To list all pool + ... # etc + +=head2 Setting up simple NAT Services + + (Docu to be written) + +=head2 Setting up simple SNAT Services + + (Docu to be written) + +=head2 Setting up a simple nPath Service + +A simple nPath service can be created as follows. + + # Creating two nodes, fapi auto resolves the IP addresses, and use the + # FQDN as the node name. + f node fooserver1.example.com create + f node fooserver2.example.com create + + # Creating a pool and add the nodes to it. Also specify the node ports to + # use by the monitors (and maybe PAT if enabled) + f pool foopool create + f pool foopool add member fooserver1.example.com:80 + f pool foopool add member fooserver2.example.com:80 + + # Add a monitor to the pool + f pool foopool add monitor http_lbtest + + # Create a nPath HTTP vserver, 'nPath' also auto disables NAT and PAT + # fapi auto resolves the IP address. + f vserver myvserver.example.com:80 create PROTOCOL_TCP nPath + + # Add the pool to the vserver. The vservers name inside of BigIP will be + # the FQDN followed by _PORT. In this case it would be: + # myvserver.example.com_80 (or full: /Partition/myvserver.example.com_80) + # The reason is that : are not allowed in vserver names. + f vserver myvserver.example.com:80 set pool foopool + + # Add a nPath HTTPS vserver + f vserver myvserver.example.com:443 create PROTOCOL_TCP nPath + f vserver myvserver.example.com:443 set pool foopool + +And everything can be deleted as folows: + + # You can also specify the full object name (including the partition) + f vserver /Common/myvserver.example.com_80 delete + + # Or just the way the service was created from command line + f vserver myvserver.example.com:443 delete + + f pool foopool delete + f node fooserver1.example.com delete + f node fooserver2.example.com delete + + +=head1 AUTHOR + +Paul C. Buetow - + +Also see L + +=cut diff --git a/README.txt b/README.txt deleted file mode 100644 index 4a27747..0000000 --- a/README.txt +++ /dev/null @@ -1,125 +0,0 @@ -NAME - fapi - A humble command line tool to manage F5 BigIP loadbalancers - -SYNOPSIS - Just run - - fapi -h - - or - - f -h - - because it's shorter to type. - -ABOUT - This is a simple command line client to do basic stuff with the iControl - F5 API such as: - - Managing Nodes - Managing Monitors - Managing Pools - Managing Virtual Servers - - This is a private programming project programmed in my spare time. - Therefore I didn't bother to put it on a public website and github. - Please open bug reports, feature requests and pull requests at - . - -BIGSUDS - Requirement of bigsuds - This tool depends on bigsuds. Please install this library from F5 dev - central manually. Otherwise this script will not work. - - You can download bigsuds from here: - - - - Unzip it and run - - sudo python setyp.py install - - You may also install bigsuds from the contrib dir of the fapi source - tree. - - iControl reference - Through bigsuds you can do everything what iControl can do: - - - -QUICK START - Update your sources list: - - curl http://deb.buetow.org/apt/pubkey.gpg | sudo apt-key add - - echo 'deb http://deb.buetow.org/apt wheezy main' > \ - /etc/apt/sourcees.list.d/buetoworg.list - aptitude update - - And run - - aptitude install fapi - cp /usr/share/fapi/fapi.conf.sample ~/.fapi.conf - vim ~/.fapi.conf - -EXAMPLES - Listing - If you want to list all configured objects on your partition just run - - f node # To list all nodes - f pool # To list all pool - ... # etc - - Setting up simple NAT Services - (Docu to be written) - - Setting up simple SNAT Services - (Docu to be written) - - Setting up a simple nPath Service - A simple nPath service can be created as follows. - - # Creating two nodes, fapi auto resolves the IP addresses, and use the - # FQDN as the node name. - f node fooserver1.example.com create - f node fooserver2.example.com create - - # Creating a pool and add the nodes to it. Also specify the node ports to - # use by the monitors (and maybe PAT if enabled) - f pool foopool create - f pool foopool add member fooserver1.example.com:80 - f pool foopool add member fooserver2.example.com:80 - - # Add a monitor to the pool - f pool foopool add monitor http_lbtest - - # Create a nPath HTTP vserver, 'nPath' also auto disables NAT and PAT - # fapi auto resolves the IP address. - f vserver myvserver.example.com:80 create PROTOCOL_TCP nPath - - # Add the pool to the vserver. The vservers name inside of BigIP will be the - # FQDN followed by _PORT. In this case it would be: - # myvserver.example.com_80 (or full: /Partition/myvserver.example.com_80) - # The reason is that : are not allowed in vserver names. - f vserver myvserver.example.com:80 set pool foopool - - # Add a nPath HTTPS vserver - f vserver myvserver.example.com:443 create PROTOCOL_TCP nPath - f vserver myvserver.example.com:443 set pool foopool - - And everything can be deleted as folows: - - # You can also specify the full object name (including the partition) - f vserver /Common/myvserver.example.com_80 delete - - # Or just the way the service was created from command line - f vserver myvserver.example.com:443 delete - - f pool foopool delete - f node fooserver1.example.com delete - f node fooserver2.example.com delete - -AUTHOR - Paul C. Buetow - - - Also see - diff --git a/docs/fapi.1 b/docs/fapi.1 index cb739b0..dbe6500 100644 --- a/docs/fapi.1 +++ b/docs/fapi.1 @@ -124,7 +124,7 @@ .\" ======================================================================== .\" .IX Title "FAPI 1" -.TH FAPI 1 "2014-04-15" "fapi 0.0.3" "User Commands" +.TH FAPI 1 "2014-04-16" "fapi 0.0.3" "User Commands" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l @@ -247,8 +247,8 @@ A simple nPath service can be created as follows. \& # fapi auto resolves the IP address. \& f vserver myvserver.example.com:80 create PROTOCOL_TCP nPath \& -\& # Add the pool to the vserver. The vservers name inside of BigIP will be the -\& # FQDN followed by _PORT. In this case it would be: +\& # Add the pool to the vserver. The vservers name inside of BigIP will be +\& # the FQDN followed by _PORT. In this case it would be: \& # myvserver.example.com_80 (or full: /Partition/myvserver.example.com_80) \& # The reason is that : are not allowed in vserver names. \& f vserver myvserver.example.com:80 set pool foopool diff --git a/docs/fapi.txt b/docs/fapi.txt index 4a27747..b3d0a4f 100644 --- a/docs/fapi.txt +++ b/docs/fapi.txt @@ -96,8 +96,8 @@ EXAMPLES # fapi auto resolves the IP address. f vserver myvserver.example.com:80 create PROTOCOL_TCP nPath - # Add the pool to the vserver. The vservers name inside of BigIP will be the - # FQDN followed by _PORT. In this case it would be: + # Add the pool to the vserver. The vservers name inside of BigIP will be + # the FQDN followed by _PORT. In this case it would be: # myvserver.example.com_80 (or full: /Partition/myvserver.example.com_80) # The reason is that : are not allowed in vserver names. f vserver myvserver.example.com:80 set pool foopool -- cgit v1.2.3 From 50bf405eda62839b1d28dd7c6421be35abd7ee87 Mon Sep 17 00:00:00 2001 From: "Paul C. Buetow" Date: Wed, 16 Apr 2014 08:06:08 +0200 Subject: fix print_version and remove ./-m switch --- src/fapi | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/fapi b/src/fapi index 0d0d3fb..0971d5f 100755 --- a/src/fapi +++ b/src/fapi @@ -20,12 +20,14 @@ __program__ = 'fapi' __version__ = 'VERSION_DEVEL' # Replaced by a Makefile tsubet __prompt__ = '>>>' # Default prompt +def print_version(): + print 'This is %s version %s' % (__program__, __version__) def print_synopsis(): ''' Prints the full Synopsis string ''' + print_version() print "\n".join([ - 'This is %s version %s' % (__program__, __version__), '', 'Synopsis:', ' fapi monitor', @@ -230,7 +232,7 @@ class Fapi(object): elif a.sub == 'create': poolmembers = [] - method = a.m + method = 'LB_METHOD_ROUND_ROBIN' if a.sub3: for x in a.sub3.split(','): fqdn, ip, port = self.lookup(x) @@ -434,8 +436,6 @@ if __name__ == '__main__': parser.add_argument('-h', action='store_true', help='Help') parser.add_argument('-v', action='store_true', help='Verbose') parser.add_argument('-V', action='store_true', help='Print version') - parser.add_argument('-m', action='store', help='The default lbmethod', - default='LB_METHOD_ROUND_ROBIN') parser.add_argument('-C', action='store', help='Config file', default=expanduser('~') + '/.fapi.conf') @@ -456,6 +456,7 @@ if __name__ == '__main__': sys.exit(0) if args.V: + print_version() sys.exit(0) fapi = Fapi(args) -- cgit v1.2.3 From e4279c5fbadeacbbd12975f33db3fafca680cd5c Mon Sep 17 00:00:00 2001 From: "Paul C. Buetow" Date: Wed, 16 Apr 2014 08:10:56 +0200 Subject: fix --- src/fapi | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/fapi b/src/fapi index 0971d5f..a27549d 100755 --- a/src/fapi +++ b/src/fapi @@ -64,7 +64,11 @@ class Fapi(object): self._args = args self._config = ConfigParser.ConfigParser() self._config.read(args.C) - self._partition = self._config.get('fapi', 'partition') + + if args.p != None: + self._partition = args.p + else: + self._partition = self._config.get('fapi', 'partition') def __login(self): @@ -434,6 +438,7 @@ if __name__ == '__main__': parser = argparse.ArgumentParser(add_help=False) parser.add_argument('-h', action='store_true', help='Help') + parser.add_argument('-p', action='store', help='Overwrite partition from fapi.conf') parser.add_argument('-v', action='store_true', help='Verbose') parser.add_argument('-V', action='store_true', help='Print version') parser.add_argument('-C', action='store', help='Config file', -- cgit v1.2.3 From 49f3a84b5afc78a6f10e1886ad0382b218255d4e Mon Sep 17 00:00:00 2001 From: "Paul C. Buetow" Date: Wed, 16 Apr 2014 08:20:04 +0200 Subject: can choose betwen loadbalancer envs with the ./-e argument --- src/fapi | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/fapi b/src/fapi index a27549d..3b02caf 100755 --- a/src/fapi +++ b/src/fapi @@ -88,12 +88,17 @@ class Fapi(object): password = getpass.getpass(prompt) self.info('Login to BigIP API with user %s' % username) + if a.e != None: + loadbalancers = c.get('fapi', 'loadbalancers_' + a.e) + else: + loadbalancers = c.get('fapi', 'loadbalancers') + # Try a comma separated lists of F5 boxes, use the first one err = None - for hostname in c.get('fapi', 'hostnames').split(','): + for loadbalancer in loadbalancers.split(','): try: - self.info('Trying to login to \'%s\'' % hostname) - self._f5 = bigsuds.BIGIP(hostname = hostname, + self.info('Trying to login to \'%s\'' % loadbalancer) + self._f5 = bigsuds.BIGIP(hostname = loadbalancer, username = username, password = password) self._f5.Management.Partition.set_active_partition(self._partition) @@ -101,7 +106,7 @@ class Fapi(object): err = None break except Exception, e: - err = '%s:%s' % (hostname, e) + err = '%s:%s' % (loadbalancer, e) pass if err: @@ -437,6 +442,7 @@ if __name__ == '__main__': ''' The main function, here we will have Popcorn for free! ''' parser = argparse.ArgumentParser(add_help=False) + parser.add_argument('-e', action='store', help='Env to use, e.g. dev,qa,live') parser.add_argument('-h', action='store_true', help='Help') parser.add_argument('-p', action='store', help='Overwrite partition from fapi.conf') parser.add_argument('-v', action='store_true', help='Verbose') -- cgit v1.2.3 From 9f201d6b32a1c97a4e70f955b4ccd8b0b1ead1c5 Mon Sep 17 00:00:00 2001 From: "Paul C. Buetow" Date: Wed, 16 Apr 2014 08:22:34 +0200 Subject: Your fly might be open (but don't check it just now). --- docs/fapi.pod | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/docs/fapi.pod b/docs/fapi.pod index ca02281..f0f7394 100644 --- a/docs/fapi.pod +++ b/docs/fapi.pod @@ -80,17 +80,7 @@ If you want to list all configured objects on your partition just run f pool # To list all pool ... # etc -=head2 Setting up simple NAT Services - - (Docu to be written) - -=head2 Setting up simple SNAT Services - - (Docu to be written) - -=head2 Setting up a simple nPath Service - -A simple nPath service can be created as follows. +=head2 Setting up a simple pool # Creating two nodes, fapi auto resolves the IP addresses, and use the # FQDN as the node name. @@ -106,6 +96,10 @@ A simple nPath service can be created as follows. # Add a monitor to the pool f pool foopool add monitor http_lbtest +=head2 Setting up a simple nPath Service + +A simple nPath service can be created as follows. + # Create a nPath HTTP vserver, 'nPath' also auto disables NAT and PAT # fapi auto resolves the IP address. f vserver myvserver.example.com:80 create PROTOCOL_TCP nPath @@ -132,6 +126,13 @@ And everything can be deleted as folows: f node fooserver1.example.com delete f node fooserver2.example.com delete +=head2 Setting up simple NAT Services + + (Docu to be written) + +=head2 Setting up simple SNAT Services + + (Docu to be written) =head1 AUTHOR -- cgit v1.2.3 From 3666d7d9d08d6c79017f57085ca8270961bafde9 Mon Sep 17 00:00:00 2001 From: "Paul C. Buetow" Date: Wed, 16 Apr 2014 08:26:44 +0200 Subject: Fine day to work off excess energy. Steal something heavy. --- fapi.conf.sample | 7 +++++-- src/fapi | 9 +++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/fapi.conf.sample b/fapi.conf.sample index 57216ea..b1085da 100644 --- a/fapi.conf.sample +++ b/fapi.conf.sample @@ -2,6 +2,9 @@ [fapi] username: paul password64: SECRET -# Will try every box and will use the first one which works -hostnames: bigip.example.com,bigip2.example.com +# The qa loadbalancers (if specified -e qa) +loadbalancers_qa: qa-01.example.com,qa-02.example.com +# The qa loadbalancers (if specified -e live) +loadbalancers_live: be-01.example.com,qa-be-02.example.com,qa-be-03.lb.server.la +# You can specify your own/more envs too... partition: Common diff --git a/src/fapi b/src/fapi index 3b02caf..9a4dd9f 100755 --- a/src/fapi +++ b/src/fapi @@ -88,12 +88,8 @@ class Fapi(object): password = getpass.getpass(prompt) self.info('Login to BigIP API with user %s' % username) - if a.e != None: - loadbalancers = c.get('fapi', 'loadbalancers_' + a.e) - else: - loadbalancers = c.get('fapi', 'loadbalancers') - # Try a comma separated lists of F5 boxes, use the first one + loadbalancers = c.get('fapi', 'loadbalancers_' + a.e) err = None for loadbalancer in loadbalancers.split(','): try: @@ -442,7 +438,8 @@ if __name__ == '__main__': ''' The main function, here we will have Popcorn for free! ''' parser = argparse.ArgumentParser(add_help=False) - parser.add_argument('-e', action='store', help='Env to use, e.g. dev,qa,live') + parser.add_argument('-e', action='store', help='Env to use, e.g. dev,qa,live', + default='qa') parser.add_argument('-h', action='store_true', help='Help') parser.add_argument('-p', action='store', help='Overwrite partition from fapi.conf') parser.add_argument('-v', action='store_true', help='Verbose') -- cgit v1.2.3