1. 程式人生 > >使用python fabric搭建RHEL 7.2大資料基礎環境以及部分優化

使用python fabric搭建RHEL 7.2大資料基礎環境以及部分優化

大資料系統基本架構:
這裡寫圖片描述

1.使用python fabric進行Linux基礎配置

使用python,可以讓任何事情高效起來,包括運維工作,fabric正式這樣一套基於python2的類庫,它執行本地或遠端shell命令提供了操作的基本套件(正常或通過sudo)和上傳/下載檔案,如提示使用者輸入執行輔助功能,或中止執行。

用Python3開發的部署工具叫fabric3:fabric3,和fabric一樣最大特點是不用登入遠端伺服器,在本地執行遠端命令,幾行Python指令碼就可以輕鬆部署。

典型用途包括建立一個包含一個或多個函式的Python模組,然後通過fab命令列工具執行它們。下面是一個小而全的“fab file”包含一個單獨的任務:

from fabric.api import run

def host_type():
    run('uname -s')

執行方法:

 fab -f deploy.py go 

Fabric提供幾個簡單的API來完成所有的部署,最常用的是local()和run(),分別在本地和遠端執行命令,put()可以把本地檔案上傳到遠端,當需要在遠端指定當前目錄時,只需用with cd(‘/path/to/dir/’):即可。
預設情況下,當命令執行失敗時,Fabric會停止執行後續命令。

有時,我們允許忽略失敗的命令繼續執行,比如run(‘rm /tmp/abc’)在檔案不存在的時候有可能失敗,這時可以用with settings(warn_only=True):執行命令,這樣Fabric只會打出警告資訊而不會中斷執行。

Fabric是如何在遠端執行命令的呢?其實Fabric所有操作都是基於SSH執行的,必要時它會提示輸入口令,所以非常安全。更好的辦法是在指定的部署伺服器上用證書配置無密碼的ssh連線。

1.1 基建工作基本流程

對於私有云的使用者來說,伺服器的基建工作比較重要,需要做一些規範化的統一操作,方便後序搭建叢集時候伺服器上的作業系統有統一的配置,比如CDH,TDH等的叢集管理工具,都有這樣的要求。

當然,如果是公有云,不用考慮這麼多。私有云追趕潮流的話,直接上docker或者openstack就好。下面就是比較low的基建流程,基建工作主要流程為:

  1. 修改hostname
  2. 關閉sshd
  3. 關閉Selinux以及防火牆
  4. 重啟
  5. 格式化磁碟
  6. 掛載磁碟
  7. Check上述流程結果。
    這裡寫圖片描述

1.2 使用anaconda2包(有網環境下準備)

在有網環境下,pip instatll fabric後將anaconda打包
解壓安裝到/opt下

tar -xzf anaconda2.tar.gz 
pwd

mkdir python
cd python/
mv ../anaconda2* .

mkdir deployment
cd deployment/

vim deploy.py (copy 下一節的內容)
//在當前命令列上下文,加入anaconda環境變數
ls /opt/python/anaconda2/bin/
PATH=/opt/python/anaconda2/bin;$PATH

1.3 python 程式碼,deploy.py

#-*- coding: utf-8 -*-

import sys
from fabric.api import *

env.user = 'root'
hostList = []
hostnameprefix='hostname-'
for i in range(1,n):   #ip range
    hostList.append(hostnameprefix + str(i))

env.hosts = hostList
env.password = 'Pass1234'
diskList='bcdefghijklm'

fstabappend='''
/dev/sdb1       /mnt/data01     xfs     defaults        0       0
#.......
/dev/sdc1       /mnt/data02     xfs     defaults        0       0

'''

with open('/root/.ssh/authorized_keys', 'r') as f:
    sshkey = f.read()


def gethostname():
    run('hostname')

# only for RHEL7.2
def changehostname():
    cmd = '''num=`ifconfig| grep your_ip | awk '{print $2}' | cut -d '.' -f 4` && echo hostname-$num > /etc/hostname '''
    run(cmd)

def checksshd():
    cmd = 'grep UseDNS /etc/ssh/sshd_config'
    run(cmd)

# only for RHEL7.2
def disableSSHDNS():
    cmd = '''echo UseDNS no >> /etc/ssh/sshd_config'''
    run(cmd)

def getSelinux():
    cmd = '''grep 'SELINUX=' /etc/selinux/config && getenforce'''
    run(cmd)

def disableSelinux():
    cmd = '''sed -i 's/SELINUX=.*[=A-Za-z]$/SELINUX=disabled/g' /etc/selinux/config'''
    run(cmd)

def getFirewalld():
    cmd = 'systemctl status firewalld'
    run(cmd, warn_only=True)

def disableFirewalld():
    cmd = 'systemctl disable firewalld && systemctl stop firewalld'
    run(cmd)

def checkdiskparted():
    for d in diskList:
        run('''parted /dev/sd%s print ''' % (d))

def parteddisk():
    for d in diskList:
        run('''parted /dev/sd%s mklabel gpt ''' % (d))
        run('''parted /dev/sd%s mkpart primary %s %s''' % (d, '0%', '100%'))

def mkfsdisk():
    for d in diskList:
        run('''mkfs.xfs /dev/sd%s1 ''' % (d))

def mountdisk():
    run('cp /etc/fstab /root/fstab.bak')
    run('''mkdir /mnt/data0{1,2,3,4,5,6,7,8,9} /mnt/data1{0,1,2}''')
    run('echo >> /etc/fstab')
    run('''tee -a /etc/fstab <<EOF%sEOF''' % (fstabappend))
    run('mount -a')

def checkmount():
    run('''df -h | grep '/mnt/data'| wc -l ''')

def checknetspeed():
   run(''' ethtool bond0| grep Speed ''')

@runs_once
def confirm_opetions(message):
    return prompt(message, default='N')

## !!!!!!!!!!!!!! don't to run this function
@task
def rebootall(lhost='default'):
#    if lhost in env.hosts:
#        env.hosts.remove(lhost)
#    else :
#        print('*******************')
#        print('give me the lhost , tell me: who are you?')
#        print('*******************')
#        sys.exit(-1)
#     reboot(use_sudo=False)
    run('shutdown -r +3')

@task
def nopasswd():
    run('mkdir -p /root/.ssh && chmod 700 /root/.ssh && echo "%s" >> /root/.ssh/authorized_keys && chmod 644 /root/.ssh/authorized_keys' % (sshkey))

@task
def go():
    changehostname()
#    disableSSHDNS()
#    disableSelinux()
#    disableFirewalld()
#    mkfsdisk()
#    mountdisk()

@task
def check():
    gethostname()
    checksshd()
    getSelinux()
    getFirewalld()
    checkdiskparted()
    checkmount()
    checknetspeed()

1.4 LINUX 基建使用的命令參考

  • 命令進行ip與主機名字串的拼接:
num=`ifconfig| grep yourip | awk '{print $2}' | cut -d '.' -f 4` && echo gaibdv1_$num
  • 找到Selinux狀態
grep 'SELINUX=' /etc/selinux/config && getenforce
  • 關閉Selinux
sed -i 's/SELINUX=.*[=A-Za-z]$/SELINUX=disabled/g' /etc/selinux/config
  • 格式化磁碟
for d in diskList:
        run('''parted /dev/sd%s mklabel gpt ''' % (d))
        run('''parted /dev/sd%s mkpart primary %s %s''' % (d, '0%', '100%'))
  • 獲取網速
ethtool bond0| grep Speed

2. RHEL 7.2 部分優化

2.1 RHEL 7.x系統的閃光點與新特性

這裡寫圖片描述

這裡寫圖片描述

  • XFS檔案系統

    這裡寫圖片描述

  • Linux Container(Docker)

    這裡寫圖片描述

    這裡寫圖片描述

    這裡寫圖片描述

  • RHEV 3.0 紅帽企業級虛擬化

    這裡寫圖片描述

RHEV-M能管理虛擬機器與其磁碟映象,安裝ISO,進行高可用性設定,建立虛擬機器模板等,這些都能從圖形web介面完成。也可使用RHEV-M管理兩種型別的hypervisor。RHEV自身帶有一個獨立的裸機hypervisor,基於RHEL與KVM虛擬化,作為託管的物理節點使用。另外,如果你想從RHEV管理執行在RHEL上的虛擬機器,可註冊RHEL伺服器到RHEV-M控制檯。

2.2 部分新舊命令對比

任務 舊命令 新命令
使某服務自動啟動 chkconfig –level 3 httpd on systemctl enable httpd.service
使某服務不自動啟動 chkconfig –level 3 httpd off systemctl disable httpd.service
檢查服務狀態 service httpd status systemctl status httpd.service (服務詳細資訊)
systemctl is-active httpd.service (僅顯示是否 Active)
顯示所有已啟動的服務 chkconfig –list systemctl list-units –type=service
啟動某服務 service httpd start systemctl start httpd.service
停止某服務 service httpd stop systemctl stop httpd.service
重啟某服務 service httpd restart systemctl restart httpd.service
一、CentOS的Services使用了systemd來代替sysvinit管理
二、修改系統執行級別
三、其他配置工具

主要是多了systemd這個軟體,採用了以下新技術:

採用Socket啟用式與匯流排啟用式服務,以提高相互依賴的各服務的並行執行效能;
用cgroups代替PID來追蹤程序,以此即使是兩次fork之後生成的守護程序也不會脫離systemd的控制。

Systemd是一個系統管理守護程序、工具和庫的集合,用於取代System V初始程序。Systemd的功能是用於集中管理和配置類UNIX系統。主要負責控制systemd系統和服務管理器。從設計構思上說,由於systemd使用了cgroup與fanotify等元件以實現其特性,所以只適用於Linux。

在Linux生態系統中,Systemd被部署到了大多數的標準Linux發行版中,只有為數不多的幾個發行版尚未部署。Systemd通常是所有其它守護程序的父程序,但並非總是如此。

這裡寫圖片描述

其他請看參考7。

2.4 優化配置 (未完待續。。。)

可能優化的地方

  • 更新系統
 yum  update -y
  • 給/etc/rc.local新增執行許可權
chmod +x /etc/rc.d/rc.local
  • 加大開啟檔案數的限制(open files)
ulimit -n
ulimit -a
vi /etc/security/limits.conf
最後新增
* soft nofile 1024000
* hard nofile 1024000
hive   - nofile 1024000
hive   - nproc  1024000

使用者程序限制
# sed -i 's#4096#65535#g'   /etc/security/limits.d/20-nproc.conf  #加大普通使用者限制  也可以改為unlimited
#  egrep -v "^$|^#" /etc/security/limits.d/20-nproc.conf        
*          soft    nproc     65535
root       soft    nproc     unlimited

reboot
  • 優化核心
cat /etc/sysctl.conf
#CTCDN系統優化引數
#關閉ipv6
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
#決定檢查過期多久鄰居條目
net.ipv4.neigh.default.gc_stale_time=120
#使用arp_announce / arp_ignore解決ARP對映問題
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.all.arp_announce=2
net.ipv4.conf.lo.arp_announce=2
# 避免放大攻擊
net.ipv4.icmp_echo_ignore_broadcasts = 1
# 開啟惡意icmp錯誤訊息保護
net.ipv4.icmp_ignore_bogus_error_responses = 1
#關閉路由轉發
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
#開啟反向路徑過濾
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
#處理無源路由的包
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
#關閉sysrq功能
kernel.sysrq = 0
#core檔名中新增pid作為副檔名
kernel.core_uses_pid = 1
# 開啟SYN洪水攻擊保護
net.ipv4.tcp_syncookies = 1
#修改訊息佇列長度
kernel.msgmnb = 65536
kernel.msgmax = 65536
#設定最大記憶體共享段大小bytes
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
#timewait的數量,預設180000
net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.tcp_sack = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_rmem = 4096        87380   4194304
net.ipv4.tcp_wmem = 4096        16384   4194304
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
#每個網路介面接收資料包的速率比核心處理這些包的速率快時,允許送到佇列的資料包的最大數目
net.core.netdev_max_backlog = 262144
#限制僅僅是為了防止簡單的DoS 攻擊
net.ipv4.tcp_max_orphans = 3276800
#未收到客戶端確認資訊的連線請求的最大值
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_timestamps = 0
#核心放棄建立連線之前傳送SYNACK 包的數量
net.ipv4.tcp_synack_retries = 1
#核心放棄建立連線之前傳送SYN 包的數量
net.ipv4.tcp_syn_retries = 1
#啟用timewait 快速回收
net.ipv4.tcp_tw_recycle = 1
#開啟重用。允許將TIME-WAIT sockets 重新用於新的TCP 連線
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_fin_timeout = 1
#當keepalive 起用的時候,TCP 傳送keepalive 訊息的頻度。預設是2 小時
net.ipv4.tcp_keepalive_time = 1800
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl = 15
#允許系統開啟的埠範圍
net.ipv4.ip_local_port_range = 1024    65000
#修改防火牆表大小,預設65536
net.netfilter.nf_conntrack_max=655350
net.netfilter.nf_conntrack_tcp_timeout_established=1200
# 確保無人能修改路由表
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0


本文出自 “蘭芷” 部落格,請務必保留此出處http://7826443.blog.51cto.com/7816443/1775248
sysctl -p  #生效
  • vim基本設定
 vim  /root/.vimrc
set history=1000
autocmd InsertLeave * se cul
autocmd InsertLeave * se nocul
set nu
set bs=2
syntax on
set laststatus=2
set tabstop=4
set go=
set ruler
set showcmd
set cmdheight=1
hi CursorLine   cterm=NONE ctermbg=blue ctermfg=white guibg=blue guifg=white
set hls
set cursorline
set ignorecase
set hlsearch
set incsearch
set helplang=cn


inoremap ( ()<ESC>i       
inoremap [ []<ESC>i
inoremap { {}<ESC>i
inoremap < <><ESC>i
inoremap " ""<ESC>i
inoremap ' ''<ESC>i

日誌系統簡介

在rhel7系統中有兩個日誌服務,分別是:

  • rsyslog
  • systemd-journal

systemd-journald是一個改進型日誌管理服務,可以收集來自核心、系統早期啟動階段的日誌、系統守護程序在啟動和執行中的標準輸出和錯誤資訊,還有syslog的日誌。該日誌服務僅僅把日誌集中儲存在單一結構的日誌檔案/run/log中,由於日誌是經歷過壓縮和格式化的二進位制資料,所以在檢視和定位的時候很迅速。預設情況下並不會持久化儲存日誌,只會保留一個月的日誌。另外,一些rsyslog無法收集的日誌也會被journal記錄到。

rsyslog作為傳統的系統日誌服務,把所有收集到的日誌都記錄到/var/log/目錄下的各個日誌檔案中。常見的日誌檔案如下:

/var/log/messages 絕大多數的系統日誌都記錄到該檔案

/var/log/secure 所有跟安全和認證授權等日誌都會記錄到此檔案

/var/log/maillog 郵件服務的日誌

/var/log/cron crond計劃任務的日誌

/var/log/boot.log 系統啟動的相關日誌

linux命令大全

參考文獻

3.python3中使用fabric3

4.關閉UseDNS加速SSH登入

經常登陸SSH的朋友可以感覺出,每次登入SSH時總是要停頓等待一下才能連線上,,這是因為OpenSSH伺服器有一個DNS查詢選項UseDNS預設情況下是開啟的。
UseDNS 選項開啟狀態下,當客戶端試圖登入SSH伺服器時,伺服器端先根據客戶端的IP地址進行DNS PTR反向查詢出客戶端的主機名,然後根據查詢出的客戶端主機名進行DNS正向A記錄查詢,驗證與其原始IP地址是否一致,這是防止客戶端欺騙的一種措施,但一般我們的是動態IP不會有PTR記錄,開啟這個選項不過是在白白浪費時間而已,不如將其關閉。

7.RHEL 一些改變

8.優化RHEL