Python remote Batch execution
I am not a professional development, I have been learning Linux operations, for Python is also very short-time, so the code is not very simple to write.
Some time ago a classmate to me to do an automated operation and maintenance platform, I do not understand the Python Django, and for the HTML and JS this kind of development learning has not been involved, so I said I do some backstage implementation, the front end will be given to my classmates to do . No nonsense, next I do the idea of batch execution.
- Module used: Paramiko
- Function: Very simple is the batch execution command, similar to ansible, originally want to use fabric, but think of or use Paramiko, because I in learning ansible,ansible inside there is Paramiko. Later, the host group inside the configuration file will be put into the database. Here I would like to use MongoDB because my host profile is written in the form of a dictionary, which is more convenient to save in the document database.
- Configuration file format: here in order to facilitate access to information, directly written in the form of a dictionary, originally wanted to use the Pickle module to serialize input into the file, but later found that if the host if more, manual input or too troublesome.
- Class: In order to better add functionality later, I directly write Paramiko sshclient as a class. Later to add the upload text, download and other functions, which used the function of SFTP.
- Function: This function is to conditionally output the file and find the name of the host group that matches.
- Explain the next Paramiko:paramiko module in my understanding is to rely on SSH remote module.
(1), Paramiko installation method: use PIP installation.
(2), Paramiko core Components-----sshclient
Sshclient uses SSH's channel implementation and host connection and command execution.
sshclient methods |
< strong> parameters and parameter descriptions |
Connect (for SSH connection and checksum) |
Hostname: Destination host address Port: Host port Username: User name of the checksum Password: login password Pkey: Private key authentication Key_filename: File name for private key authentication Timeout: Connection time-out setting Allow_agent: This is a Boolean, set to False when the use of SSH proxy Look_for_keys: is also a Boolean, prohibit under. SSH to find the private key file Compress: Set compression |
exec_command (Remote execution command) |
Stdin,stdout,stderr: These three are standard inputs, outputs, errors, which are used to get command execution results, and are not calculated as parameters of the method Command: The string that executes the command, with double quotation marks. BufSize: File buffer size, default is 1 |
load_system_host_keys (load local public key file) |
FileName: Specifies the public key record file for the remote host |
set_missing_host_key_policy (the remote host does not have a key) |
Autoaddpolicy: Automatically add host name and host key to local Hostkeys object Rejectpolicy: auto-deny unknown hostname and key (default) Warningpolicy: Accept Unknown host, But there will be a warning |
(3) Paramiko Core Components Sftpclient class
Implementation of remote file operations, such as upload, download, permissions, status, and so on.
Methods of the Sftpclient class |
Parameter and parameter description |
From_transport (using an SFTP client channel that has already been connected) |
T: Using a transferred object that has already been validated |
Put (upload local file to SFTP server) |
LocalPath: path to local file RemotePath: Remote Path Callback: Gets the number of bytes received and the total number of bytes transferred Confirm: whether the stat () method is called after the file has been uploaded to determine the file size |
Get (download files from the SFTP server to local) |
RemotePath: File path to be downloaded LocalPath: Saving the local file path Callback: the same as put. |
mkdir: Resume Catalogue Remove: Delete Rename: Renaming Stat: Get remote File information Listdir: Gets the specified directory list |
|
(4), there is a use of Invoke_shell often used
Invoke_shell (*args, **kwds) Request an interactive shell session on the This channel. If the server allows it, the channel would then is directly connected to the stdin, stdout, and stderr of the shell. Normally would call Get_pty before this, in which case the shell would opera Te through the Pty, and the channel would be a connected to the stdin and stdout of the Pty. When the shell exits, the channel would be closed and can ' t is reused. You must open a new channel if you wish to open another shell.
Requests an interactive shell session on this channel, and if the service allows it, the channel will connect directly to standard input, standard input, and the wrong shell, and usually we call Get_pty's usage before using it, so that the shell session is handled through a pseudo-terminal, And the session is connected to standard input and output, and when our shell exits, the channel shuts down and can be used again, and you have to reopen the other shell.
(4) Practice Fortress Machine (excerpt from Liu Tians's "Python Automation Operations")
#Defining Server Informationhostname ="192.168.0.158"username="Root"Password="aixocm"#defining the logon log and password promptPort = 22Passinfo='\ ' s password:'Paramiko.util.log_to_file ('Syslogin.log')#Login to the fortress machine, automatically add Hostkeys information to the hostSSH =Paramiko. Sshclient () Ssh.set_missing_host_key_policy (Paramiko. Autoaddpolicy ()) Ssh.connect (hostname=blip,username=bluser,password=blpasswd)#Create a sessionChannel =Ssh.invoke_shell () channel.settimeout (100)#channel execution shell SSH connectionBuff ="'resp="'Channel.send ('SSH'+username+'@'+hostname+'\ n') while notBuff.endswith (passinfo):Try: Resp= CHANNEL.RECV (9999) exceptexception,e:Print 'Error info:%s connection time.'%(str (e)) Channel.close () Ssh.close () sys.exit () Buff+=respif notBuff.find ('yes/no') = =-1: Channel.send ('yes\n') Buff="'channel.send (Password+'\ n') Buff="' while notBuff.endswith ('# '): Resp= CHANNEL.RECV (9999) if notResp.find (passinfo) = =-1: Print 'Error info:authentication failed.'channel.close () ssh.close ( )
View Code
- configuration file: code:
{"hostname":"web","host_ip": [ "192.168.0.157","192.168.0.158"," 192.168.0.159"]}
Class:#!/usr/bin/env pyth#coding:utf-8import Paramiko
classaction (object):def __init__(self, IP, username, command):Self. IP =IPSelf.username =usernameSelf.command =CommanddefSsh_connect (self):SSH=Paramiko. Sshclient ()Ssh.set_missing_host_key_policy (Paramiko. Autoaddpolicy ())Try: Ssh.connect (hostname=self. IP, Username=self.username)Stdin,stdout,stderr=ssh.exec_command (Self.command) Print "######################>%s <####################"%(self.) IP)PrintStderr.read ()PrintStdout.read () ssh.close ()
exceptexception,e:Print "######################>%s <####################"%(self.) IP)Print
To execute the main function:
From simple1 Import action
defget_values (hostname): Conf_file=open ('scn.conf','R') Lines=Conf_file.readlines () forLineinchLines:line= Line.strip ("\ n") Line=eval (line)ifhostname = = line["hostname"]: return(line) Breakconf_file.close ()if __name__=="__main__": hostname= Raw_input ("Write your hostname:") Username= Raw_input ("Write your username:") Command= Raw_input ("Write your excute command:") Host=get_values (hostname)HOST_IP = List (host["host_ip"]) forIinchRange (0,len (HOST_IP)): Conn=Action (Host_ip[i],username,command) Conn.ssh_connect ()
Note that I did not add password and port,port SSH Port 22nd, which is used by default, password I use Ssh-keygen and Ssh-copy-id to login without a password directly.
Python implementation Batch remote execution command (fortress machine)