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)
Copy the Code code as follows:
sudo easy_install fabric
Currently 1.6 version (or with Pip install, same)
After installation, you can see if the installation was successful
Copy the Code code as follows:
[ken@~$] which fab
/usr/local/bin/fab
After loading, you can browse the official document http://docs.fabfile.org/en/1.6/
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
Copy the Code code as follows:
def hello ():
Print ("Hello world!")
Command line execution:
Copy CodeThe code is as follows:
[ken@~/tmp/fab$] Fab hello
Hello world!
Done.
Note that you can use Fabfile as the file name, but you need to specify the file when executing
Copy the Code code as follows:
[ken@~/tmp/fab$] MV fabfile.py test.py
fabfile.py-test.py
[ken@~/tmp/fab$] Fab hello
Fatal error:couldn ' t find any fabfiles!
Remember That-f can is used to specify Fabfile path, and use-h for help.
Aborting.
[ken@~/tmp/fab$] fab-f test.py Hello
Hello world!
Done.
With parameters:
To modify the fabfile.py script:
Copy the Code code as follows:
def hello (name, value):
Print ("%s =%s!"% (name, value))
Perform
Copy the Code code as follows:
[ken@~/tmp/fab$] Fab hello:name=age,value=20
Age = 20!
Done.
[ken@~/tmp/fab$] Fab hello:age,20
Age = 20!
Done.
Perform a native operation
Simple local operation:
Copy the Code code as follows:
From FABRIC.API Import Local
Def lsfab ():
Local (' CD ~/tmp/fab ')
Local (' ls ')
Results:
Copy CodeThe code is as follows:
[ken@~/tmp/fab$] Pwd;ls
/users/ken/tmp/fab
fabfile.py FABFILE.PYC test.py Test.pyc
[ken@~/tmp/fab$] fab-f test.py lsfab
[localhost] local:cd ~/tmp/fab
[localhost] Local:ls
fabfile.py FABFILE.PYC test.py Test.pyc
Done.
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:
Copy the Code code as follows:
cd/home/project/test/conf/
git add settings.py
Git commit-m ' daily update settings.py '
Git pull origin
Git 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)
Copy CodeThe code is as follows:
From FABRIC.API Import Local
Def setting_ci ():
Local ("cd/home/project/test/conf/")
Local ("Git add settings.py")
#后面你懂的, too lazy to knock .....
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.
Copy the Code code as follows:
#!/usr/bin/env python
# Encoding:utf-8
From FABRIC.API import Local,cd,run
env.hosts=[' User@ip:port ',] #ssh要用到的参数
Env.password = ' pwd '
Def setting_ci ():
Local (' echo ' Add and commit settings in local "')
#刚才的操作换到这里, you know.
Def update_setting_remote ():
print "Remote Update"
With CD (' ~/temp '): #cd用于进入某个目录
Run (' ls-l | wc-l ') #远程操作用run
def update ():
Setting_ci ()
Update_setting_remote ()
Then, do it:
Copy the Code code as follows:
[ken@~/tmp/fab$] fab-f deploy.py Update
[User@ip:port] Executing task ' update '
[localhost] local:echo "Add and commit settings in local"
Add and commit settings in local
Remote Update
[User@ip:port] run:ls-l | Wc-l
[User@ip:port] Out:12
[User@ip: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
Copy the Code code as follows:
#!/usr/bin/env python
# Encoding:utf-8
From FABRIC.API Import *
#操作一致的服务器可以放在一组, perform the same set of actions as the same group
Env.roledefs = {
' TestServer ': [' user1@host1:port1 ',],
' Realserver ': [' user2@host2:port2 ',]
}
#env. Password = ' Do not use this configuration here, it is not possible to require the password to be consistent, the written text is not appropriate. Get through all 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:
Copy the Code code as follows:
[ken@~/tmp/fab$] fab-f mult.py dotask
[User1@host1:port1] Executing task ' Task1 '
[User1@host1:port1] run:ls-l | Wc-l
[User1@host1:port1] Out:9
[User1@host1:port1] Out:
[User2@host2:port2] Executing task ' task2 '
[User2@host2:port2] Run:ls ~/temp/| Wc-l
[User2@host2:port2] Out:11
[User2@host2: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 ...
Copy the Code code as follows:
Env.hosts = [
' Host1 ',
' Host2 '
]
Env.passwords = {
' Host1 ': "Pwdofhost1",
' Host2 ': "Pwdofhost2",
}
Or
Copy the Code code as follows:
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 ...