Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Fabric for fun and profit
Search
Jair Trejo
September 14, 2013
Programming
4
1k
Fabric for fun and profit
An introduction to Fabric presented at PyCon APAC 2013
Jair Trejo
September 14, 2013
Tweet
Share
More Decks by Jair Trejo
See All by Jair Trejo
Storybook & React Native
jairtrejo
0
680
Non Sequitur: An exploration of Python's random module
jairtrejo
0
760
Other Decks in Programming
See All in Programming
デザイナーが Androidエンジニアに 挑戦してみた
874wokiite
0
540
ぬるぬる動かせ! Riveでアニメーション実装🐾
kno3a87
1
230
アセットのコンパイルについて
ojun9
0
130
為你自己學 Python - 冷知識篇
eddie
1
350
ユーザーも開発者も悩ませない TV アプリ開発 ~Compose の内部実装から学ぶフォーカス制御~
taked137
0
190
複雑なドメインに挑む.pdf
yukisakai1225
5
1.2k
rage against annotate_predecessor
junk0612
0
170
Ruby Parser progress report 2025
yui_knk
1
450
Android端末で実現するオンデバイスLLM 2025
masayukisuda
1
170
基礎から学ぶ大画面対応(Learning Large-Screen Support from the Ground Up)
tomoya0x00
0
3.2k
チームのテスト力を鍛える
goyoki
3
760
そのAPI、誰のため? Androidライブラリ設計における利用者目線の実践テクニック
mkeeda
2
1.8k
Featured
See All Featured
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
3k
RailsConf 2023
tenderlove
30
1.2k
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
Keith and Marios Guide to Fast Websites
keithpitt
411
22k
How GitHub (no longer) Works
holman
315
140k
Imperfection Machines: The Place of Print at Facebook
scottboms
268
13k
Making the Leap to Tech Lead
cromwellryan
135
9.5k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
7
850
Art, The Web, and Tiny UX
lynnandtonic
303
21k
Bootstrapping a Software Product
garrettdimon
PRO
307
110k
Intergalactic Javascript Robots from Outer Space
tanoku
272
27k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
16k
Transcript
Fabric for fun and profit @ jairtrejo Pycon APAC 2013
@jairtrejo Operations Director at Vinco Orbis
We script everything
We ssh in and out servers all the time
Fabric is a Python tool for streamlining the use of
SSH for systems administration
@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’)
Quick fabric introduction
$ pip install fabric
Tasks
# fabfile.py from fabric.api import task, local @task def hello():
local('echo "Hello, world"')
$ fab hello Hello, world
multi-host
# fabfile.py from fabric.api import run, task @task def host_type():
run('uname -s')
$ fab -H localhost,
[email protected]
host_type Darwin Linux
Environment dictionary
# 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')
$ fab production host_type
Case study: Gift cards
Huge files
Download link
Random URLs
Environment configuration
@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/'
It is just Python
@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", )
We can mix Python with system calls
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'])
Case study Vagrant development
SSH integration
@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
@task def syncdb(): require("site_dir") with cd(env.site_dir): run("python manage.py syncdb --noinput")
run("python manage.py migrate myapp --noinput")
$ fab vagrant syncdb
$ fab vagrant -- sudo service couchdb restart
Task composition
@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()
$ fab vagrant resetdb
Silly stuff
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)
Fabric alternatives
Ansible Server configuration
Invoke Build tool
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
Thank you! http://vincoorbis.com http://jairtrejo.mx