Quickstart

Use the role mechanism of tissu in your fabfile.py

First, you need to install tissu...

So create your fabfile.py with these lines of code.

import os, sys

current_dir = os.path.dirname(os.path.abspath(__file__))
sys.path.append(current_dir)

from fabric.api import *
from tissu.tasks import *

We need to add the current directory to sys.path. Without these lines the environnement loader can’t load any settings.

Now you have 3 tasks, e and tissu_init.

$ fab -l
Available commands:

    e               Environnement loader
    tissu_init      Init the settings scaffolding
    tissu_print     Print FABRIC env dict and TISSU settings public properties

Now you have to generate the default settings scaffolding. That’s the purpose of tissu_init. By default, Tissu need a python module “settings.default”.

Now, launch the taks tissu_ini

$ fab tissu_init
[localhost] local: mkdir -p settings
[localhost] local: touch settings/__init__.py
settings/default.py written

Done.

Now tissu had everithing he need for handle your first environment.

.
├── fabfile.py
└── settings
    ├── default.py
    └── __init__.py

Create a new file in settings foo.py, with this sample of code.

# My first environnement

SERVER_A = {
 "user" : "foo",
 "hostname" : "localhost",
 "password": "password",
}

SERVER_B = {
 "user" : "foo",
 "hostname" : "server.example.org",
 "key": "/home/foo/.ssh/id_rsa.pub"

}

FABRIC_ROLES = {
    "db":       [SERVER_A],
    "web":      [SERVER_B],
}

We can load our first environnement

fab e:foo
Environment foo sucessfully loaded :)

Done.

We will add some tasks in order to do something with this environement.

def hello():
    run("echo hello && uptime")

@roles("db")
@task
def hello_db():
    hello()

@roles("web")
@task
def hello_web():
    hello()

@roles("all")
@task
def hello_all():
    hello()

Now you have three new tasks :

  • hello_db will execute hello to the SERVER_A, because it is in the role db.
  • hello_web will execute hello to the SERVER_B, because it is in the role web.
  • hello_all will execute hello in all remote machines.

Note: The role all is automaticly generate by tissu. Note: You have to setup the foo settings with real remote machines.

A example of what you get when you try these tasks :

$ fab e:foo hello_db hello_web hello_all
Environment foo sucessfully loaded :)
[thierry@localhost:22] Executing task 'hello_db'
[thierry@localhost:22] run: echo hello && uptime
[thierry@localhost:22] out: hello
[thierry@localhost:22] out:  16:17:57 up 13 days,  6:02,  5 users,  load average: 0,16, 0,31, 0,38
[thierry@localhost:22] out:

[thierry@192.168.0.19:22] Executing task 'hello_web'
[thierry@192.168.0.19:22] run: echo hello && uptime
[thierry@192.168.0.19:22] out: hello
[thierry@192.168.0.19:22] out:  16:18:00 up 13 days,  6:02,  5 users,  load average: 0,23, 0,32, 0,38
[thierry@192.168.0.19:22] out:

[thierry@192.168.0.19:22] Executing task 'hello_all'
[thierry@192.168.0.19:22] run: echo hello && uptime
[thierry@192.168.0.19:22] out: hello
[thierry@192.168.0.19:22] out:  16:18:00 up 13 days,  6:02,  5 users,  load average: 0,23, 0,32, 0,38
[thierry@192.168.0.19:22] out:

[thierry@localhost:22] Executing task 'hello_all'
[thierry@localhost:22] run: echo hello && uptime
[thierry@localhost:22] out: hello
[thierry@localhost:22] out:  16:18:00 up 13 days,  6:02,  5 users,  load average: 0,23, 0,32, 0,38
[thierry@localhost:22] out:

Retrieve the settings loaded by tissu

We assume that you have a foo.py settings created.

First we add a new settings : BAR, our foo settings become :

::

# My first environnement

SERVER_A = {
“user” : “thierry”, “hostname” : “localhost”, “password”: “cordonchat”,

}

SERVER_B = {
“user” : “thierry”, “hostname” : “192.168.0.19”, “password”: “cordonchat”

}

FABRIC_ROLES = {
“db”: [SERVER_A], “web”: [SERVER_B],

}

BAR = “foo”

In our fabfile, we add a new task that print us the value of BAR.

@task
def bar():
    from tissu.conf import settings
    puts("BAR value is: %s" % getattr(settings, "BAR", "not found !"))

When we don’t specify any environnement we’ve got :

$ fab bar
BAR value is: ERROR !

Done.

And when we use our foo environement we’ve got :

$ fab e:foo bar
Environment foo sucessfully loaded :)
BAR value is: foo

Done.

Additionnaly, Tissu add the settings into the fabric env.

@task
def envbar():
    from fabric.api import env
    puts("BAR value from env is: %s " % getattr(env.my_settings, "BAR", "not found !"))

And then we got :

$ fab e:foo envbar
Environment foo sucessfully loaded :)
BAR value from env is: foo

Done.