Fabric
Title is development, but at the same time to do development testing and operation of the work ... For Mao Task*3 Not salary * 3 (O (╯-╰) o)
Recently took over more and more things, release and operation of the work is quite mechanical, coupled with the frequency is quite high, resulting in time wasted or a lot of advantages.
Fix bugs, test, submit repository (2 minutes), SSH to test environment pull deployment (2 minutes), rsync to online machine a,b,c,d,e (1 min), ssh to ABCDE five machines, one by one reboot (8-10 minutes) = 13-15 minutes
One of the depressed is that each operation is the same, the same command, deadly in a number of machines, it is difficult to do a script in this machine, the main time is wasted in ssh, Knock command, written script, can be executed in one click, spend two minutes to see the results of execution
Until we found the fabric.
Role
Very powerful tool.
You can solidify commands for automated deployment or multi-machine operations into a single script
Like some OPS tools, it's mostly because, Python .....
Easy to use and easy to get started
Of course, the shell commands can be combined, the difference between the ancient artifact and the modern weapon.
Environment configuration
Install the corresponding package on the machine and the target machine (note, all must have)
sudo easy_install fabric
Currently 1.6 version (or with Pip install, same)
After installation, you can see if the installation was successful
[[email protected]~$] which fab/usr/local/bin/fab
After loading, you can browse the official documents
Then, you can do it.
Hello World
First, the simple operation of the machine, there is a preliminary understanding, examples of sources and official website
Create a new PY script: fabfile.py
def hello(): print("Hello world!")
Command line execution:
[[email protected]~/tmp/fab$] fab helloHello world!Done.
Note that you can use Fabfile as the file name, but you need to specify the file when executing
[[email protected]~/tmp/fab$] mv fabfile.py test.pyfabfile.py -> test.py[[email protected]~/tmp/fab$] fab helloFatal error: Couldn‘t find any fabfiles!Remember that -f can be used to specify fabfile path, and use -h for help.Aborting.[[email protected]~/tmp/fab$] fab -f test.py helloHello world!Done.
With parameters:
To modify the fabfile.py script:
def hello(name, value): print("%s = %s!" % (name, value))
Perform
[[email protected]~/tmp/fab$] fab hello:name=age,value=20age = 20!Done.[[email protected]~/tmp/fab$] fab hello:age,20age = 20!Done.
Perform a native operation
Simple local operation:
from fabric.api import localdef lsfab(): local(‘cd ~/tmp/fab‘) local(‘ls‘)
Results:
[[email protected]~/tmp/fab$] pwd;ls/Users/ken/tmp/fabfabfile.py fabfile.pyc test.py test.pyc[[email protected]~/tmp/fab$] fab -f test.py lsfab[localhost] local: cd ~/tmp/fab[localhost] local: lsfabfile.py fabfile.pyc test.py test.pycDone.
Practical Start:
Suppose you are submitting a copy of the configuration file settings.py to the repository every day (there is no conflict case)
If this is done manually:
cd /home/project/test/conf/git add settings.pygit commit -m ‘daily update settings.py‘git pull origingit push origin
In other words, these commands you have to manually knock every day, the so-called daily job, is to repeat every day, mechanized work, let us see how to achieve a key with fabric: (in fact, with shell script can be directly done, but the advantage of FAB is not here, Here the main bit behind the local + remote operation to prepare, after all, two places to write a script for easy maintenance)
from fabric.api import localdef setting_ci(): local("cd /home/project/test/conf/") local("git add settings.py") #后面你懂的,懒得敲了…..
Mashup Integration Remote operation
At this point, suppose you want to update the configuration file to the/home/ken/project corresponding project directory of machine A.
#!/usr/bin/env python# encoding: utf-8from fabric.api import local,cd,runenv.hosts=[‘[email protected]:port‘,] #ssh要用到的参数env.password = ‘pwd‘def setting_ci(): local(‘echo "add and commit settings in local"‘) #刚才的操作换到这里,你懂的def update_setting_remote(): print "remote update" with cd(‘~/temp‘): #cd用于进入某个目录 run(‘ls -l | wc -l‘) #远程操作用rundef update(): setting_ci() update_setting_remote()
Then, do it:
[[email protected]~/tmp/fab$] fab -f deploy.py update[[email protected]:port] Executing task ‘update‘[localhost] local: echo "add and commit settings in local"add and commit settings in localremote update[[email protected]:port] run: ls -l | wc -l[[email protected]:port] out: 12[[email protected]:port] out:Done.
Note that if you do not declare env.password, the interaction that is required to enter the password is taken out of the corresponding machine.
Multi-server Mashup
To operate multiple servers, you need to configure more than one host
#!/usr/bin/env python# encoding: utf-8from fabric.api import *#操作一致的服务器可以放在一组,同一组的执行同一套操作env.roledefs = { ‘testserver‘: [‘[email protected]:port1‘,], ‘realserver‘: [‘[email protected]:port2‘, ] }#env.password = ‘这里不要用这种配置了,不可能要求密码都一致的,明文编写也不合适。打通所有ssh就行了‘@roles(‘testserver‘)def task1(): run(‘ls -l | wc -l‘)@roles(‘realserver‘)def task2(): run(‘ls ~/temp/ | wc -l‘)def dotask(): execute(task1) execute(task2)
Results:
[[email protected]~/tmp/fab$] fab -f mult.py dotask[[email protected]:port1] Executing task ‘task1‘[[email protected]:port1] run: ls -l | wc -l[[email protected]:port1] out: 9[[email protected]:port1] out:[[email protected]:port2] Executing task ‘task2‘[[email protected]:port2] run: ls ~/temp/ | wc -l[[email protected]:port2] out: 11[[email protected]:port2] out:Done.
Extended
1. Color
Can print color, more visible and convenient when viewing operation result information
from fabric.colors import *def show(): print green(‘success‘) print red(‘fail‘) print yellow(‘yellow‘)#fab -f color.py show
2. Errors and exceptions
About error Handling
By default, a set of commands, after which the last command fails, does not proceed down
A different process can be done after a failure, the document
At the moment, the follow-up use to see
3. Password Management
Read the document
Better password management, elder brother compared to soil, not get through, the main is the server list changes frequently, my processing method is:
1.host,user,port,password configuration list, all written in one file
or directly into the script, of course, this is more ...
Env.hosts = [
' Host1 ',
' Host2 '
]
Env.passwords = {
' Host1 ': "Pwdofhost1",
' Host2 ': "Pwdofhost2",
}
Or
Env.roledefs = {
' TestServer ': [' host1 ', ' host2 '],
' Realserver ': [' host3 ',]
}
Env.passwords = {
' Host1 ': "Pwdofhost1",
' Host2 ': "Pwdofhost2",
' Host3 ': "Pwdofhost3",
}
2. Parse into map nesting according to key and put in deploy
In addition, the command can actually solidify into a cmds list ...
At the beginning of the use of these, follow-up more demand for the time to remove documents, saying that the document is really a lot of good things, is too much, looked dizzy ...
The end!
To be continue ....
Wklken
Email: [Email protected]
Blog:http://www.wklken.com
2013-03-25
Python fabric for remote operation and deployment