Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Fabric for fun and profit

4b8eaf6a72ba36db1851b76ed04bee22?s=47 Jair Trejo
September 14, 2013

Fabric for fun and profit

An introduction to Fabric presented at PyCon APAC 2013

4b8eaf6a72ba36db1851b76ed04bee22?s=128

Jair Trejo

September 14, 2013
Tweet

Transcript

  1. Fabric for fun and profit @ jairtrejo Pycon APAC 2013

  2. @jairtrejo Operations Director at Vinco Orbis

  3. We script everything

  4. We ssh in and out servers all the time

  5. Fabric is a Python tool for streamlining the use of

    SSH for systems administration
  6. @hosts(staging, production) @task def publish(): local('./build') project.rsync_project( remote_dir=DEST_PATH, local_dir=DEPLOY_PATH.rstrip('/') +

    '/', delete=True ) run(‘./bin/restart-apache’)
  7. Quick fabric introduction

  8. $ pip install fabric

  9. Tasks

  10. # fabfile.py from fabric.api import task, local @task def hello():

    local('echo "Hello, world"')
  11. $ fab hello Hello, world

  12. multi-host

  13. # fabfile.py from fabric.api import run, task @task def host_type():

    run('uname -s')
  14. $ fab -H localhost,jair@jairtrejo.mx host_type Darwin Linux

  15. Environment dictionary

  16. # fabfile.py from fabric.api import run, task, env @task def

    development(): env.hosts = [ 'fake.jairtrejo.mx', 'demo.jairtrejo.mx'] @task def production(): env.hosts = ['jairtrejo.mx'] @task def host_type(): run('uname -s')
  17. $ fab production host_type

  18. Case study: Gift cards

  19. Huge files

  20. Download link

  21. Random URLs

  22. Environment configuration

  23. @task def production(): """ Production server """ env.user = 'pdfs'

    env.hosts = ['example.com'] # Pdf’s storage env.pdf_base_dir = \ '/var/www/vhosts/example.com/httpdocs/PDFS/'
  24. It is just Python

  25. @task def find_and_rename(listing, source, destination): pdfs = [] with open(listing,

    'rb') as csvfile: reader = csv.DictReader(csvfile) for row in reader: name = ‘%s.pdf’ % row[“Client number”] if os.path.exists(os.path.join(source, name)): pdfs.append(name) else: logging.warning("Not found: %s" % name) import logging logging.basicConfig( filename='example.log', level=logging.DEBUG, format="%(asctime)s %(levelname)s: %(message)s", )
  26. We can mix Python with system calls

  27. rows = [] for original in pdfs: fname, ext =

    os.path.splitext(original) hashed, salt = hash_name(fname) hashed += ext hfname = os.path.join(destination, hashed) local( 'cp "%s" "%s"' % (os.path.join(source, original), hfname) ) rows.append( {'original': original, 'salt': salt, 'archivo': hfname}) rows.sort(key=lambda row: row['original'])
  28. Case study Vagrant development

  29. SSH integration

  30. @task def vagrant(): """ Local dev environment (local Vagrant machine)

    """ env.user = "vagrant" env.hosts = ["127.0.0.1:2222"] # Vagrant machine's ssh key result = local( "vagrant ssh-config | grep IdentityFile", capture=True) env.key_filename = result.split()[1] # Project directory env.site_dir = "~/src" Via sysadminpy.com
  31. @task def syncdb(): require("site_dir") with cd(env.site_dir): run("python manage.py syncdb --noinput")

    run("python manage.py migrate myapp --noinput")
  32. $ fab vagrant syncdb

  33. $ fab vagrant -- sudo service couchdb restart

  34. Task composition

  35. @task def resetdb(): require("site_dir") run('mysql -u root -pf5dd8Xo -e "DROP

    DATABASE mydb;" mydb') run('mysql -u root -pf5dd8Xo -e "CREATE DATABASE mydb;"') syncdb()
  36. $ fab vagrant resetdb

  37. Silly stuff

  38. if result.failed: print red("Some tests failed", bold=True) bomb = r"""

    ,--.!, __/ -*- ,d08b. '|` 0088MM `9MMP' """ print red(bomb) else: print green("All tests passed", bold=True) owl = r""" ,___, [O.o] /)__) -"--"- """ print green(owl)
  39. Fabric alternatives

  40. Ansible Server configuration

  41. Invoke Build tool

  42. Image credits (1)http://www.flickr.com/photos/worldbank/5320646943/ (2)http://blog.trendmicro.com/trendlabs-security-intelligence/mehika-twitter-botnet- targets-twitter-users/ (3)http://junofitness.blogspot.jp/2012/11/jennifer-and-julie.html (4)http://favim.com/image/361336/ (5)http://projectwhy.blogspot.jp/2013/04/a-wonderful-gift-may-not-be-wrapped-as.html (6)http://www.marysrosaries.com/collaboration/index.php?title=File:Forklift_(PSF).png (7)http://commons.wikimedia.org/wiki/File:US_Navy_070207-

    N-4973A-044_Sailors_aboard_guided_missile_destroyer_USS_O'Kane_(DDG_77)_unload_foo d_stores_and_refrigerated_items_during_a_connected_replenishment_with_Military_Sea lift_Command_(MSC)_combat_stores_ship_USNS_Conco.jpg (8)http://www.casinocenter.com/helping-luck-along/ (9)http://python.sg/ (10)http://bailtruth.com/2012/09/12/steampunk-gears-and-cogwheels-brooch-2/ (11)http://www.giglig.com/food/how-to-make-mojito (12)http://cnx.org/content/m42117/latest/?collection=col11325/latest (13)http://mother-care.net/leisure/hobby/fugu-fish-deadly-delight.html (14)http://www.tumblr.com/tagged/tinker-toys (15)http://www.deviantart.com/?view_mode=2&order=24&q=by%3Ajam-star (16)http://www.vivianpartnership.co.uk/choices-choices-choices/ (17)http://faculty.indwes.edu/bcupp/lookback/hist-08.htm (18)http://www.thebedroom.com.au/manchester/character-bedding/bob-the-builder.html
  43. Thank you! http://vincoorbis.com http://jairtrejo.mx