• 使用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连接。

    更多请fabric参考官方文档,http://www.fabfile.org/

    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

    2.3 更新的命令RHEL7.2 命令更新

    一、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命令大全

    http://man.linuxde.net/


    参考文献

    1.官方文档
    http://www.fabfile.org/

    2.参考
    http://wklken.me/posts/2013/03/25/python-tool-fabric.html

    3.python3中使用fabric3

    https://github.com/mathiasertl/fabric/
    pip install Fabric3

    4.关闭UseDNS加速SSH登录

    经常登陆SSH的朋友可以感觉出,每次登录SSH时总是要停顿等待一下才能连接上,,这是因为OpenSSH服务器有一个DNS查找选项UseDNS默认情况下是打开的。
    UseDNS 选项打开状态下,当客户端试图登录SSH服务器时,服务器端先根据客户端的IP地址进行DNS PTR反向查询出客户端的主机名,然后根据查询出的客户端主机名进行DNS正向A记录查询,验证与其原始IP地址是否一致,这是防止客户端欺骗的一种措施,但一般我们的是动态IP不会有PTR记录,打开这个选项不过是在白白浪费时间而已,不如将其关闭。

    http://www.kwx.gd/CentOSApp/Centos-SSH-UseDNS.html

    6.fabric使用简单例子,中文:
    http://www.cnblogs.com/MacoLee/p/5680672.html
    另一个参考:
    http://blog.csdn.net/wklken/article/details/8719541/

    7.RHEL 一些改变

    http://www.ha97.com/5657.html
    https://linux.cn/article-5926-1.html

    8.优化RHEL

    http://hequan.blog.51cto.com/5701886/1789146/

    9.日志
    http://www.linuxidc.com/Linux/2016-01/127729.htm
    http://blog.csdn.net/sinat_34689375/article/details/53789592
    https://blog.linuxeye.cn/400.html


  • 相关阅读:
    2.HTML案例二 头条页面
    1.HTML入门
    33.1.网络编程入门
    32.原子性
    【转】风控中的特征评价指标(一)——IV和WOE
    【转】Python调用C语言动态链接库
    基于蒙特卡洛树搜索(MCTS)的多维可加性指标的异常根因定位
    正则表达式全集
    基于ray的分布式机器学习(二)
    基于ray的分布式机器学习(一)
  • 原文地址:https://www.cnblogs.com/wangyaning/p/7853870.html
Copyright © 2020-2023  润新知