Python for Linux system administration (yes, this is a commercial) Vern Ceder Fort Wayne LUG Fort Wayne, IN
Instead of? the “official” languages for sysamins bash* (and awk and sed) *or your favorite similar shell perl (if you don't believe me, ask O'Reilly)
http://www.oreillyschool.com/courses/asac4/
A scripting language should handle input & output process text – search, replace, pattern matching, etc. traverse filesystems use system utilities and libraries (glue)
What's wrong with bash & perl? Nothing, really...
bash is a great glue language pipes things like a champ has a ton of utilities (the whole system, in fact)
awk and sed handle strings brilliantly
perl combines it all...
but... bash is a pain when things get complex sed is tricky perl makes my head hurt (I always have rather liked awk)
So what about Python? handles strings well is a good “glue” “batteries included” → I/O, filesystem, etc large collection of external libs
Python also is very readable (and easy to maintain) is expressive is easy to grasp is either OO (or not) is fun
everyone's doing it Redhat Ubuntu Google etc, etc, etc...
but... (there's always a “but”) regular expressions aren't built-in not (quite) as common as perl
and let's talk about the elephant in the room
indentation yes, Python uses indentation to organize code it makes code more readable it's no weirder than {} or @$% get over it
strings some built-in string methods split lower strip upper join isdigit replace swapcase find expandtabs count center startswith encode/decode endswith format
for example to do what wc does: #!/usr/bin/env python import sys data = sys.stdin.read() chars = len(data) words = len(data.split()) lines = len(data.split('n')) print ("{0} {1} {2}".format(lines, words, chars)) doc@paladin:~/work/olf$ ./wc.py < wc.py 12 22 189
or number of occurrences? in bash (not mine): doc@pal:~/olf$ tr " " "n" < wc.py | grep len | wc -w 3 in Python: #!/usr/bin/env python import sys data = sys.stdin.read() print data.count(sys.argv[1]) doc@paladin:~/work/olf$ ./num_occur.py len < wc.py 3
regular expressions re module syntax similar to perl import re >>> re.findall("[Ll]en", "len is the Length") ['len', 'Len']
exception handling y = 10 try: x = y / 0 except ZeroDivisionError, e: print e integer division or modulo by zero
glue multiple ways to call other programs and pipe the results sys.stdin, sys.stdout, sys.stderr os.system(), os.spawnl() subprocess.call() subprocess.Popen()
Modules: subprocess from subprocess import * p = Popen(["ls", "-l"], stdout=PIPE, stderr=PIPE) out, err = p.communicate()
files, directories and more the os and sys modules os.environ sys.argv os.getcwd sys.stdin os.chmod sys.stdout os.chown sys.stderr os.link sys.platform os.mkdir sys.exit os.remove os.rename
Modules: os os.walk() import os >>> for x in os.walk('.'): ... print x ... ('.', ['emptydir'], [ 'chinese-python- poster.jpg', 'olf_proposal.txt', 'wc.py', 'olf.odp', 'shell.png', 'olf.txt', 'Pil.gif', 'adminscripting.png', 'num_occur.py']) ('./emptydir', [], [])
Modules: os.path exists getmtime isfile isdir islink ismount samefile split
command line arguments sys.argv list of all arguments optparse parsing all types of arguments returns options and parameters automatic help
Modules: others databases – sqlite3 and others fork threading
ssh – paramiko #!/usr/bin/env python import paramiko hostname = 'localhost' port = 22 username = 'test' password = 'password' paramiko.util.log_to_file('paramiko.log') s = paramiko.SSHClient() s.load_system_host_keys() s.connect(hostname, port, username, password) stdin, stdout, stderr = s.exec_command('ifconfig') print stdout.read() s.close()
daemons python-daemon import daemon from spam import main_program with daemon.DaemonContext(): main_program
ctypes load and use C libraries also works with Windows DLL's >>> from ctypes import * >>> libc = CDLL("libc.so.6") >>> libc.printf("hello %sn", "Python") hello Python 13 >>> print libc.time(None) 1253757776 >>> import datetime >>> datetime.datetime.fromtimestamp(libc.time(None)) datetime.datetime(2009, 9, 23, 22, 5, 56)
A 2 line HTTP server from http.server import HTTPServer, SimpleHTTPRequestHandler server = HTTPServer(("",8000), SimpleHTTPRequestHandler) server.serve_forever()
What about Python 3? it's a better language than 2.x it's not backward compatible it's supported by the developers it's the future it's not here (for sysadmins) yet
ipython, the uber shell extensive history usable as a system shell http://ipython.scipy.org In [1]: print "hello" ------> print("hello") hello In [2]: ls adminscripting.png olf.odp Pil.gif
nd Quick Python Book, 2 ed covering Python 3 due out late this year http://www.manning.com/ceder
World's largest Python conference Talks PyCon 2010 Open Space Tutorials Hands-On Lab Lightning Talks Feb. 17-25 Exhibit Hall Keynotes Atlanta, GA Sprints NOW with Poster sessions! us.pycon.org Photo: james.rintamaki License: Attribution- Share Alike 2.0 Generic
Resources & contact info Python for Unix and Linux System Administration, Noah Gift, Jeremy M. Jones, O'Reilly Media 2008 Pro Python System Administration, Rytis Sileika, Apress, (not yet published) “Python for system administrators”, James Knowlton, IBM DeveloperWorks, 2007 http://www.ibm.com/developerworks/aix/library/au-python/ Python Cookbook, Martelli, Ravenscroft & Ascher, O'Reilly Media 2005
Contact info http://tech.canterburyschool.org/tech/VernCeder http://www.manning.com/ceder vceder@gmail.com

Python for Linux System Administration

  • 1.
    Python for Linux systemadministration (yes, this is a commercial) Vern Ceder Fort Wayne LUG Fort Wayne, IN
  • 2.
    Instead of? the “official”languages for sysamins bash* (and awk and sed) *or your favorite similar shell perl (if you don't believe me, ask O'Reilly)
  • 3.
  • 4.
    A scripting languageshould handle input & output process text – search, replace, pattern matching, etc. traverse filesystems use system utilities and libraries (glue)
  • 5.
    What's wrong with bash & perl? Nothing, really...
  • 6.
    bash is a greatglue language pipes things like a champ has a ton of utilities (the whole system, in fact)
  • 7.
    awk and sed handlestrings brilliantly
  • 8.
  • 9.
    but... bashis a pain when things get complex sed is tricky perl makes my head hurt (I always have rather liked awk)
  • 10.
    So what aboutPython? handles strings well is a good “glue” “batteries included” → I/O, filesystem, etc large collection of external libs
  • 11.
    Python also is very readable (and easy to maintain) is expressive is easy to grasp is either OO (or not) is fun
  • 12.
    everyone's doing it Redhat Ubuntu Google etc, etc, etc...
  • 13.
    but... (there's always a “but”) regular expressions aren't built-in not (quite) as common as perl
  • 14.
    and let's talkabout the elephant in the room
  • 15.
    indentation yes, Python usesindentation to organize code it makes code more readable it's no weirder than {} or @$% get over it
  • 16.
    strings some built-in stringmethods split lower strip upper join isdigit replace swapcase find expandtabs count center startswith encode/decode endswith format
  • 17.
    for example to do what wc does: #!/usr/bin/env python import sys data = sys.stdin.read() chars = len(data) words = len(data.split()) lines = len(data.split('n')) print ("{0} {1} {2}".format(lines, words, chars)) doc@paladin:~/work/olf$ ./wc.py < wc.py 12 22 189
  • 18.
    or number ofoccurrences? in bash (not mine): doc@pal:~/olf$ tr " " "n" < wc.py | grep len | wc -w 3 in Python: #!/usr/bin/env python import sys data = sys.stdin.read() print data.count(sys.argv[1]) doc@paladin:~/work/olf$ ./num_occur.py len < wc.py 3
  • 19.
    regular expressions re module syntax similar to perl import re >>> re.findall("[Ll]en", "len is the Length") ['len', 'Len']
  • 20.
    exception handling y =10 try: x = y / 0 except ZeroDivisionError, e: print e integer division or modulo by zero
  • 21.
    glue multiple waysto call other programs and pipe the results sys.stdin, sys.stdout, sys.stderr os.system(), os.spawnl() subprocess.call() subprocess.Popen()
  • 22.
    Modules: subprocess from subprocessimport * p = Popen(["ls", "-l"], stdout=PIPE, stderr=PIPE) out, err = p.communicate()
  • 23.
    files, directories andmore the os and sys modules os.environ sys.argv os.getcwd sys.stdin os.chmod sys.stdout os.chown sys.stderr os.link sys.platform os.mkdir sys.exit os.remove os.rename
  • 24.
    Modules: os os.walk() import os >>> for x in os.walk('.'): ... print x ... ('.', ['emptydir'], [ 'chinese-python- poster.jpg', 'olf_proposal.txt', 'wc.py', 'olf.odp', 'shell.png', 'olf.txt', 'Pil.gif', 'adminscripting.png', 'num_occur.py']) ('./emptydir', [], [])
  • 25.
    Modules: os.path exists getmtime isfile isdir islink ismount samefile split
  • 26.
    command line arguments sys.argv list of all arguments optparse parsing all types of arguments returns options and parameters automatic help
  • 27.
    Modules: others databases –sqlite3 and others fork threading
  • 28.
    ssh – paramiko #!/usr/bin/envpython import paramiko hostname = 'localhost' port = 22 username = 'test' password = 'password' paramiko.util.log_to_file('paramiko.log') s = paramiko.SSHClient() s.load_system_host_keys() s.connect(hostname, port, username, password) stdin, stdout, stderr = s.exec_command('ifconfig') print stdout.read() s.close()
  • 29.
    daemons python-daemon import daemon from spam import main_program with daemon.DaemonContext(): main_program
  • 30.
    ctypes load and use C libraries also works with Windows DLL's >>> from ctypes import * >>> libc = CDLL("libc.so.6") >>> libc.printf("hello %sn", "Python") hello Python 13 >>> print libc.time(None) 1253757776 >>> import datetime >>> datetime.datetime.fromtimestamp(libc.time(None)) datetime.datetime(2009, 9, 23, 22, 5, 56)
  • 31.
    A 2 lineHTTP server from http.server import HTTPServer, SimpleHTTPRequestHandler server = HTTPServer(("",8000), SimpleHTTPRequestHandler) server.serve_forever()
  • 32.
    What about Python3? it's a better language than 2.x it's not backward compatible it's supported by the developers it's the future it's not here (for sysadmins) yet
  • 33.
    ipython, the ubershell extensive history usable as a system shell http://ipython.scipy.org In [1]: print "hello" ------> print("hello") hello In [2]: ls adminscripting.png olf.odp Pil.gif
  • 34.
    nd Quick Python Book,2 ed covering Python 3 due out late this year http://www.manning.com/ceder
  • 35.
    World's largest Pythonconference Talks PyCon 2010 Open Space Tutorials Hands-On Lab Lightning Talks Feb. 17-25 Exhibit Hall Keynotes Atlanta, GA Sprints NOW with Poster sessions! us.pycon.org Photo: james.rintamaki License: Attribution- Share Alike 2.0 Generic
  • 36.
    Resources & contact info Python for Unix and Linux System Administration, Noah Gift, Jeremy M. Jones, O'Reilly Media 2008 Pro Python System Administration, Rytis Sileika, Apress, (not yet published) “Python for system administrators”, James Knowlton, IBM DeveloperWorks, 2007 http://www.ibm.com/developerworks/aix/library/au-python/ Python Cookbook, Martelli, Ravenscroft & Ascher, O'Reilly Media 2005
  • 37.
    Contact info http://tech.canterburyschool.org/tech/VernCeder http://www.manning.com/ceder vceder@gmail.com