阿里云的源yum方式安装Mongodb

1)在/etc/yum.repos.d 创建一个mongodb-org.repo 源文件

[root@qd-vpc-dev-op01 ~]$ cd /etc/yum.repos.d/
[root@qd-vpc-dev-op01 yum.repos.d]$ touch mongodb-org.repo
[root@qd-vpc-dev-op01 yum.repos.d]$ cat mongodb-org.repo
[mongodb-org]
name=MongoDB Repository
baseurl=http://mirrors.aliyun.com/mongodb/yum/redhat/7Server/mongodb-org/3.2/x86_64/
gpgcheck=0
enabled=1
根据自己的系统版本选择填写的5  6  7版本的源
2)清空缓存和更新yum源
[root@qd-vpc-dev-op01 yum.repos.d]$ yum clean all
[root@qd-vpc-dev-op01 yum.repos.d]$ yum make cache
#更新yum源
[root@qd-vpc-dev-op01 yum.repos.d]$ yum update
3) 安装MongoDB
[root@qd-vpc-dev-op01 yum.repos.d]$ yum install -y mongodb-org
4)启动MongoDB
[root@qd-vpc-dev-op01 yum.repos.d]$ service mongod start
[root@qd-vpc-dev-op01 yum.repos.d]$ chkconfig mongod on
5)配置远程访问
[root@qd-vpc-dev-op01 yum.repos.d]$cat /etc/mongod.conf|grep -v "#"|grep -v "^$"
systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod.log
storage:
  dbPath: /var/lib/mongo
  journal:
    enabled: true
processManagement:
net:
  port: 27017
[root@qd-vpc-dev-op01 yum.repos.d]$ service mongod restart
Restarting mongod (via systemctl):                         [  OK  ]
6)打开MongoDB
[root@qd-vpc-dev-op01 yum.repos.d]$ mongo 127.0.0.1:27017
MongoDB shell version: 3.2.16
connecting to: 127.0.0.1:27017/test
Server has startup warnings:
2017-09-30T18:27:19.681+0800 I CONTROL  [initandlisten]
2017-09-30T18:27:19.681+0800 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2017-09-30T18:27:19.681+0800 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2017-09-30T18:27:19.681+0800 I CONTROL  [initandlisten]
2017-09-30T18:27:19.681+0800 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2017-09-30T18:27:19.681+0800 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2017-09-30T18:27:19.681+0800 I CONTROL  [initandlisten]
2017-09-30T18:27:19.681+0800 I CONTROL  [initandlisten] ** WARNING: soft rlimits too low. rlimits set to 4096 processes, 64000 files. Number of processes should be at least 32000 : 0.5 times number of files.
2017-09-30T18:27:19.681+0800 I CONTROL  [initandlisten]

利用阿里云pythonSDK修改RSD白名单

因为公司没有购买公网IP,每次路由器重启后IP 就会变动,阿里云服务器上的RDS需要指定白名单才能访问!为了安全性也不能开放所有的IP,每次IP变更后就需要去修改白名单不厌其烦!
参考了GiveMeFive_Y的博客源码https://blog.csdn.net/GiveMeFive_Y/article/details/78687665
修改了一个适合自己的使用的版本
第一步安装SDK

#pip install aliyun-python-sdk-rds
#pip install aliyun-python-sdk-ecs

第二步修改参数

#!/usr/bin/env python
# coding=utf-8
import requests
import json
import os
import re
import sys
from aliyunsdkcore import client
from aliyunsdkecs.request.v20140526 import DescribeSecurityGroupAttributeRequest
from aliyunsdkecs.request.v20140526 import AuthorizeSecurityGroupRequest
from aliyunsdkecs.request.v20140526 import AuthorizeSecurityGroupEgressRequest
from aliyunsdkecs.request.v20140526 import RevokeSecurityGroupRequest
from aliyunsdkecs.request.v20140526 import RevokeSecurityGroupEgressRequest
from aliyunsdkecs.request.v20140526 import DescribeSecurityGroupsRequest
from aliyunsdkrds.request.v20140815 import ModifySecurityIpsRequest
AccessKey = “666666666” #此处填写阿里云的accesskey
AccessSecret = “7777777777” #此处填写阿里云的accesssecret
RegionId = “cn-shanghai” #此处填写RDS服务器所属地域
dbInstanceId = “rm-XXXXXX” #此处填写RDS服务器的实例ID
dbInstanceIPArrayName = “gongshi” #此处填写RDS数据库安全组的名称
dbInstanceIPArrayAttribute = “,” #此处填写RDS数据库安全组的IP的分割符
class Alis():
def __init__(self, AccessKey, AccessSecret, RegionId):
self.AccessKey = AccessKey
self.AccessSecret = AccessSecret
self.RegionId = RegionId
def client(self):
c = client.AcsClient(self.AccessKey, self.AccessSecret, self.RegionId)
return c
def describeSecurityGroupsRequest(self):
request = DescribeSecurityGroupsRequest.DescribeSecurityGroupsRequest()
request.set_accept_format(‘json’)
return request
def modifySecurityIpsRequest(self, DBInstanceId, SecurityIps, DBInstanceIPArrayName, DBInstanceIPArrayAttribute):
“””修改数据库实例白名单
“””
request = ModifySecurityIpsRequest.ModifySecurityIpsRequest()
request.set_DBInstanceId(DBInstanceId)
request.set_SecurityIps(SecurityIps)
request.set_DBInstanceIPArrayName(DBInstanceIPArrayName)
request.set_DBInstanceIPArrayAttribute(DBInstanceIPArrayAttribute)
return request
def my_ip_method_1(self):
get_ip_method = os.popen(‘curl -s ip.cn’)
get_ip_responses = get_ip_method.readlines()[0]
get_ip_pattern = re.compile(r’\d+\.\d+\.\d+\.\d+’)
get_ip_value = get_ip_pattern.findall(get_ip_responses)[0]
print get_ip_value
return get_ip_value
def my_ip_method_2(self):
get_ip_method = os.popen(‘curl -s http://ip-api.com/json’)
get_ip_responses = get_ip_method.readlines()[0]
get_ip_responses = eval(str(get_ip_responses))
get_ip_value = get_ip_responses[‘query’]
return get_ip_value
def my_ip_method_3(self):
get_ip_method = requests.get(‘http://ifconfig.co/json’).content
get_ip_value = eval(get_ip_method)
get_ip_value = get_ip_value[‘ip’]
request = get_ip_value
return request
def read_old_ip(slef):
f = open(‘./ip.txt’)
line = f.read().splitlines()
print line[0]
f.close()
return line[0]
def write_ip_txt(slef,ip):
f = open(‘./ip.txt’,’w’)
print ip
f.write(ip)
f.close()
if __name__ == ‘__main__’:
ali = Alis(AccessKey, AccessSecret, RegionId) # 阿里云后台创建
clt = ali.client()
securityIps = ali.my_ip_method_1()#根据自己情况确定使用哪个公网IP查询接口
old_ip = ali.read_old_ip()
if old_ip == securityIps:
print(‘The specified value of parameter Value is the same as old’)
else:
req = ali.modifySecurityIpsRequest(dbInstanceId, securityIps,dbInstanceIPArrayName, dbInstanceIPArrayAttribute)
res = clt.do_action_with_exception(req)
print(“修改RDS白名单%s” % res)
ip=securityIps
ali.write_ip_txt(ip)
第三步在python的目录下建立一个ip.txt的空文件夹,用于存储记录之前的历史IP
 
 
 
 

Linux学习历程(持续更新整理中)

1.文件目录操作命令

     (1) ls   显示文件和目录列表

        a ls -l  显示文件的详细信息

        b ls -a 列出当前目录的所有文件,包含隐藏文件。

        c stat ‘目录/文件’   显示指定目录/文件的相关信息,比ls命令显示的内容更多

    (2) mkdir ‘目录’    创建目录

    (3) touch ‘文件名’    当前目录下创建一个空文件

    (4) echo ‘内容’>’文件名’   当前目录下生成一个带内容的文件

    (5) cat、tac ‘文件名’    查看文件中的文本内容

        a more、less分页显示文本文件内容

        b head、tail 分别显示文件开头和结尾部分

    (6) cp  ‘ 原始文件路径’ ‘复制到新的文件’   复制文件或者目录

    (7) rm ‘文件名’   删除文件

        a rm -r   同时删除该目录下的所有文件(递归删除)

        b rm -f  强制删除文件或者目录。       (c) rmdir  删除空目录

    (8) mv ‘原始文件’ ‘需要移动到的目录’  移动文件或者目录

        a mv ‘原始文件名’ ‘修改的文件名’    修改文件名称,将原始的文件名称修改为修改后的文件名称

    (9) find -name ‘文件名’   搜索当前目录及其子目录的结果,不过滤任何条件,直接返回所有查找到的文件

    (10) wc ‘文件名’   统计文本文档的行数,字数,字符数。

    (11) grep ‘查询的字符串’ ‘文件名’   在指定的文本文件中查找指定的字符串

    (12) tree 显示当前目录下的目录树

        a 切换到root用户下执行yum -y install tree 命令安装tree插件,安装之后执行tree会显示出对应的目录树

    (13) pwd  显示当前工作目录

    (14) ln -s  建立软链接文件   例如: ln -s /home/kencery/nginx/house/room   /home/root,给前面的文件做一个软连接放到/home/下的root连接(相当于windows下的快捷方式)。

2.备份压缩命令

 (1) gzip压缩(解压)文件或者目录,压缩文件后缀为gz

        a 命令格式  gzip [选项] 压缩(解压缩)的文件名  压缩:gzip ‘文件.tar/文件’      压缩

        b 参数

            b.1   -d 将压缩文件解压         gzip -d ‘压缩文件’       解压缩

            b.2   -l 对每个压缩文件,显示压缩文件的大小,未压缩文件的大小,压缩比,未压缩文件的名字

            b.3   -v 对每一个压缩和解压的文件,显示文件名和压缩比

            b.4   -num 用指定的数字num调整压缩的速度,-1或–fast表示最快压缩方法(低压缩比),-9或–best表示最慢压缩比(高压缩比),系统缺省值为6.        gzip -9(压缩比)  ‘文件.tar/文件’

    (2) bzip2压缩(解压)文件或者目录,压缩文件后缀为bz2

        a 命令格式 bzip2 [-cdz]  文件

        b 参数

            b.1   -d 解压缩的参数      bzip2 -d ‘压缩文件’  解压缩

            b.2   -z  压缩的参数      bzip2 -z ‘文件.tar/文件’  压缩

            b.3   -num 用指定的数字num调整压缩的速度,-1或–fast表示最快压缩方法(低压缩比),-9或–best表示最慢压缩比(高压缩比),系统缺省值为6.

    (3) tar文件、目录打(解)包

        a 命令格式 tar [-cxzjvf] 压缩打包文档的名称,欲打包目录参数

        b 参数

            b.1   -c 建立一个归档文件的参数命令

            b.2   -x 解开一个归档文件的参数命令

            b.3   -z 是否需要用gzip压缩

            b.4   -j 是否需要用bzip2压缩

            b.5   -v 压缩的过程中显示文件

            b.6   -f 使用档名,在f之后要立即接档名

            b.7   -tf 查看归档文件里面的文件

        c  备注说明

            c.1  仅打包,不压缩   tar  -cvf  /home/kencery/demo.tar    /home/kencery/demo

            c.2  打包后,已gzip压缩   tar  -zcvf  /home/kencery/demo.tar.gz    /home/kencery/demo

            c.3  打包后,已gzip压缩   tar  -jcvf  /home/kencery/demo.tar.bz2    /home/kencery/demo

                备注:参数-f之后的文件档名是自己取的,我们习惯上都用.tar来作为辨识

3.Vim编辑器的使用

    (1) 编辑模式:等待编辑命令输入                       vim ‘文件名’

    (2) 插入模式:编辑模式下,输入i、o、a进入插入模式,插入文本信息

    (3) 命令模式:在编辑模式下,输入”:”进行命令模式

        a 命令模式下的命令:

            a.1 直接退出Vi

            a.2 wq 保存后退出vi,并可以新建文件

            a.3 q!  强制退出,不会保存

            a.4 w file 将当前内容保存成某个文件

            a.5 set number 在编辑文件显示行号(在编辑模式下操作)

            a.6 set nonnumber 在编辑文件不显示行号(在编辑模式下操作)

4.文件权限管理

    (1) 查看文件和目录的权限(“R(4)”读权限、”W(2)”写权限、”X(1)”执行权限)

        a ls -l 文件名/目录

            drwxrwxr-x. 3 kencery kencery  4096 Mar 29 13:56 KenceryA

                a.1 显示信息包含:文件类型(d目录,-pu通文件,l连接文件),文件权限,文件的属主,文件的所属组,文件的大小,文件的创建时间,文件的名称

                a.2 从第二个字符起rwx是说明用户kencery有读、写、执行权限,接着的rwx表示用户组kencery也有读、写、执行权限,最后的r-x指其他人(other)只有读,执行权限,没有写权限。

    (2) 更改操作权限

        a chmod[u 属主,g 所属组用户,o 其他用户,a 所有用户][+ 加权限,-减权限,=加权限的同时将原有权限删除][rwx] 文件或者目录名

            a.1 对kencery.txt文件增加所属组用户增加写权限   chmod g+w kencery.txt

            a.2 对kencery.txt文件去掉所属组的写权限增加其他用户的执行权  chmod g-w,o+x kencery.txt

5.用户和组账户管理

    (1) 账户系统文件

        a cat /etc/passwd 每行定义一个用户账户,此文件对所有的用户可读,信息如下:

                root:x:0:0:root:/root:/bin/bash

                用户名:口令:用户标示号:组标示号:注释:宿主目录:命令解释器

            a.1 口令是X,说明用户的口令是被/etc/shadow文件保护的。

            a.2 用户标示号,系统内唯一,root用户的UID为0,普通用户从500/1000开始,1-499/999是系统的标准账户(每个Linux版本系统不一致)

            a.3 宿主目录,用户登录系统后所进入的目录

            a.4 命令解释器,制定该用户使用的shell,默认是/bin/bash。

        b cat /etc/shadow 为了增加系统的安全性,用户口令通常用shadow passwords保护,只有root可读,信息如下:              root:$6$/ZgfxO/0$Q2G6/CvI9hknSdsWW8xRy8QkBfZLCyhYyDIn2atfDgsEQf1SsNP9FTZ2B2BU9aOs4mXmY.FP0UQ2tib/UKrLq1:16701:0:99999:7:::

                用户名:口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间(7):不活动时间:失效时间:标志

        c cat /etc/group 将用户进行分组时Linux对用户进行管理及控制访问权限的一种手段,一个组中可以有多个用户,一个用户可以同时属于多个组,该文件对所有用户可读。

                组名:组口令:gid:组成员    root:x:0:

        d cat /etc/gshadow  该文件用户定义用户组口令,组管理员等信息,只有root用户可读。

                root:::

    (2) 对用户进行管理

        a 添加用户信息

                a.1 useradd/adduser 用户名   添加用户(备注:没有设置密码不能使用)   useradd/adduser  hyl

                a.2 useradd -u (UID号)

                a.3 useradd -p (口令)

                a.4 useradd -g(分组)

                a.5 useradd -s (sheel)

                a.6 useradd -d (用户目录)

        b 修改用户信息

                b.1 usermod -u(新的UID)

                b.2 usermod -d (用户目录)

                b.3 usermod -g (组名)

                b.4 usermod -s (sheel)

                b.5 usermod -p(新口令)

                b.6 usermod -l (新登录名)

                b.7 usermod -L(锁定用户账号密码)

                b.8 usermod -U (解锁用户账号)

        c.删除用户信息

                c.1 userdel 用户名(删除用户账号)

                c.2  userdel -r 用户名(删除用户账号的同时删除目录)

    (3) 对组账户进行管理

        a 添加组信息

            a.1 groupadd 组账户名(创建新组)

            a.2 groupadd -g 指定组GID

        b 修改组信息

            b.1 groupmod -g  更改组的GID

            a.2 groupmod -n 更改组账户名

        c 删除组信息

            c.1 groupdel 组账户名(删除指定组账户)

    (4) 口令维护命令

        a passwd 用户账户名(设置用户口令)    passwd ‘账户名’

        b passwd -l 用户账户名(锁定用户账户)

        c  passwd -u 用户账户名(解锁用户账户)

        d passwd -d 用户账户名(删除账户口令)

        e passwd -a 用户账户名 组账户名(将指定用户添加到指定组)

        f  passwd -d 用户账户名 组账户名(将用户从指定组中删除)

        g passwd -A 用户账户名 组账户名(将用户指定为组的管理员)

    (5) 用户和组状态命令

        a su 用户名  切换用户账户

            a.1 su ‘用户名’ 切换用户账户(不切换工作目录)

            a.2 su – ‘用户名’ 切换用户账户(切换工作目录)

        b sudo 是允许系统管理员让普通用户执行一些或全部的超级管理员(root)命令的一个工具(如:reboot,su…),这样不仅减少了root用户的登录和管理实践,同样也提高了安全性,sudo不是对shell的一个替代,它是面向每个命令的,它的主要特点有以下几点:

            b.1 cat /etc/sudoers   sudo文件的说明

        c grops ‘用户名’

6.系统管理命令

    (1) who 显示在线登录的用户并且查看以什么方式登录系统的。

    (2) hostname 显示主机名称、uname (-a)  显示系统信息

    (3) 线程/进程/内存/网络/磁盘使用情况

        a top 显示当前系统中耗费资源最多的进程(ctrl+c退出)

        b ps 显示瞬间的进程状态,和top的区别就是只获取当前瞬间的进程,获取之后将不会实时变化。

        c du (-h) 目录/文件  显示指定的文件(目录)已使用的磁盘空间的总量

        d df (-h)  显示文件系统磁盘的使用

        e free (-s2) 显示当前内存和交换空间的使用情况(两秒刷新一次)(ctrl+c退出)

        f ifconfig 显示网络接口信息

        g ping 测试网络的连通性           h  netstat 显示网络状态信息

    (4) man ‘命令’   命令帮助信息查询  (q退出)

    (5) alias ‘别名’ =’指令名’  设置命令别名     unalias ‘别名’   删除别名

    (6) clear 清屏

    (7) kill 杀死一个进程

    (8) 关机/重启命令

        a shutdown  系统关机

            a.1  -r 关机后重启            a.2 -h 关机后不重新启动      a.3  now 立即关机

        b halt 关机后关闭电源

        c reboot  重启心动

7.Linux目录结构

    1. bin 存放二进制可执行文件(ls,cat,mkdir,chmod)

    2. boot 存放用于系统引导时使用的各种文件

    3. data 数据文件夹,某些操作产生的临时文件夹

    4. dev 用于存放设备文件

    5. etc 存放系统配置文件

    6. home 存放所有用户文件的根目录

    7. lib 存放跟文件系统中的程序运行所需要的共享库以及内核模块

    8. lib64

    9. lost+found 使用标准的ext2/ext3档案系统格式才会产生一个目录,目的在于当档案发生错误时,将一些遗失的片段放置在这里目录下。

    10. media 软碟,光碟,DVD等挂载于此处

    11. mnt 系统管理员安装临时文件系统的安装点

    12. opt 额外安装的可选应用程序包所放置的位置

    13. proc 虚拟文件系统,存放当前内存的映射

    14. root 超级用户目录

    15. sbin 存放二进制可执行文件,只有root才能访问

    16. selinux

    17. srv 网络服务启动之后,这些服务所需要取用的资料目录,常见的服务ftp

    18. sys 虚拟的档案系统,记录与核心相关的咨询,包括目前载入的核心模组等,这个目录不占用硬盘容量

    29. tmp 用于存放各种临时文件

    20. usr 用于存放系统应用程序,比较重要的目录/usr/local本地管理员软件安装目录

    21. var 用于存放运行时需要改变数据的文件

ansible playbook

应客户需求某次给客户的提供的软件需要提供ansible playbook!   what???  什么鬼,接到这个任务我也是满脸懵逼!
好吧接下来我们看看这到底是个什么鬼!
 
Playbook是Ansible的配置,部署和编排语言。 他们可以描述您希望远程系统执行的策略,或一般IT流程中的一组步骤。
如果Ansible modules是您workshop的工具,则playbooks是您的说明手册,您的主机inventory是您的原材料。
在基本层面上,可以使用playbooks来管理远程机器的配置和部署。 在更高级别,他们可以对涉及滚动更新的多层次推出进行排序,并可以将操作委派给其他主机,与监控服务器进行交互,同时加载平衡器。
虽然这里有很多信息,但是不需要一次就可以学习所有的东西。 随着时间的推移,您可以开始小型化,随时随地选择更多功能。
playbooks旨在让人可读,并以基本的文字语言开发。 可以通过多种方法来组织playbooks和他们包含的文件,我们将提供一些建议,并充分利用“可复制”。
建议您阅读“ Playbook ”文档,同时阅读“ 示例手册” 。 这些说明了最佳实践以及如何将许多各种概念集中在一起。

关于Playbooks

Playbook是一种与adhoc任务执行模式完全不同的方式,而且特别强大。
简单地说,Playbooks是一个非常简单的配置管理和多机器部署系统的基础,不像任何已经存在的那样,而且非常适合部署复杂的应用程序。
Playbook可以声明配置,但它们也可以协调任何手动订购过程的步骤,即使不同的步骤必须在特定订单的机器组之间来回弹起。 他们可以同步或异步地启动任务。
虽然您可以运行主/usr/bin/ansible程序来进行自组织任务,但是Playbook更有可能被保留在源代码管理中,并用于推出配置或确保远程系统的配置符合规范。
还有一些完整的剧本可以ansible-examples存储库中说明很多这些技术。 我们建议您在另一个标签中查看这些内容。
在学习剧本之后,还有很多跳跃点,所以在完成本节之后,请回到文档索引。

Playbook Language Example

Playbook以YAML格式(见YAML Syntax )表示,并具有最少的语法,它有意尝试不是编程语言或脚本,而是一个配置或进程的模型。
每个playbook由一个或多个“plays”组成。
一个play的目标是将一组主机映射到一些明确定义的roles,由事件可调用的任务代表。 在基本层面上,一个任务只不过是对一个可以粘贴的模块的调用(参见关于模块 )。
通过编写多个“plays”的playbook,可以协调多机器部署,在Web服务器组中的所有计算机上运行某些步骤,然后在数据库服务器组上执行某些步骤,然后在Web服务器组等上再次执行命令。
“plays”或多或少是体育比喻。 你可以有很多戏剧影响你的系统做不同的事情。 它不像你只是定义一个特定的状态或模型,你可以在不同的时间运行不同的play。
对于初学者来说,这是一个仅包含一个play的playbook:

---
- hosts: webservers
  vars:
    http_port: 80
    max_clients: 200
  remote_user: root
  tasks:
  - name: ensure apache is at the latest version
    yum: name=httpd state=latest
  - name: write the apache config file
    template: src=/srv/httpd.j2 dest=/etc/httpd.conf
    notify:
    - restart apache
  - name: ensure apache is running (and enable it at boot)
    service: name=httpd state=started enabled=yes
  handlers:
    - name: restart apache
      service: name=httpd state=restarted

当使用具有很长参数的任务或具有许多参数的模块时,可以通过多行将任务项目中断以改进结构。 以下是上述示例的另一个版本,但是使用YAML字典为它们的key=value参数提供模块:

---
- hosts: webservers
  vars:
    http_port: 80
    max_clients: 200
  remote_user: root
  tasks:
  - name: ensure apache is at the latest version
    yum:
      name: httpd
      state: latest
  - name: write the apache config file
    template:
      src: /srv/httpd.j2
      dest: /etc/httpd.conf
    notify:
    - restart apache
  - name: ensure apache is running
    service:
      name: httpd
      state: started
  handlers:
    - name: restart apache
      service:
        name: httpd
        state: restarted
Playbook可以包含多个play。 您可能有一个Playbook首先定位到Web服务器,然后是数据库服务器。 例如:
---
- hosts: webservers
  remote_user: root
  tasks:
  - name: ensure apache is at the latest version
    yum: name=httpd state=latest
  - name: write the apache config file
    template: src=/srv/httpd.j2 dest=/etc/httpd.conf
- hosts: databases
  remote_user: root
  tasks:
  - name: ensure postgresql is at the latest version
    yum: name=postgresql state=latest
  - name: ensure that postgresql is started
    service: name=postgresql state=started
您可以使用此方法在您要定位的主机组,登录到远程服务器的用户名,是否要sudo之间进行切换。 play,像任务一样,按照playbook中指定的顺序运行:从上到下。

Basics

Hosts and Users

对于Playbook中的每个play,您可以选择您的基础设施中的哪些机器进行定位,以及什么远程用户完成步骤(称为任务)。
hosts行是一个或多个组或主机模式的列表,以冒号分隔,如“ 模式”文档中所述。 remote_user只是用户帐户的名称:

---
- hosts: webservers
  remote_user: root
还可以为每个任务定义远程用户:
---
- hosts: webservers
  remote_user: root
  tasks:
    - name: test connection
      ping:
      remote_user: yourname
支持作为其他用户来运行(请参阅Become (Privilege Escalation) ):
---
- hosts: webservers
  remote_user: yourname
  become: yes
您也可以使用成为特定任务而不是整个play:
---
- hosts: webservers
  remote_user: yourname
  tasks:
    - service: name=nginx state=started
      become: yes
      become_method: sudo
您也可以登录,然后成为与root不同的用户:
---
- hosts: webservers
  remote_user: yourname
  become: yes
  become_user: postgres

您还可以使用其他权限升级方法,如su:
---
- hosts: webservers
  remote_user: yourname
  become: yes
  become_method: su
如果需要指定sudo的密码,请使用--ask-become-pass或使用旧的sudo语法--ask-sudo-pass-K )运行ansible-playbook 。 如果你运行成为playbook,并且playbook似乎挂起,它可能会停留在特权升级提示符下。 只要控制C来杀死它并再次运行,添加相应的密码。 您还可以控制运行主机的顺序。 默认是按照inventory提供的顺序: 
- hosts: all
  order: sorted
  gather_facts: False
  tasks:
    - debug: var=inventory_hostname
order的可能值为:
inventory:
 默认值。 该order是由“inventory”提供的
reverse_inventory:
 顾名思义,将inventory提供的顺序反过来了
sorted:
主机按名称的字母顺序排列
reverse_sorted:
反向
shuffle:
Hosts are randomly ordered each run主机每次运行随机顺序

Tasks list

每个play包含一个任务列表。 任务按顺序执行,一次一个地执行与主机模式匹配的所有计算机,然后再转到下一个任务。 重要的是要明白,在一个playbook中,所有的主机都要得到相同的任务指令。 play的目的是将选择的主机映射到任务。
当运行从上到下运行的playbook时,失败任务的主机将从整个playbook的旋转中取出。 如果事情失败,只需更正playbook文件并重新运行。

每个任务的目标是执行一个非常具体的参数的模块。 如上所述,变量可以在模块的参数中使用。
模块应该是幂等的,也就是说,按顺序运行一个模块多次应该具有一样的运行效果。 实现幂等的一种方法是使模块检查其所期望的最终状态是否已经实现,并且如果该状态已经实现,
则在不执行任何动作的情况下退出。 如果一个playbook所使用的所有模块都是幂等的,那么这个playbook本身就有可能是幂等的,所以重新运行这个playbook应该是安全的。
commandshell模块通常会重新运行相同的命令,如果命令类似于chmodsetsebool等,则完全可以。尽管有一个可用于创建这些模块的creates标志也是幂等的。 每个任务都应该有一个name ,它包含在运行该play的输出中。 这是人类可读的输出,因此提供每个任务步骤的良好描述是有用的。 如果没有提供名称,则将“feed”的字符串用作输出。 可以使用旧版action: module options格式声明任务,但建议您使用更常规的module: options格式。 在整个文档中使用了这种推荐的格式,但是您可能会在某些playbook中遇到较旧的格式。 这是一个基本的任务。 与大多数模块一样,服务模块采用key=value参数: 
tasks:
  - name: make sure apache is running
    service: name=httpd state=started

commandshell模块是唯一获取参数列表而不使用key=value表单的模块。 这使得他们按照你所期望的方式工作:
tasks:
  - name: enable selinux
    command: /sbin/setenforce 1
commandshell模块关心返回代码,所以如果你有一个成功的退出代码不为零的命令,你可能希望这样做:
tasks:
  - name: run this command and ignore the result
    shell: /usr/bin/somecommand || /bin/true
或这个:
tasks:
  - name: run this command and ignore the result
    shell: /usr/bin/somecommand
    ignore_errors: True
如果行动线太长了,你可以在一个空间上打破它,并缩进任何延续线:
tasks:
  - name: Copy ansible inventory file to client
    copy: src=/etc/ansible/hosts dest=/etc/ansible/hosts
            owner=root group=root mode=0644
变量可以在动作行中使用。 假设您在vars部分中定义了一个名为vhostvars ,您可以这样做: 
tasks:
  - name: create a virtual host file for {{ vhost }}
    template: src=somefile.j2 dest=/etc/httpd/conf.d/{{ vhost }}

Action Shorthand

可选择在0.8及更高版本中列出这样的模块:

  template : src = templates / foo.j2 dest = / etc / foo.conf

您会注意到在早期版本中,这只能用作:

  action : template src = templates / foo.j2 dest = / etc / foo.conf

旧的表单继续在较新的版本中工作,没有任何弃用的计划。

Handlers: Running Operations On Change

如上所述,模块应该是幂等的,并且可以在远程系统上进行更改时进行中继。 Playbook认识到这一点,并有一个基本的事件系统可以用来响应变化。
这些“通知”动作在play中每个任务块的末尾触发,只有在多个不同任务通知时才会被触发一次。
例如,多个资源可能表明apache需要重新启动,因为它们已经更改了一个配置文件,但apache只会被triggered一次以避免不必要的重新启动。
以下是当文件内容更改时重新启动两个服务的示例,但仅当文件更改时:

- name: template configuration file
  template: src=template.j2 dest=/etc/foo.conf
  notify:
     - restart memcached
     - restart apache
任务notify部分列出的内容称为处理程序。 处理程序是由全局唯一名称引用的任务列表,与常规任务完全没有任何区别,并由通知程序通知。 如果没有通知处理程序,它将不会运行。 无论通过处理程序有多少任务,在所有任务在特定的play中完成后,它将只运行一次。 这是一个示例处理程序部分: 
handlers:
    - name: restart memcached
      service: name=memcached state=restarted
    - name: restart apache
      service: name=apache state=restarted
至于Ansible 2.2,处理程序也可以“listen”通用主题,任务可以通知这些主题如下:
handlers:
    - name: restart memcached
      service: name=memcached state=restarted
      listen: "restart web services"
    - name: restart apache
      service: name=apache state=restarted
      listen: "restart web services"
tasks:
    - name: restart everything
      command: echo "this task will restart the web services"
      notify: "restart web services"
这种使用可以更容易地触发多个处理程序。 它也使处理程序与名称分离,从而更容易在剧本和角色之间共享处理程序(特别是当使用像Galaxy这样的共享源的第三方角色时)。
角色将在后面描述,但值得指出的是:
  • pre_tasks , taskspost_tasks部分内通知的处理程序将在通知的部分的末尾自动刷新;
  • roles部分内通知的处理程序将在roles部分结束时自动刷新,但在任何tasks处理程序之前。

如果您想要立即刷新所有处理程序命令,在1.2及更高版本中,您可以:

tasks:
   - shell: some tasks go here
   - meta: flush_handlers
   - shell: some other tasks
在上述示例中,任何排队处理程序将在达到meta语句时提前处理。 这是一个niche的例子,但可以不时地派上用场。 

Executing A Playbook

现在你已经学会了Playbook的语法,你如何运行一个playbook? 这很简单。 让我们用10级的并行度来运行一个playbook:

ansible-playbook playbook.yml -f 10

Ansible-Pull

如果你想反转Ansible的架构,那么节点就可以检查到一个中央位置,而不是把配置推送给他们,你可以。
ansible-pull是一个小脚本,可以从git检出配置指令的备份,然后针对该内容运行ansible-playbook 。
假设您负载平衡您的checkout位置,基本无限可ansible-pull秤。
运行ansible-pull --help帮助详细信息。
还有一个clever playbook可以通过推送模式下的crontab来配置安全性。

Tips and Tricks

要检查playbook的语法,请使用带有--syntax-check标志的--syntax-check ansible-playbook 。 这将通过解析器运行playbook文件,以确保其包含的文件,角色等没有语法问题。
查看playbook执行的底部以获取目标节点的总结以及它们的执行情况。 一般失败和致命的“不可达到”的通信尝试在计数中保持分开。
如果您想查看成功模块以及不成功模块的详细输出,请使用--verbose标志。 这在可用0.5和更高版本中可用。
如果安装了cowsay包,可靠的剧本输出将大大提升。 尝试一下!
在运行它之前,要查看playbook会受到哪些主机的影响,您可以执行以下操作:

  ansible-playbook playbook.yml --list-hosts

挖矿病毒清理

早上到公司后,发现公司的阿里云上的服务器突然莫名其妙的CPU一直在报警!导致服务基本上不可以用!
用top命令查看了一下,cpu被占用接近100%,所以无法运行新程序,通过top命令然后输入P,就能看到有两个程序几乎占用了所有的CPU,占用率为700%左右,程序名称为:minerd和AnXqV两个,通过搜索知道是挖矿程序,通过kill命令及pkill命令是无法直接解决的,找到了一个教程http://blog.csdn.net/hu_wen/article/details/51908597,看来受害者不少!
 
以下为原文搬砖
在确定跟项目不相关的情况下判断是个木马程序,果断kill掉进程,然后删除/opt下minerd文件
本想这样可以解决,谁想不到15秒时间,又自动启动起来,而且文件又自动创建,这个让我想起了crontab的定时器,果然运维同事一查确实定时器存在一条:,果断删除处理。再杀进程,再删文件;然并卵,依旧起来;

百度资料说该根源可能是通过jenkins开放外网被黑客入侵导致,接着就把jenkins服务停止,把外网端口关闭,顺道把服务器的所有用户密码及ssh改了一遍,再把minerd进程杀掉,删文件,但是还是不行。
http://www.myhack58.com/Article/48/66/2014/56680.htm
继续百度各种资料,检查是否存在其它定时器,在/var/spool/cron/目录下发现有个root用户的定时器文件,以为找到根源了,再次果断删除,结果,还是没有解决;
后面同事在google搜索到了一个资料,
http://security.stackexchange.com/questions/129448/how-can-i-kill-minerd-malware-on-an-aws-ec2-instance

各种文件删除都不起作用,原来该木马程序注册了一个“lady”的服务,而且还是开机启动,起一个这个可爱的名字,谁TMD知道这是一个木马。
把lady服务停止,删除开机启动,删除文件,恢复正常!
—2017 02 21 补充
很有网友也遇到跟我同样的问题,但是木马程序确实有点嚣张,通过利用redis的免帐号密码漏洞进行入侵

Redis 未授权访问缺陷可轻易导致系统被黑


1. 修复 redis 的后门缺陷

  1. 配置bind选项, 限定可以连接Redis服务器的IP, 并修改redis的默认端口6379
  2. 配置AUTH, 设置密码, 密码会以明文方式保存在redis配置文件中.
  3. 配置rename-command CONFIG “RENAME_CONFIG”, 这样即使存在未授权访问, 也能够给攻击者使用config指令加大难度
  4. 好消息是Redis作者表示将会开发”real user”,区分普通用户和admin权限,普通用户将会被禁止运行某些命令,如conf

2. 打开 ~/.ssh/authorized_keys, 删除你不认识的密钥
3. 删除用户列表中陌生的帐号

Linux 下如何将要发布的项目制作成RPM安装包

开始前的准备
安装rpmbuild软件包

  • yum -y install rpm-build

生成相关目录
要生成rpm相关目录,可以手动创建,也可以通过rpmbuild命令创建。如:

[root@yang data]# rpmbuild zabbix_agentd_ops.spec 
error: File /root/rpmbuild/SOURCES/zabbix-3.0.3.tar.gz: No such file or directory
有报错,无需理会,可以看到rpmbuild目录已经创建完成
[root@yang ~]# tree rpmbuild/
rpmbuild/
├── BUILD
├── BUILDROOT
├── RPMS
├── SOURCES
├── SPECS
└── SRPMS

编写SPEC文件
SPEC关键字
Name: 软件包的名称,后面可使用%{name}的方式引用
Summary: 软件包的内容概要
Version: 软件的实际版本号,例如:1.0.1等,后面可使用%{version}引用
Release: 发布序列号,例如:1linuxing等,标明第几次打包,后面可使用%{release}引用
Group: 软件分组,建议使用标准分组
License: 软件授权方式,通常就是GPL
Source: 源代码包,可以带多个用Source1、Source2等源,后面也可以用%{source1}、%{source2}引用
BuildRoot: 这个是安装或编译时使用的“虚拟目录”,考虑到多用户的环境,一般定义为:%{tmppath}/{name}-%{version}-%{release}-root或%{tmppath}/%{name}-%{version}-%{release}-buildroot-%%__id_u} -n}.该参数非常重要,因为在生成rpm的过程中,执行make install时就会把软件安装到上述的路径中,在打包的时候,同样依赖“虚拟目录”为“根目录”进行操作。后面可使用$RPM_BUILD_ROOT 方式引用。
URL: 软件的主页
Vendor: 发行商或打包组织的信息,例如RedFlag Co,Ltd
Disstribution: 发行版标识
Patch: 补丁源码,可使用Patch1、Patch2等标识多个补丁,使用%patch0或%{patch0}引用
Prefix: %{_prefix} 这个主要是为了解决今后安装rpm包时,并不一定把软件安装到rpm中打包的目录的情况。这样,必须在这里定义该标识,并在编写%install脚本的时候引用,才能实现rpm安装时重新指定位置的功能
Prefix: %{sysconfdir} 这个原因和上面的一样,但由于%{prefix}指/usr,而对于其他的文件,例如/etc下的配置文件,则需要用%{_sysconfdir}标识
Build Arch: 指编译的目标处理器架构,noarch标识不指定,但通常都是以/usr/lib/rpm/marcros中的内容为默认值
Requires: 该rpm包所依赖的软件包名称,可以用>=或<=表示大于或小于某一特定版本,例如:libpng-devel >= 1.0.20 zlib ※“>=”号两边需用空格隔开,而不同软件名称也用空格分开,还有例如PreReq、Requires(pre)、Requires(post)、Requires(preun)、Requires(postun)、BuildRequires等都是针对不同阶段的依赖指定
Provides: 指明本软件一些特定的功能,以便其他rpm识别
Packager: 打包者的信息
%description 软件的详细说明
SPEC脚本主体
%prep 预处理脚本
%setup -n %{name}-%{version}** 把源码包解压并放好通常是从/usr/src/asianux/SOURCES里的包解压到/usr/src/asianux/BUILD/%{name}-%{version}中。一般用%setup -c就可以了,但有两种情况:一就是同时编译多个源码包,二就是源码的tar包的名称与解压出来的目录不一致,此时,就需要使用-n参数指定一下了。
%patch 打补丁通常补丁都会一起在源码tar.gz包中,或放到SOURCES目录下。一般参数为:

  • %patch -p1 使用前面定义的Patch补丁进行,-p1是忽略patch的第一层目
  • %Patch2 -p1 -b xxx.patch 打上指定的补丁,-b是指生成备份文件

补充

  • %setup 不加任何选项,仅将软件包打开。
  • %setup -n newdir 将软件包解压在newdir目录。
  • %setup -c 解压缩之前先产生目录。
  • %setup -b num 将第num个source文件解压缩。
  • %setup -T 不使用default的解压缩操作。
  • %setup -T -b 0 将第0个源代码文件解压缩。
  • %setup -c -n newdir 指定目录名称newdir,并在此目录产生rpm套件。
  • %patch 最简单的补丁方式,自动指定patch level。
  • %patch 0 使用第0个补丁文件,相当于%patch ?p 0。
  • %patch -s 不显示打补丁时的信息。
  • %patch -T 将所有打补丁时产生的输出文件删除。

%configure 这个不是关键字,而是rpm定义的标准宏命令。意思是执行源代码的configure配置,在/usr/src/asianux/BUILD/%{name}-%{version}目录中进行 ,使用标准写法,会引用/usr/lib/rpm/marcros中定义的参数。另一种不标准的写法是,可参考源码中的参数自定义,例如:

引用CFLAGS="$RPM_OPT_FLAGS" CXXFLAGS="$RPM_OPT_FLAGS" ./configure --prefix=%{_prefix}

 
%build 开始构建包,在/usr/src/asianux/BUILD/%{name}-%{version}目录中进行make的工作
%install 开始把软件安装到虚拟的根目录中.在/usr/src/asianux/BUILD/%{name}-%{version}目录中进行make install的操作。这个很重要,因为如果这里的路径不对的话,则下面%file中寻找文件的时候就会失败。 常见内容有:

  • %makeinstall 这不是关键字,而是rpm定义的标准宏命令。也可以使用非标准写法:make DESTDIR=$RPM_BUILD_ROOT install或引用make prefix=$RPM_BUILD_ROOT install
  • 需要说明的是,这里的%install主要就是为了后面的%file服务的。所以,还可以使用常规的系统命令:引用install -d $RPM_BUILD_ROOT/和cp -a * $RPM_BUILD_ROOT/

%clean 清理临时文件
%pre   rpm安装前执行的脚本
%post rpm安装后执行的脚本
%preun   rpm卸载前执行的脚本
%postun rpm卸载后执行的脚本
%files 定义那些文件或目录会放入rpm中
%defattr (-,root,root)** 指定包装文件的属性,分别是(mode,owner,group),-表示默认值,对文本文件是0644,可执行文件是0755
%changelog  变更日志
实例:

%define zabbix_user zabbix                  #自定义宏,名字为zabbix_user值为zabbix,%{zabbix_user}引用
Name:   zabbix                              #软件包的名字,后面可用%{name}引用
Version:    3.0.3                           #软件的实际版本号,可使用%{version}引用
Release:    1%{?dist}                       #发布序列号,标明第几次打包  
Summary:    zabbix_agentd                   #软件包内容概要
Group:      zabbix                          #软件包分组
License:    GPL                             #授权许可方式
URL:        www.yang.com                    #软件的主页
Source0:    zabbix-3.0.3.tar.gz             #源代码包,可以有Source0,Source1等源
BuildRequires:      gcc, gcc-c++            #制作rpm包时,所依赖的基本库
Requires:   gcc, gcc-c++, chkconfig         #安装rpm包时,所依赖的软件包
%description                                #定义rpm包的描述信息
Zabbix agentd 3.0.3
%pre                                        #rpm包安装前执行的脚本
grep zabbix /etc/passwd > /dev/null
if [ $? != 0 ]
then useradd zabbix -M -s /sbin/nologin
fi
[ -d /etc/zabbix   ]||rm -rf /etc/zabbix*
%post                                       #rpm包安装后执行的脚本
sed -i "/^ServerActive=/c\ServerActive=172.30.17.35" /etc/zabbix/etc/zabbix_agentd.conf
sed -i "/^Server=/c\Server=172.30.17.35" /etc/zabbix/etc/zabbix_agentd.conf
sed -i "/Timeout=3/c\Timeout=30" /etc/zabbix/etc/zabbix_agentd.conf
sed -i "/HostMetadata=/c\HostMetadata=PostgreSQL" /etc/zabbix/etc/zabbix_agentd.conf
sed -i "/^Hostname=/c\Hostname=PostgreSQL" /etc/zabbix/etc/zabbix_agentd.conf
echo "UnsafeUserParameters=1" >>/etc/zabbix/etc/zabbix_agentd.conf
echo "EnableRemoteCommands=1" >>/etc/zabbix/etc/zabbix_agentd.conf
echo "Include=/etc/zabbix/etc/zabbix_agentd.conf.d/*.conf" >>/etc/zabbix/etc/zabbix_agentd.conf
chkconfig zabbix_agentd on
%preun                                      #rpm卸载前执行的脚本
systemctl stop zabbix_agentd
%postun                                     #rpm卸载后执行的脚本
userdel  zabbix
rm -rf /etc/zabbix*
%prep                                       #这个宏开始
%setup -q                                   #解压并cd到相关目录
%build                                      #定义编译软件包时的操作
./configure --prefix=/etc/%{name}-%{version}   --enable-agent
make -j16 %{?_smp_mflags}
%install                                    #定义安装软件包,使用默认值即可
test -L %{buildroot}/etc/%{name} && rm -f %{buildroot}/etc/%{name}
install -d %{buildroot}/etc/profile.d
install -d %{buildroot}/etc/init.d
make install DESTDIR=%{buildroot}
echo 'export PATH=/etc/zabbix/bin:/etc/zabbix/sbin:$PATH' > %{buildroot}/etc/profile.d/%{name}.sh
ln -sf /etc/%{name}-%{version}          %{buildroot}/etc/%{name}
cp %{_buildrootdir}/postgresql.conf         %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/postgresql.conf
cp %{_buildrootdir}/tcp_connections.sh      %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/tcp_connections.sh
cp %{_buildrootdir}/iostat-collect.sh       %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/iostat-collect.sh
cp %{_buildrootdir}/iostat-parse.sh     %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/iostat-parse.sh
cp %{_buildrootdir}/iostat-zabbix.conf      %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/iostat-zabbix.conf
cp %{_buildrootdir}/zabbix_agentd       %{buildroot}/etc/init.d/zabbix_agentd
%files                                      #定义rpm包安装时创建的相关目录及文件。在该选项中%defattr (-,root,root)一定要注意。它是指定安装文件的属性,分别是(mode,owner,group),-表示默认值,对文本文件是0644,可执行文件是0755。
/etc/%{name}
/etc/%{name}-%{version}/*
/etc/init.d/zabbix_agentd
/etc/profile.d/%{name}.sh
%changelog                                  #主要用于软件的变更日志。该选项可有可无
%clean
rm -rf %{buildroot}                         #清理临时文件

RPM包制作拓展
如果想为zabbix增加启动控制脚本或一些其他的配置文件,可以将其放在SOURCE下,然后复制过去

  • 将启动脚本放在SOURCE目录
      [root@yang ~/rpmbuild/SOURCES]# ll
      total 15116
      -rwxr-xr-x 1 root root      362 Aug  1 12:03 hostmonitor.conf
      -rwxr-xr-x 1 root root      505 Aug  1 12:03 iostat-collect.sh
      -rwxr-xr-x 1 root root      953 Aug  1 12:03 iostat-parse.sh
      -rw-r--r-- 1 root root      772 Aug  1 12:03 iostat-zabbix.conf
      -rwxr-xr-x 1 root root      813 Aug  1 12:03 nginx_monitor.sh
      -rw-r--r-- 1 root root    14868 Aug  1 12:03 postgresql.conf
      -rw-r--r-- 1 root root       77 Aug  1 12:03 process.discovery
      -rw-r--r-- 1 root root      552 Aug  1 12:03 redis_check.conf
      -rw-r--r-- 1 root root      356 Aug  1 12:03 redis_cluster_check.py
      -rw-r--r-- 1 root root      363 Aug  1 12:03 redis_multiport_check.py
      -rwxr-xr-x 1 root root      783 Aug  1 12:03 tcp_connections.sh
      -rw-r--r-- 1 root root      852 Aug  1 12:03 userparameter_nginx.conf
      -rw-r--r-- 1 root root      172 Aug  1 12:03 userparameter_process.conf
      -rw-r--r-- 1 root root 15407273 Jul 20 10:53 zabbix-3.0.3.tar.gz
      -rwxr-xr-x 1 root root     2182 Aug  1 12:03 zabbix_agentd
  • 编辑 SPEC文件
    • Source0下增加如下:
        Source0:        zabbix-3.0.3.tar.gz
        Source1:        zabbix_agentd
        Source2:        nginx_monitor.sh
        Source3:        userparameter_nginx.conf
        Source4:        hostmonitor.conf
        Source5:        process.discovery
        Source6:        userparameter_process.conf
        Source7:        redis_check.conf
        Source8:        redis_cluster_check.py
        Source9:        redis_multiport_check.py
        Source10:       tcp_connections.sh
        Source11:       iostat-collect.sh
        Source12:       iostat-parse.sh
        Source13:       iostat-zabbix.conf
  • 安装区域增加如下行:
        make install DESTDIR=%{buildroot}
        install -p -D -m 0755 %{SOURCE1}        %{buildroot}/etc/init.d/zabbix_agentd
        install -p -D         %{SOURCE2}        %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/nginx_monitor.sh
        install -p -D         %{SOURCE3}        %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/userparameter_nginx.conf
        install -p -D         %{SOURCE4}        %{buildroot}/etc/nginx/conf.d/hostmonitor.conf
        install -p -D         %{SOURCE5}        %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/process.discovery
        install -p -D         %{SOURCE6}        %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/userparameter_process.conf
        install -p -D         %{SOURCE7}        %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/redis_check.conf
        install -p -D         %{SOURCE8}        %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/redis_cluster_check.py
        install -p -D         %{SOURCE9}        %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/redis_multiport_check.py
        install -p -D         %{SOURCE10}       %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/tcp_connections.sh
        install -p -D         %{SOURCE11}       %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/iostat-collect.sh
        install -p -D         %{SOURCE12}       %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/iostat-parse.sh
        install -p -D         %{SOURCE13}       %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/iostat-zabbix.conf
  • %file区域增加如下行:
        %files
        %defattr (-,root,root,0755)
        /etc/%{name}
        /etc/%{name}-%{version}/*
        /etc/profile.d/%{name}.sh
        /etc/nginx/conf.d/hostmonitor.conf
        %attr(0755,root,root) /etc/rc.d/init.d/zabbix_agentd

以下为完整的SPEC文件:

Name:   zabbix
Version:    3.0.3
Release:    1%{?dist}
Summary:    zabbix_agentd
Group:      zabbix
License:    GPL
URL:        www.yang.com
Source0:    zabbix-3.0.3.tar.gz
Source1:    zabbix_agentd
Source2:    nginx_monitor.sh
Source3:    userparameter_nginx.conf
Source4:    hostmonitor.conf
Source5:    process.discovery
Source6:    userparameter_process.conf
Source7:    redis_check.conf
Source8:    redis_cluster_check.py
Source9:    redis_multiport_check.py
Source10:   tcp_connections.sh
Source11:   iostat-collect.sh
Source12:   iostat-parse.sh
Source13:   iostat-zabbix.conf
BuildRequires:      gcc, gcc-c++
Requires:   gcc, gcc-c++, chkconfig
%description
Zabbix agentd 3.0.3
%pre
grep zabbix /etc/passwd > /dev/null
if [ $? != 0 ]
then useradd zabbix -M -s /sbin/nologin
fi
[ -d /etc/zabbix   ]||rm -rf /etc/zabbix
[ -d /etc/zabbix   ]||rm -rf /etc/zabbix-3.0.3
%post
sed -i "/^ServerActive=/c\ServerActive=172.30.17." /etc/zabbix/etc/zabbix_agentd.conf
sed -i "/^Server=/c\Server=172.30.17." /etc/zabbix/etc/zabbix_agentd.conf
sed -i "/Timeout=3/c\Timeout=30" /etc/zabbix/etc/zabbix_agentd.conf
sed -i "/HostMetadata=/c\HostMetadata=OPS-TMP" /etc/zabbix/etc/zabbix_agentd.conf
sed -i "/^Hostname=/c\Hostname=OPS-TMP" /etc/zabbix/etc/zabbix_agentd.conf
echo "UnsafeUserParameters=1" >>/etc/zabbix/etc/zabbix_agentd.conf
echo "EnableRemoteCommands=1" >>/etc/zabbix/etc/zabbix_agentd.conf
echo "Include=/etc/zabbix/etc/zabbix_agentd.conf.d/*.conf" >>/etc/zabbix/etc/zabbix_agentd.conf
chkconfig zabbix_agentd on
%preun
systemctl stop zabbix_agentd
%postun
userdel  zabbix
rm -rf /etc/zabbix*
%prep
%setup -q
%build
./configure --prefix=/etc/%{name}-%{version}   --enable-agent
make -j16 %{?_smp_mflags}
%install
test -L %{buildroot}/etc/%{name} && rm -f %{buildroot}/etc/%{name}
install -d %{buildroot}/etc/profile.d
make install DESTDIR=%{buildroot}
install -p -D -m 0755 %{SOURCE1}    %{buildroot}/etc/init.d/zabbix_agentd
install -p -D         %{SOURCE2}    %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/nginx_monitor.sh
install -p -D         %{SOURCE3}    %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/userparameter_nginx.conf
install -p -D         %{SOURCE4}    %{buildroot}/etc/nginx/conf.d/hostmonitor.conf
install -p -D         %{SOURCE5}    %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/process.discovery
install -p -D         %{SOURCE6}    %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/userparameter_process.conf
install -p -D         %{SOURCE7}    %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/redis_check.conf
install -p -D         %{SOURCE8}    %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/redis_cluster_check.py
install -p -D         %{SOURCE9}    %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/redis_multiport_check.py
install -p -D         %{SOURCE10}   %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/tcp_connections.sh
install -p -D         %{SOURCE11}   %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/iostat-collect.sh
install -p -D         %{SOURCE12}   %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/iostat-parse.sh
install -p -D         %{SOURCE13}       %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/iostat-zabbix.conf
echo 'export PATH=/etc/zabbix/bin:/etc/zabbix/sbin:$PATH' > %{buildroot}/etc/profile.d/%{name}.sh
ln -sf /etc/%{name}-%{version}          %{buildroot}/etc/%{name}
%files
%defattr (-,root,root,0755)
/etc/%{name}
/etc/%{name}-%{version}/*
/etc/profile.d/%{name}.sh
/etc/nginx/conf.d/hostmonitor.conf
%attr(0755,root,root) /etc/rc.d/init.d/zabbix_agentd
%changelog
%clean
rm -rf %{buildroot}

Linux服务器杀毒

一早到公司大家反映网速特别慢,还以为是哪个同事又忘了关迅雷了,果断登陆路由器准备封IP,结果让我震惊事情发生了,木有发现有很高上传的IP???对就是这么不科学.果断重启了各个路由器在观察,结果重启了好了!看来是路由器的问题.
但是,半个小时后,令人蛋疼的事情再次发生了,网络又开始慢的吐血,又开始了!这个时候我意识到可能是有人中了病毒.登陆路由器查找发包异常的IP,但是断了几个同事的网线后问题依旧不见好转,看来病毒伪装了IP和MAC地址,不容易找到!怎么办???
这个时候只能使用终极大招了,拔交换机!一片一片的断网,  查看问题出现在哪一片,最后断到机房的交换机后世界终于恢复清静了!
我意识到问题出在哪里了,当时开发需要在外网测试一个问题,我短暂的吧这台服务器映射到 了公网,果断断了这台服务器的网络,世界还是这么美好!
发现自己遇到的问题和这个问题类似!
博客地址:http://blog.csdn.net/yuanfeng78790/article/details/50639906
以下为原文
一、背景
晚上看到有台服务器流量跑的很高,明显和平常不一样,流量达到了800Mbps,第一感觉应该是中木马了,被人当做肉鸡了,在大量发包。
我们的服务器为了最好性能,防火墙(iptables)什么的都没有开启,但是服务器前面有物理防火墙,而且机器都是做的端口映射,也不是常见的端口,按理来说应该是满安全的,可能最近和木马有缘吧,老是让我遇到,也趁这次机会把发现过程记录一下。
二、发现并追踪处理
1、查看流量图发现问题
查看的时候网页非常卡,有的时候甚至没有响应。
wKiom1as-dyQlUCeAAFWXnyaceU258.png
2、top动态查看进程
我马上远程登录出问题的服务器,远程操作很卡,网卡出去的流量非常大,通过top发现了一个异常的进程占用资源比较高,名字不仔细看还真以为是一个Web服务进程。
wKioL1as-nOSab6eAACPx1Gw2qc060.png
3、ps命令查看进程的路径
发现这个程序文件在/etc目录下面,是个二进制程序,我拷贝了下来,放到了本文附近位置,以供大家在虚拟机上面研究,哈哈。
wKiom1as-k-TydDMAADaZz0UV1k116.png
4、结束异常进程并继续追踪
wKioL1a0Xt3Q4tCrAAAFpblEmnQ046.png
干掉进程之后,流量立刻下来了,远程也不卡顿了,难道删掉程序文件,干掉异常进程我们就认为处理完成了么?想想也肯定没那么简单的,这个是木马啊,肯定还会自己生成程序文件(果然不出我所料,在我没有搞清楚之前,后面确实又生成了)我们得继续追查。
5、查看登录记录及日志文件secure
通过命令last查看账户登录记录,一切正常。查看系统文件message并没有发现什么,但是当我查看secure文件的时候发现有些异常,反正是和认证有关的,应该是尝试连进来控制发包?
wKioL1as_jORDywFAAFogdyG4v8317.png
6、再次ps查看进程
其实第一次ps的时候就有这个问题,那时候没有发现,第二次是自习查看每个进程,自习寻找不太正常的进程,发现了一个奇怪的ps进程。
wKiom1as_uDj_cZWAAA1rhjR00k722.png
我找了一台正常的机器,查看了一下ps命令的大小,正常的大约是81KB,然后这台机器上面的ps却高达1.2M,命令文件肯定是被替换了。
wKioL1as_52wGvNHAAASrsFyr24589.png
然后进入另一个ps的目录,看到有如下几个命令,然后我有查询了一下系统的这几个命令,发现都变得很大,都达到了1.2M,这些系统命令文件肯定是都被替换了。
wKiom1as__TQk4K_AAAn0k9evMk278.png
7、更多异常文件的发现
查看定时任务文件crontab并没有发现什么一次,然后查看系统启动文件rc.local,也没有什么异常,然后进入/etc/init.d目录查看,发现比较奇怪的脚本文件DbSecuritySpt、selinux。
wKioL1atApfgw78ZAAB5n-v2zfM656.png
第一个文件可以看出他就是开机启动那个异常文件的,第二个应该和登录有关,具体我还不是很清楚,反正肯定是有问题的。
wKioL1atBB_gx4vbAAAivNZ8pRs292.png
既然和登录有关,那就找和ssh相关的,找到了下面的一个文件,是隐藏文件,这个也是木马文件,我们先记录下来,这样程序名字都和我们的服务名字很相近,就是为了迷惑我们,他们的大小都是1.2M,他们有可能是一个文件。
wKiom1atBQbz_CoYAAATGOPwJ50519.png
我有看了一下木马喜欢出现的目录/tmp,也发现了异常文件,从名字上感觉好像是监控木马程序的。
wKiom1atBnyg7i6dAACRJQNJKns664.png
想到这里,替换的命令应该很多,单靠我们去找肯定是解决不了的,我的建议最好是重装操作系统,并做好安全策略,如果不重装,我下面给一下我的方法,具体行不行有待验证。
三、木马手动清除
现在综合总结了大概步骤如下:
1、简单判断有无木马
wKioL1a0X1Oz6AO1AAAW70k_KhA559.png
2、上传如下命令到/root下
wKioL1a0X3vAPPTjAAADdBgQisU342.png
3、删除如下目录及文件
wKiom1a0X5Kw4Ra2AAAs8SOur0A089.png
4、找出异常程序并杀死
wKiom1au_5bTmDcwAADhJw0_ZTE611.png
5、删除含木马命令并重新安装(或者把上传的正常程序复制过去也行)
我自己重新安装好像不行,我是找的正常的机器复制的命令。
wKioL1a0YB2zCoZMAAAsdOvv1uE344.png
四、杀毒工具扫描
1、安装杀毒工具clamav
wKiom1a0X92waN26AAAFJMX6R60095.png
2、启动服务
wKiom1a0X_WQN_8oAAADxZKWxBk219.png
3、更新病毒库
由于ClamAV不是最新版本,所以有告警信息。可以忽略或升级最新版本。
wKiom1a0YAzDqLOlAABehHMhK3A276.png
4、扫描方法
wKioL1a0YIqRqOIXAAAOHknsIGU269.png
可以使用clamscan -h查看相应的帮助信息
5、查看日志发现
把发现的命令删掉替换正常的
wKioL1ato5WhI0v2AABTpf1Tq0I913.png
附录:Linux.BackDoor.Gates.5
经过查询资料,这个木马应该是Linux.BackDoor.Gates.5,找到一篇文件,内容具体如下:
某些用户有一种根深蒂固的观念,就是目前没有能够真正威胁Linux内核操作系统的恶意软件,然而这种观念正在面临越来越多的挑战。与4月相比,2014年5月Doctor Web公司的技术人员侦测到的Linux恶意软件数量创下了新纪录,六月份这些恶意软件名单中又增加了一系列新的Linux木马,这一新木马家族被命名为Linux.BackDoor.Gates。
在这里描述的是恶意软件家族Linux.BackDoor.Gates中的一个木马:Linux.BackDoor.Gates.5,此恶意软件结合了传统后门程序和DDoS攻击木马的功能,用于感染32位Linux版本,根据其特征可以断定,是与Linux.DnsAmp和Linux.DDoS家族木马同出于一个病毒编写者之手。新木马由两个功能模块构成:基本模块是能够执行不法分子所发指令的后门程序,第二个模块在安装过程中保存到硬盘,用于进行DDoS攻击。Linux.BackDoor.Gates.5在运行过程中收集并向不法分子转发受感染电脑的以下信息:

  • CPU核数(从/proc/cpuinfo读取)。
  • CPU速度(从/proc/cpuinfo读取)。
  • CPU使用(从/proc/stat读取)。
  • Gate’a的 IP(从/proc/net/route读取)。
  • Gate’a的MAC地址(从/proc/net/arp读取)。
  • 网络接口信息(从/proc/net/dev读取)。
  • 网络设备的MAC地址。
  • 内存(使用/proc/meminfo中的MemTotal参数)。
  • 发送和接收的数据量(从/proc/net/dev读取)。
  • 操作系统名称和版本(通过调用uname命令)。

启动后,Linux.BackDoor.Gates.5会检查其启动文件夹的路径,根据检查得到的结果实现四种行为模式。
如果后门程序的可执行文件的路径与netstat、lsof、ps工具的路径不一致,木马会伪装成守护程序在系统中启动,然后进行初始化,在初始化过程中解压配置文件。配置文件包含木马运行所必须的各种数据,如管理服务器IP地址和端口、后门程序安装参数等。
根据配置文件中的g_iGatsIsFx参数值,木马或主动连接管理服务器,或等待连接:成功安装后,后门程序会检测与其连接的站点的IP地址,之后将站点作为命令服务器。
木马在安装过程中检查文件/tmp/moni.lock,如果该文件不为空,则读取其中的数据(PID进程)并“干掉”该ID进程。然后Linux.BackDoor.Gates.5会检查系统中是否启动了DDoS模块和后门程序自有进程(如果已启动,这些进程同样会被“干掉”)。如果配置文件中设置有专门的标志g_iIsService,木马通过在文件/etc/init.d/中写入命令行#!/bin/bash\n<path_to_backdoor>将自己设为自启动,然后Linux.BackDoor.Gates.5创建下列符号链接:
 
wKioL1a0YJ_wjWEgAAALpf6u8w0676.png    如果在配置文件中设置有标志g_bDoBackdoor,木马同样会试图打开/root/.profile文件,检查其进程是否有root权限。然后后门程序将自己复制到/usr/bin/bsd-port/getty中并启动。在安装的最后阶段,Linux.BackDoor.Gates.5在文件夹/usr/bin/再次创建一个副本,命名为配置文件中设置的相应名称,并取代下列工具:
wKiom1a0YGCQ8Ss3AAAKnRyqw5o683.png
木马以此完成安装,并开始调用基本功能。
执行另外两种算法时木马同样会伪装成守护进程在被感染电脑启动,检查其组件是否通过读取相应的.lock文件启动(如果未启动,则启动组件),但在保存文件和注册自启动时使用不同的名称。
与命令服务器设置连接后,Linux.BackDoor.Gates.5接收来自服务器的配置数据和僵尸电脑需完成的命令。按照不法分子的指令,木马能够实现自动更新,对指定IP地址和端口的远程站点发起或停止DDoS攻击,执行配置数据所包含的命令或通过与指定IP地址的远程站点建立连接来执行其他命令。
此后门程序的主要DDoS攻击目标是中国的服务器,然而不法分子攻击对象也包括其他国家。下图为利用此木马进行的DDoS攻击的地理分布:
wKiom1atDxbAPpm7AAGEMXS_d8w613.png

ssh 免密码登录

ssh 无密码登录要使用公钥与私钥。linux下可以用用ssh-keygen生成公钥/私钥对,下面我以CentOS为例。
有机器A(192.168.1.155),B(192.168.1.181)。现想A通过ssh免密码登录到B。
1.在A机下生成公钥/私钥对。

[chenlb@A ~]$ ssh-keygen -t rsa -P ”

-P表示密码,-P ” 就表示空密码,也可以不用-P参数,这样就要三车回车,用-P就一次回车。
它在/home/chenlb下生成.ssh目录,.ssh下有id_rsa和id_rsa.pub。
2.把A机下的id_rsa.pub复制到B机下,在B机的.ssh/authorized_keys文件里,我用scp复制。

[chenlb@A ~]$ scp .ssh/id_rsa.pub chenlb@192.168.1.181:/home/chenlb/id_rsa.pub
chenlb@192.168.1.181’s password:
id_rsa.pub                                    100%  223     0.2KB/s   00:00

由于还没有免密码登录的,所以要输入密码。
3.B机把从A机复制的id_rsa.pub添加到.ssh/authorzied_keys (打错了,使用下面的代码块)文件里。

[chenlb@B ~]$ cat id_rsa.pub >> .ssh/authorized_keys
[chenlb@B ~]$ chmod 600 .ssh/authorized_keys

authorized_keys的权限要是600
4.A机登录B机。

[chenlb@A ~]$ ssh 192.168.1.181
The authenticity of host ‘192.168.1.181 (192.168.1.181)’ can’t be established.
RSA key fingerprint is 00:a6:a8:87:eb:c7:40:10:39:cc:a0:eb:50:d9:6a:5b.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added ‘192.168.1.181’ (RSA) to the list of known hosts.
Last login: Thu Jul  3 09:53:18 2008 from chenlb
[chenlb@B ~]$

第一次登录是时要你输入yes。
现在A机可以无密码登录B机了。
小结:登录的机子可有私钥,被登录的机子要有登录机子的公钥。这个公钥/私钥对一般在私钥宿主机产生。上面是用rsa算法的公钥/私钥对,当然也可以用dsa(对应的文件是id_dsa,id_dsa.pub)
想让A,B机无密码互登录,那B机以上面同样的方式配置即可。

Linux定时任务Crontab

linux 系统则是由 cron (crond) 这个系统服务来控制的。Linux 系统上面原本就有非常多的计划性工作,因此这个系统服务是默认启动的。另 外, 由于使用者自己也可以设置计划任务,所以, Linux 系统也提供了使用者控制计划任务的命令 :crontab 命令。
一、cron服务
cron是一个linux下 的定时执行工具,可以在无需人工干预的情况下运行作业。
service crond start    //启动服务
service crond stop     //关闭服务
service crond restart  //重启服务
service crond reload   //重新载入配置
service crond status   //查看服务状态
查看crontab服务是否已设置为开机启动,执行命令:
ntsysv
加入开机自动启动:
chkconfig –level 35 crond on
 
二、cron服务怎么使用
1.命令格式:
crontab [-u user] file
crontab [-u user] [ -e | -l | -r ]
2.命令功能:
通过crontab 命令,我们可以在固定的间隔时间执行指定的系统指令或 shell script脚本。时间间隔的单位可以是分钟、小时、日、月、周及以上的任意组合。这个命令非常设合周期性的日志分析或数据备份等工作。
3.命令参数:
-u user:用来设定某个用户的crontab服务,例如,“-u ixdba”表示设定ixdba用户的crontab服务,此参数一般有root用户来运行。
file:file是命令文件的名字,表示将file做为crontab的任务列表文件并载入crontab。如果在命令行中没有指定这个文件,crontab命令将接受标准输入(键盘)上键入的命令,并将它们载入crontab。
-e:编辑某个用户的crontab文件内容。如果不指定用户,则表示编辑当前用户的crontab文件。
-l:显示某个用户的crontab文件内容,如果不指定用户,则表示显示当前用户的crontab文件内容。
-r:从/var/spool/cron目录中删除某个用户的crontab文件,如果不指定用户,则默认删除当前用户的crontab文件。
-i:在删除用户的crontab文件时给确认提示。
 
crontab文件的内容的含义:
用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下:
minute hour day month week command
其中:
minute: 表示分钟,可以是从0到59之间的任何整数。
hour:表示小时,可以是从0到23之间的任何整数。
day:表示日期,可以是从1到31之间的任何整数。
month:表示月份,可以是从1到12之间的任何整数。
week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。
command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。

在以上各个字段中,还可以使用以下特殊字符:
星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。
逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”
中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”
正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。
 
 
三、cron服务日志怎么看
文件位置
/var/spool/cron/
日志文件位置
/var/log
#ls /var/log/cron*
错误日志
当crond执行任务失败时会给用户发一封邮件
可以将每条crontab中的任务增加自己的日志,便于查找执行失败原因。
eg:6 * * * * /home/stack/test.sh >>/mylog.log 2>&1检查crontab服务状态
 
 

Cloudera Manager 5和CDH5离线安装

CDH (Cloudera’s Distribution, including Apache Hadoop),是Hadoop众多分支中的一种,由Cloudera维护,基于稳定版本的Apache Hadoop构建,并集成了很多补丁,可直接用于生产环境。
Cloudera Manager则是为了便于在集群中进行Hadoop等大数据处理相关的服务安装和监控管理的组件,对集群中主机、Hadoop、Hive、Spark等服务的安装配置管理做了极大简化。
相关包的下载地址:
Cloudera Manager地址:http://archive.cloudera.com/cm5/cm/5/
CDH安装包地址:http://archive.cloudera.com/cdh5/parcels/latest/
由于我们的操作系统为CentOS6.5,需要下载以下文件:
CDH-5.3.3-1.cdh5.3.3.p0.5-el6.parcel
CDH-5.3.3-1.cdh5.3.3.p0.5-el6.parcel.sha1
manifest.json
JDBC:http://download.softagency.net/MySQL/Downloads/Connector-J/

准备工作:系统环境搭建(阿里云平台)

以下操作均需要(root)管理员权限
1.网络配置(所有节点)
修改主机名:vim /etc/sysconfig/network

NETWORKING=yes
HOSTNAME=cdh1
NETWORKING_IPV6=no
PEERNTP=no

通过service network restart重启网络服务
修改ip与主机名的对应关系:vim /etc/hosts

192.168.1.101   cdh1
192.168.1.102   cdh2
192.168.1.103   cdh3

2.打通SSH,设置ssh无密码登陆(所有节点)
执行ssh-keygen -t rsa,一路回车,生成无密码的密钥对。
将公钥添加到认证文件中:cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys,并设置authorized_keys的访问权限:chmod 600 ~/.ssh/authorized_keys
通过scp命令将各节点的认证文件拷贝到所有其他节点使得各节点能够相互访问。
3.安装Oracle的Java(所有节点)
CentOS自带OpenJdk,不过运行CDH5需要使用Oracle的JDK,需要Java 7的支持。
卸载自带的OpenJdk,使用rpm -qa | grep java查询java相关的包,使用rpm -e --nodeps 包名卸载之。
去Oracle的官网下载jdk的rpm安装包,并使用rpm -ivh 包名安装,最后配置环境变量。
4.安装配置MySql(主节点)
通过yum install mysql-server安装mysql服务器。chkconfig mysqld on设置开机启动,并service mysqld start启动mysql服务,并根据提示设置root的初试密码:mysqladmin -u root password 'xxxx'
mysql -uroot -pxxxx进入mysql命令行,创建以下数据库:

#hive
create database hive DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
#activity monitor
create database amon DEFAULT CHARSET utf8 COLLATE utf8_general_ci;

设置root授权访问以上所有的数据库:

#授权root用户在主节点拥有所有数据库的访问权限
grant all privileges on *.* to 'root'@'cdh1' identified by 'xxxx' with grant option;flush privileges;

5.关闭防火墙和SELinux
注意: 需要在所有的节点上执行,因为涉及到的端口太多了,临时关闭防火墙是为了安装起来更方便,安装完毕后可以根据需要设置防火墙策略,保证集群安全。
关闭防火墙:

service iptables stop (临时关闭)
chkconfig iptables off (重启后生效)

关闭SELINUX(实际安装过程中发现没有关闭也是可以的,不知道会不会有问题,还需进一步进行验证):

setenforce 0 (临时生效)
修改 /etc/selinux/config 下的 SELINUX=disabled (重启后永久生效)

6.所有节点配置NTP服务
集群中所有主机必须保持时间同步,如果时间相差较大会引起各种问题。 具体思路如下:
master节点作为ntp服务器与外界对时中心同步时间,随后对所有datanode节点提供时间同步服务。
所有datanode节点以master节点为基础同步时间。
所有节点安装相关组件:yum install ntp。完成后,配置开机启动:chkconfig ntpd on,检查是否设置成功:chkconfig --list ntpd其中2-5为on状态就代表成功。
主节点配置
在配置之前,先使用ntpdate手动同步一下时间,免得本机与对时中心时间差距太大,使得ntpd不能正常同步。这里选用65.55.56.206作为对时中心,ntpdate -u 65.55.56.206
ntp服务只有一个配置文件,配置好了就OK。 这里只给出有用的配置,不需要的配置都用#注掉,这里就不在给出:

driftfile /var/lib/ntp/drift
restrict 127.0.0.1restrict -6 ::1
restrict default nomodify notrap
server 65.55.56.206 prefer
includefile /etc/ntp/crypto/pw
keys /etc/ntp/keys

配置文件完成,保存退出,启动服务,执行如下命令:service ntpd start
检查是否成功,用ntpstat命令查看同步状态,出现以下状态代表启动成功:

synchronised to NTP server () at stratum 2time correct to within 74 mspolling server every 128 s

如果出现异常请等待几分钟,一般等待5-10分钟才能同步。
配置ntp客户端(所有datanode节点)

driftfile /var/lib/ntp/drift
restrict 127.0.0.1
restrict -6 ::1
restrict default kod nomodify notrap nopeer noquery
restrict -6 default kod nomodify notrap nopeer noquery
#这里是主节点的主机名或者ip
server cdh1
includefile /etc/ntp/crypto/pw
keys /etc/ntp/keys

ok保存退出,请求服务器前,请先使用ntpdate手动同步一下时间:ntpdate -u cdh1 (主节点ntp服务器)
这里可能出现同步失败的情况,请不要着急,一般是本地的ntp服务器还没有正常启动,一般需要等待5-10分钟才可以正常同步。启动服务:service ntpd start
因为是连接内网,这次启动等待的时间会比master节点快一些,但是也需要耐心等待一会儿。

正式开工

安装Cloudera Manager Server 和Agent
主节点解压安装
cloudera manager的目录默认位置在/opt下,解压:tar xzvf cloudera-manager*.tar.gz将解压后的cm-5.3.3和cloudera目录放到/opt目录下。
为Cloudera Manager 5建立数据库
首先需要去MySql的官网下载JDBC驱动,http://dev.mysql.com/downloads/connector/j/,解压后,找到mysql-connector-java-5.1.35-bin.jar,放到/opt/cm-5.3.3/share/cmf/lib/中。
在主节点初始化CM5的数据库:

/opt/cm-5.3.3/share/cmf/schema/scm_prepare_database.sh mysql cm -hlocalhost -uroot -pxxxx --scm-host localhost scm scm scm

Agent配置
修改/opt/cm-5.3.3/etc/cloudera-scm-agent/config.ini中的server_host为主节点的主机名。
同步Agent到其他节点

scp -r /opt/cm-5.3.3 root@n2:/opt/

在所有节点创建cloudera-scm用户

useradd --system --home=/opt/cm-5.3.3/run/cloudera-scm-server/ --no-create-home --shell=/bin/false --comment "Cloudera SCM User" cloudera-scm

准备Parcels,用以安装CDH5
将CHD5相关的Parcel包放到主节点的/opt/cloudera/parcel-repo/目录中(parcel-repo需要手动创建)。
相关的文件如下:

CDH-5.3.3-1.cdh5.3.3.p0.5-el6.parcel
CDH-5.3.3-1.cdh5.3.3.p0.5-el6.parcel.sha1
manifest.json

最后将CDH-5.3.3-1.cdh5.3.3.p0.5-el6.parcel.sha1,重命名为CDH-5.3.3-1.cdh5.3.3.p0.5-el6.parcel.sha,这点必须注意,否则,系统会重新下载CDH-5.3.3-1.cdh5.3.3.p0.5-el6.parcel.sha1文件。
相关启动脚本
通过/opt/cm-5.3.3/etc/init.d/cloudera-scm-server start启动服务端。
通过/opt/cm-5.3.3/etc/init.d/cloudera-scm-agent start启动Agent服务。
我们启动的其实是个service脚本,需要停止服务将以上的start参数改为stop就可以了,重启是restart。
CDH5的安装配置
Cloudera Manager Server和Agent都启动以后,就可以进行CDH5的安装配置了。
这时可以通过浏览器访问主节点的7180端口测试一下了(由于CM Server的启动需要花点时间,这里可能要等待一会才能访问),默认的用户名和密码均为admin:
这里写图片描述
这里写图片描述
这里写图片描述
各个Agent节点正常启动后,可以在当前管理的主机列表中看到对应的节点。选择要安装的节点,点继续。
这里写图片描述
接下来,出现以下包名,说明本地Parcel包配置无误,直接点继续就可以了。
这里写图片描述
点击,继续,如果配置本地Parcel包无误,那么下图中的已下载,应该是瞬间就完成了,然后就是耐心等待分配过程就行了。
这里写图片描述
接下来是服务器检查,可能会遇到以下问题:
Cloudera 建议将 /proc/sys/vm/swappiness 设置为 0。当前设置为 60。使用 sysctl 命令在运行时更改该设置并编辑 /etc/sysctl.conf 以在重启后保存该设置。您可以继续进行安装,但可能会遇到问题,Cloudera Manager 报告您的主机由于交换运行状况不佳。以下主机受到影响:
通过echo 0 > /proc/sys/vm/swappiness即可解决。
这里写图片描述
接下来是选择安装服务:
这里写图片描述
服务配置,一般情况下保持默认就可以了(Cloudera Manager会根据机器的配置自动进行配置,如果需要特殊调整,自行进行设置就可以了):
这里写图片描述
接下来是数据库的设置,检查通过后就可以进行下一步的操作了:
这里写图片描述
下面是集群设置的审查页面,全部保持默认配置即可:
这里写图片描述
终于到安装各个服务的地方了,注意,这里安装Hive的时候可能会报错,因为我们使用了MySql作为hive的元数据存储,hive默认没有带mysql的驱动,通过以下命令拷贝一个就行了:

cp /opt/cm-5.3.3/share/cmf/lib/mysql-connector-java-5.1.35-bin.jar /opt/cloudera/parcels/CDH-5.3.3-1.cdh5.3.3.p0.5-el6.parcel/lib/hive/lib/

这里写图片描述
接下静静地等待即可。
这里写图片描述
安装完成后,就可以进入集群界面看一下集群的当前状况了。
这里可能会出现无法发出查询:对 Service Monitor 的请求超时的错误提示,如果各个组件安装没有问题,一般是因为服务器比较卡导致的,过一会刷新一下页面就好了:
这里写图片描述