Fabric hello world
I’m using Xubuntu 12.04.03 32bit
What is Fabric?
In this tutorial I’m using fabric to:
- make whoami command to every user
- method that puts file/folder to user
- method that gets file/folder from user
I have done 4 users and created public key authentication to them. You can see how I have done it from this tutorial:
Public key authentication over SSH
Install Fabric from apt
$ sudo apt-get update && sudo apt-get -y install fabric
Or you can get it from pip.
$ sudo apt-get update && sudo apt-get -y install python-pip
$ sudo pip install fabric
Whoami
Create fabric folder and fabfile.py
$ mkdir fabric
$ cd fabric/
$ nano fabfile.py
Create fabfile what runs command whoami to every user over ssh.
from fabric.api import env, run
env.hosts=["soivite01@localhost", "soivite02@localhost",
"soivite03@localhost", "soivite04@localhost"]
#env.password="password"
env.parallel=True
def whoami_check():
run("whoami")
With fab -l you can see all commands
$ fab -l
Available commands:
whoami_check
Run whoami_check with fabric.
$ fab whoami_check
[soivite01@localhost] Executing task 'whoami_check'
...
[soivite04@localhost] run: whoami
...
[soivite01@localhost] out: soivite01
[soivite02@localhost] out: soivite02
[soivite03@localhost] out: soivite03
[soivite04@localhost] out: soivite04
Done.
Using time before the command you can see how much time is used to run fabric command.
$ time fab whoami_check
...
real 0m2.234s
user 0m0.692s
sys 0m0.060s
Put and get files
Create example file that you can put to users and get that same file from users.
$ nano sendFile.txt
Hello World
Modify fabfile. Add file_put and file_get methods.
$ nano fabfile.py
Add put and get to imports
from fabric.api import env, run, put, get
If you don’t want to give every import by hand you can use this too
from fabric.api import *
Add file_put and file_get methods to end of the class.
...
def file_put():
put("sendFile.txt")
def file_get():
get("sendFile.txt")
Run file_put so your adding files to users.
$ fab file_put
[soivite01@localhost] Executing task 'file_put'
[soivite01@localhost] put: sendFile.txt -> /home/soivite01/sendFile.txt
...
Done.
Disconnecting from soivite01@localhost... done.
...
Run file_get to get same files what you have added.
$ fab file_get
[soivite01@localhost] Executing task 'file_get'
[soivite01@localhost] download: /home/xubuntu/fabric/soivite01@localhost/sendFile.txt <- /home/soivite01/sendFile.txt
...
Done.
Disconnecting from soivite01@localhost... done.
...
Your fabric folder now looks like this.
fabric/
├── fabfile.py
├── fabfile.pyc
├── sendFile.txt
├── soivite01@localhost
│ └── sendFile.txt
├── soivite02@localhost
│ └── sendFile.txt
├── soivite03@localhost
│ └── sendFile.txt
└── soivite04@localhost
└── sendFile.txt
Put and get folders
Create folder and couple files in there
$ mkdir testFolder && touch testFolder/file1 testFolder/file2
Modify fabfile
$ nano fabfile.py
Create method that puts folder to users and gets it.
...
def folder():
put("testFolder")
get("testFolder")
Run command
$ fab folder
[soivite01@localhost] Executing task 'folder'
[soivite01@localhost] put: testFolder/file2 -> /home/soivite01/testFolder/file2
[soivite01@localhost] put: testFolder/file1 -> /home/soivite01/testFolder/file1
[soivite01@localhost] download: /home/xubuntu/fabric/soivite01@localhost/testFolder/file1 <- /home/soivite01/testFolder/file1
[soivite01@localhost] download: /home/xubuntu/fabric/soivite01@localhost/testFolder/file2 <- /home/soivite01/testFolder/file2
...
Your folder tree looks like this.
fabric/
├── fabfile.py
├── fabfile.pyc
├── sendFile.txt
├── soivite01@localhost
│ ├── sendFile.txt
│ └── testFolder
│ ├── file1
│ └── file2
├── soivite02@localhost
│ ├── sendFile.txt
│ └── testFolder
│ ├── file1
│ └── file2
├── soivite03@localhost
│ ├── sendFile.txt
│ └── testFolder
│ ├── file1
│ └── file2
├── soivite04@localhost
│ ├── sendFile.txt
│ └── testFolder
│ ├── file1
│ └── file2
└── testFolder
├── file1
└── file2
Your fabfile.py looks like this
from fabric.api import env, run, put, get
env.hosts=["soivite01@localhost", "soivite02@localhost",
"soivite03@localhost", "soivite04@localhost"]
#env.password="password"
env.parallel=True
def whoami_check():
run("whoami")
def file_put():
put("sendFile.txt")
def file_get():
get("sendFile.txt")
def folder():
put("testFolder")
get("testFolder")
Next tutorial you learn how to use sudo:
Using sudo in Fabric