Fabric is a Python library and command-line tool for streamlining the use of SSH for application deployment or systems administration tasks.
http://docs.ansible.com/ansible/latest/intro_installation.html#latest-release-via-yum
Dependencies
# yum install epel-release # yum install fabric
# apt-get install fabric
# pip install fabric
# fab -V or # fab --version Fabric 1.6.2 Paramiko 1.16.1
# fab -h Usage: fab [options] <command>[:arg1,arg2=val2,host=foo,hosts='h1;h2',...] ... Options: -h, --help show this help message and exit -l, --list print list of possible commands and exit -H HOSTS, --hosts=HOSTS comma-separated list of hosts to operate on -f PATH, --fabfile=PATH python module file to import, e.g. '../other.py' -i PATH path to SSH private key file. May be repeated. -u USER, --user=USER username to use when connecting to remote hosts --skip-bad-hosts skip over hosts that can't be reached --hide=LEVELS comma-separated list of output levels to hide Ex) --hide=running
# fab -l #print list of possible commands and exit # fab --list
# fab -H HOST -- COMMAND # fab -H server1 -- hostname # fab -H server1, server2, server3 -- hostname
Default configuration file is fabfile.py.
# fab -H 192.168.1.1 mkdir # fab -H 192.168.1.1,192.168.1.2 mkdir # fab -u USER -i KEY -H HOST install_git
# fab -H HOST -f myfabfile.py test
# echo xx.xx.xx.xx | fab -- hostname # echo xx.xx.xx.xx | fab -- sudo cat /etc/shadow # echo xx.xx.xx.xx | fab -f myfabfile.py test
#coding:utf-8 from fabric.api import env from fabric.api import run env.hosts = ['127.0.0.1'] env.user = 'user' env.password = 'pass' def test(): run("hostname") run("whoami")
from fabric.api import env #fab production task @task def production(): env.port = 22 env.user = 'user01' env.key_filename = '~/.ssh/id_rsa_production' env.password = 'passphrase-for-key' @task def staging(): env.port = 22 env.user = 'user01' env.password = 'PASSWORD' @task def develop(): env.port = 22 env.user = 'user01' env.key_filename = '~/.ssh/id_rsa_develop' env.password = 'passphrase-for-key'
from fabric.api import env env.hosts = ["192.168.56.101", "192.168.56.102", "192.168.56.103"] env.user = "user01" env.password = "password" env.command_timeout = 3600 env.keepalive = 60 env.skip_bad_hosts = True env.timeout = 3
from fabric.api import env env.hosts = ["user1@192.168.56.102", "user2@192.168.56.103"] env.passwords = {"user1@192.168.56.102:22": "password1", "user2@192.168.56.103:22": "password2", }
#coding:utf-8 from fabric.api import local def test(): local('hostname')
#coding:utf-8 from fabric.api import run def doCmd(): run('ls -lh')
#coding:utf-8 from fabric.api import sudo def chpasswd_root(): sudo("echo 'user01:PASS' | chpasswd")
#coding:utf-8 from fabric.api import sudo def doCmd(): sudo('/etc/init.d/httpd reload')
#coding:utf-8 from fabric.api import sudo def install_git(): sudo("yum -y install git")
#coding:utf-8 from fabric.api import put def doCmd(): put('/tmp/test.gz', '/tmp')
from fabric.api import put def scp(): put('local path', 'remote path') put('bin/project.zip', '/tmp/project.zip') put('*.py', 'cgi-bin/') put('index.html', 'index.html', mode=0755)
from fabric.api import put def update_sshd(): put("conf/sshd_config." + env.host, "/etc/ssh/sshd_config", use_sudo=True, mode=0600) sudo("chown root.root /etc/ssh/sshd_config") sudo("service sshd reload")
#coding:utf-8 from fabric.api import get def doCmd(): get('/tmp/test.gz', '/tmp')
#coding:utf-8 from fabric.api import run, cd def cd_tmp(): with cd('/tmp'): sudo('mkdir test1') #/tmp/test1 run('ls') run('mkdir test2') #/home/$USER/test2 def do_something(): with cd('/tmp'): run('pwd')
#coding:utf-8 from fabric.api import env, run env.user = 'user01' env.password = '****' env.roledefs = { 'web': ['192.168.0.5', '192.168.0.6'], 'dns': ['192.168.0.7', '192.168.0.8' ] 'db': ['test-db1', 'test-db2' ] 'last-dummy': ['aa.aa.aa' ] } env.roledefs['all'] = [h for r in env.roledefs.values() for h in r] def test(): run("hostname") run("whoami") #run("rpm -qa")
fab -R web hostname fab -R all hostname fab -R web,dns hostname
[user1@localhost ~]$ cat host.list #test 192.168.0.1 test-web1 test-web 192.168.0.2 test-web2 test-web 192.168.0.3 test-db1 test-db 192.168.0.4 test-db2 test-db #Example 192.168.1.1 example-web2 example-web 192.168.1.2 example-web2 example-web # [user1@localhost ~]$ cat host.sh #!/bin/sh LIST=host.list case "$1" in -t | --test ) cat "${LIST}" |grep -Ev "^#|^$" |grep "$2" ;; -a | --all ) cat "${LIST}" |grep -Ev "^#|^$" |awk '{print $1'} ;; * ) cat "${LIST}" |grep -Ev "^#|^$" |grep "$1" |awk '{print $1'} ;; esac # [user1@localhost ~]$ ./host.sh test-web |fab test
[user1@localhost fabric]$ cat fabfile.py from fabric.api import local execfile("./fabfile2.py") def test(): local('hostname') [user1@localhost fabric]$ [user1@localhost fabric]$ cat fabfile2.py def test2(): local('hostname') [user1@localhost fabric]$ [user1@localhost fabric]$ fab --list Available commands: test test2 [user1@localhost fabric]$
[user1@localhost fabfile]$ [user1@localhost fabfile]$ cat fabfile.py import test1 [user1@localhost fabfile]$ [user1@localhost fabfile]$ cat test1.py from fabric.api import local from fabric.decorators import task @task def test(): local('hostname') [user1@localhost fabfile]$ [user1@localhost fabfile]$ fab -l Available commands: test1.test [user1@localhost fabfile]$
import sys from fabric.api import * from fabric.contrib import files def sshd_dnsno(): files.comment('/etc/ssh/sshd_config', '^UseDNS yes', use_sudo=True) files.append('/etc/ssh/sshd_config', 'UseDNS no', use_sudo=True) sudo('service ssh restart') def update_hosts(): sudo(r'sed -i -E "s/^(127.0.1.1\s+).*/\1$(hostname)/" /etc/hosts')
from fabric.api import run from fabric.api import env from fabric.api import get def go_fab(): temp = run("mktemp") run("for i in {1..10000}; do echo $RANDOM >>%s ; done" % (temp)) run("hostname >>%s" % (temp)) run("whoami >>%s" % (temp)) get(temp, "/tmp/%s.log" % (env.host_string))
from fabric.api import run, task from fabric.utils import abort import os import sys import tempfile def get_exception(): return sys.exc_info()[1] @task def get_rpm(): rpm_version = run("rpm -qa --queryformat='%{NAME},%{ARCH},%{VERSION}\n'") hostname = run("hostname") outputdir = '/home/test/output' temp = None try: temp = tempfile.mkstemp(dir=outputdir) f = os.fdopen(temp[0], "w") f.writelines(rpm_version) os.fchmod(temp[0], 0664) f.close() except Exception: e = get_exception() if isinstance(temp,list) and os.path.isfile(temp[1]): os.remove(temp[1]) abort(str(e)) finally: os.rename(temp[1], "%s/%s" % (outputdir,hostname))
def useradd_user01(): res = run("id user01", warn_only=True) if res.failed is True: sudo("useradd user01") return
def test01(): with settings(ok_ret_codes=[0, 24]): run("exit 0") run("exit 24") run("hostname")
from fabric.api import local def local_ls(): local('ls /sbin')
from fabric.api import run, sudo, cd def git_yum_remove(): sudo('yum -y remove git') def git_dependency_install(): sudo("yum -y install curl-devel expat-devel gettext-devel \ openssl-devel zlib-devel perl-ExtUtils-MakeMaker") def git_install_from_tar(): run("curl -O http://git-core.googlecode.com/files/git-1.8.1.3.tar.gz") run("tar zxvf git-1.8.1.3.tar.gz") with cd("git-1.8.1.3"): run("make prefix=/usr/local all") sudo("make prefix=/usr/local install") run("rm -rf git-1.8.1.3") def git_update(): git_yum_remove() git_dependency_install() git_install_from_tar()
from fabric.api import * @parallel(pool_size=2) def edit_hosts(): sudo('echo "# Do not remove the following line, or various programs" > /etc/hosts') sudo('echo "# that require network functionality will fail." >> /etc/hosts') sudo('echo "127.0.0.1 localhost.localdomain localhost" >> /etc/hosts') sudo('echo "::1 localhost6.localdomain6 localhost6" >> /etc/hosts') sudo('echo "" >> /etc/hosts') sudo('echo "{host} `hostname`" >> /etc/hosts'.format(**env)) sudo('echo "" >> /etc/hosts') sudo('echo "# DB" >> /etc/hosts') sudo('echo "192.0.2.0 anokonopc" >> /etc/hosts') sudo('/usr/local/apache/bin/apachectl -k graceful')