Python ile Verilen Hostlara Ssh ile Bağlanıp Backup Alan Script

By | 22 August 2016

Python ile yaptığım Ssh ile hostlara bağlanan, burada /var/www dizinini ve mysql’deki veritabanlarını yedekleyen ve o serverda /root/ altında yeni bir dizin açarak oraya o günkü tarih adında yedek dosyası oluşturan bir scripti anlatacağım. Ayrıca alınan yedek dosyalarında 4 hafta önceki dosyayı silen böylece diskte doluluk problemini de çözmüş olacağım. 2 tane dosyam var config.py ve get.py Config dosyası içinde hostları, passwordları ve mysql-passwordları set edicem. get.py dosyası içinden onlara ulaşıcam ve tek tek hostlara bağlanıcam. Öncelikle config.py dosyamızı yazalım.

# -*- coding: utf-8 -*-
hosts = ['google.com', 'youtube.com', 'mertblog.net']
hostPasswords = ['g00gle', 'y0utube', 'myPassword']
mysqlPasswords = ['g00gle', 'y0utube', 'myPassword']

Burada tanımlamaları yaptıktan sonra asıl dosyamıza geçiyoruz. Kodların açıklamalarını, yorum satırlarıyla birlikte yaptım.

# -*- coding: utf-8 -*-
#lazım olan modülleri ekliyorum.
from pexpect import pxssh
from datetime import datetime,date,timedelta
import config


#config dosyasından değerleri set ediyorum.
hosts = config.hosts
hostPasswords = config.hostPasswords
mysqlPasswords = config.mysqlPasswords


#bugünün tarihin yıl-ay-gün şeklinde return eden fonksiyon
def getToday():
  now = datetime.now()
  return now.strftime('%Y-%m-%d')

#4 hafta önceki tarihi return eden fonksiyon
def getLastDate():
  lastMonth = date.today() - timedelta(28)
  return lastMonth.strftime('%Y-%m-%d')


#tarihler set ediliyor.
today = getToday()
lastDate = getLastDate()


#host arrayi içinde dönülüyor.
for key,host in enumerate(hosts):
  #yeni bir ssh bağlantı objesi oluşturuluyor.
  s = pxssh.pxssh()
  #eğer ssh bağlantısı kurulamazsa hatayı ekrana yazdırıyor.
  if not s.login(host, 'root', hostPasswords[key]):
    print 'Ssh session failed on login'
    print str(s)
  else:
    print 'Ssh session login successful for {0}'.format(host)
    #burada eğer web_backups dizini yoksa oluşturuyor.
    #sendline ile komutu gönderiyor, prompt ile komutu çalıştırıyor.
    s.sendline('[ ! -d /root/web_backups ] && mkdir /root/web_backups')
    s.prompt()
    #/var/www dizinini bugünün tarihi ile birlikte yedek alıyor.
    s.sendline('tar -czf web_backups/webBackup_{0}.tar.gz /var/www/*'.format(today))
    print 'Backup file webBackup_{0}.tar.gz creating.'.format(today)
    s.prompt

    #eğer 4 hafta önceki yedek duruyorsa o dosyayı uçuruyor.
    s.sendline('[ ! f /root/web_backups/webBackup_{0}.tar.gz ] echo "Have not last date backup file." || rm -rf /root/web_backups/webBackup_{0}.tar.gz'.format(lastDate))
    s.prompt()

    #mysqldeki tüm veritabanları yedek alıyor bugünün tarihi ile birlikte ve verdiğimiz dizini dosyayı set ediyor.
    s.sendline('mysqldump -uroot -p{0} --all-databases > /root/web_backups/all_databases_{1}.sql'.format(mysqlPasswords[key], today))
    print 'Mysql backup file all_databases_{0}.sql creating.'.format(today)
    s.prompt()

    #eğer 4 hafta önceki dosya duruyorsa onu uçuruyor.
    s.sendline('[ ! -f /root/web_backups/all_databases_{0}.sql ] echo "Have not last date mysql backup file." || rm -rf /root/web_backup/all_databases_{0}.sql'.format(lastDate))
    s.prompt()

    #oluşturulan ssh bağlantı objesini sonlandırıyor.
    s.logout()
    s.close()
    print 'Closed Ssh connection.'

Açıklamaları yorum satırlarında bulabilirsiniz. Kendi senaryonuza göre scripti geliştirebilirsiniz.
Çalıştırdığınızda aşağıdaki gibi bir çıktı alıyorsunuz. Anlatacaklarım şimdilik bu kadar, bir dahaki yazımda
görüşmez üzere… 🙂

output1 xzjgrdeanjqlmrqi

 

 

Leave a Reply

Your email address will not be published. Required fields are marked *

*