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
1.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
700
Non Sequitur: An exploration of Python's random module
jairtrejo
0
780
Other Decks in Programming
See All in Programming
Java 21/25 Virtual Threads 소개
debop
0
230
Cyrius ーLinux非依存にコンテナをネイティブ実行する専用OSー
n4mlz
0
230
PHP 7.4でもOpenTelemetryゼロコード計装がしたい! / PHPerKaigi 2026
arthur1
1
360
野球解説AI Agentを開発してみた - 2026/02/27 LayerX社内LT会資料
shinyorke
PRO
0
350
CSC307 Lecture 15
javiergs
PRO
0
260
AI駆動開発の本音 〜Claude Code並列開発で見えたエンジニアの新しい役割〜
hisuzuya
4
530
エンジニアの「手元の自動化」を加速するn8n 2026.02.27
symy2co
0
170
今からFlash開発できるわけないじゃん、ムリムリ! (※ムリじゃなかった!?)
arkw
0
130
Takumiから考えるSecurity_Maturity_Model.pdf
gessy0129
1
150
What Spring Developers Should Know About Jakarta EE
ivargrimstad
0
730
Claude Codeセッション現状確認 2026福岡 / fukuoka-aicoding-00-beacon
monochromegane
4
450
AI時代のシステム設計:ドメインモデルで変更しやすさを守る設計戦略
masuda220
PRO
6
1.1k
Featured
See All Featured
Product Roadmaps are Hard
iamctodd
PRO
55
12k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
64
52k
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
200
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
160
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
118
110k
Fireside Chat
paigeccino
42
3.8k
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
650
Documentation Writing (for coders)
carmenintech
77
5.3k
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
120
A Tale of Four Properties
chriscoyier
163
24k
Mobile First: as difficult as doing things right
swwweet
225
10k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
130
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