Fork me on GitHub
随笔 - 183  文章 - 10  trackbacks - 0
<2017年12月>
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456


专注即时通讯及网游服务端编程
------------------------------------
本博收藏大部分文章为转载,并在文章开头给出了原文出处,如有再转,敬请保留相关信息,这是大家对原创作者劳动成果的自觉尊重!!如为您带来不便,请于本博下留言,谢谢配合。

常用链接

留言簿

随笔分类

随笔档案

相册

Awesome

Blog

Book

GitHub

Link

搜索

  •  

积分与排名

  • 积分 - 32454
  • 排名 - 510

最新评论

阅读排行榜

http://blog.chinaunix.net/uid-17291169-id-5212576.html

公司部分业务放在阿里云上面,虽然阿里云管理平台本身有自己的监控后台,但是公司也有自己独立的zabbix监控系统,目前要做的就是把阿里云的监控转移到自己公司的监控系统,需要使用到阿里云的API,API的使用分以下2种方式

1.使用阿里云的Python SDK(python2.7),具体参考http://develop.aliyun.com/sdk/python?spm=5176.100054.0.0.tcU93U,示例代码:

#!/usr/local/bin/bin/python2.7
#
coding:utf-8

from aliyunsdkcore import client
from aliyunsdkrds.request.v20140815 import DescribeRegionsRequest

clt 
= client.AcsClient('access_key','access_secret','cn-hangzhou')
request
=DescribeRegionsRequest.DescribeRegionsRequest()
request.set_accept_format(
'json')
#request.set_action_name("DescribeDBInstancePerformance")
request.set_action_name("DescribeResourceUsage")
#request.set_query_params(dict(DBInstanceId="rdsid",key="MySQL_NetworkTraffic",StartTime="2015-10-13T15:00Z",EndTime="2015-10-14T15:00Z"))
request.set_query_params(dict(DBInstanceId="rdsid",StartTime="2015-10-13T15:00Z",EndTime="2015-10-14T15:00Z"))
print(clt.do_action(request))


2.使用原生的API,示例代码:

 

#!/usr/bin/python
#
coding:utf-8

tryimport httplib
except ImportError:
    
import http.client as httplib
import sys
import urllib
import urllib2
import time
import json
import itertools
import mimetypes
import base64
import hmac
import uuid
from hashlib import sha1

 


class AliyunMonitor:


    
def __init__(self,url):
        self.access_id 
= 'access_id'
        self.access_secret 
= 'access_secret'
        self.url 
= url
    
##签名
    def sign(self,accessKeySecret, parameters):
        sortedParameters 
= sorted(parameters.items(), key=lambda parameters: parameters[0])
        canonicalizedQueryString 
= ''
        
for (k,v) in sortedParameters:
            canonicalizedQueryString 
+= '&' + self.percent_encode(k) + '=' + self.percent_encode(v)

        stringToSign 
= 'GET&%2F&' + self.percent_encode(canonicalizedQueryString[1:]) #使用get请求方法

        h 
= hmac.new(accessKeySecret + "&", stringToSign, sha1)
        signature 
= base64.encodestring(h.digest()).strip()
        
return signature

    
def percent_encode(self,encodeStr):
        encodeStr 
= str(encodeStr)
        res 
= urllib.quote(encodeStr.decode(sys.stdin.encoding).encode('utf8'), '')
        res 
= res.replace('+''%20')
        res 
= res.replace('*''%2A')
        res 
= res.replace('%7E''~')
        
return res

    
def make_url(self,params):
        timestamp 
= time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime())
        parameters 
= {
            
'Format' : 'JSON',
            
'Version' : '2014-08-15',
            
'AccessKeyId' : self.access_id,
            
'SignatureVersion' : '1.0',
            
'SignatureMethod' : 'HMAC-SHA1',
            
'SignatureNonce' : str(uuid.uuid1()),
            
'TimeStamp' : timestamp,
        }
        
for key in params.keys():
            parameters[key] 
= params[key]

        signature 
= self.sign(self.access_secret,parameters)
        parameters[
'Signature'= signature
        url 
= self.url + "/?" + urllib.urlencode(parameters)
        
return url

    
def do_request(self,params):
        url 
= self.make_url(params)
        
print(url)
        request 
= urllib2.Request(url)
        
try:
            conn 
= urllib2.urlopen(request)
            response 
= conn.read()
        
except urllib2.HTTPError, e:
            
print(e.read().strip())
            
raise SystemExit(e)
        
try:
            obj 
= json.loads(response)
        
except ValueError, e:
            
raise SystemExit(e)
        
print obj

if __name__ == "__main__":
    T 
= AliyunMonitor("https://rds.aliyuncs.com")
    T.do_request({
"key":"MySQL_NetworkTraffic","Action":"DescribeDBInstancePerformance","DBInstanceId":"rds_id","StartTime":"2015-10-13T15:00Z","EndTime":"2015-10-14T15:00Z"})


注意事项:确保运行脚本的主机时区时间无误(yum install ntpdate  && ntpdate  time.windows.com)


=========================阿里云相关文档参考===========================

阿里云API文档:https://develop.aliyun.com/
点击【创建/管理 Acccesskey】
通过【访问控制(Resource Access Management)】产品获得【受限的】AcccessKey和AccessSecret,以用于后续API调用
https://www.aliyun.com/product/ram?spm=5176.doc28636.2.2.4DV89b

阿里云SDK下载(Python):
https://develop.aliyun.com/sdk/python?spm=5176.7926450.210367.2.x1p7Zk
还有其他版本SDK的下载
Python SDK安装:
https://zhidao.baidu.com/question/544414713.html

查询实例列表:
https://help.aliyun.com/document_detail/25506.html?spm=0.0.0.0.QjVZTI
查询伸缩组内实例列表:
https://help.aliyun.com/document_detail/25942.html?spm=0.0.0.0.IeaTQA

相关笔记:《Ansible+SVN 自动部署》(解决弹性伸缩工作中不定数目的ECS实例更新部署问题)
http://www.cppblog.com/kenkao/archive/2017/03/01/214717.html

监控与自动化部署:(解决ECS实例新弹出时的自动部署问题)
PS:如果--level 6不生效,则可以执行chkconfig test on开启全部等级(测试中,弊端不明...)
PS:前面我的说明有一个地方不太严谨,大多数情况下都配置35,很少有配置4的。(来自阿里售后工程师

https://help.aliyun.com/document_detail/25971.html?spm=0.0.0.0.QjVZTI

弹性伸缩在使用报警任务之前,需要在ECS的镜像里安装新版本的云监控程序
https://help.aliyun.com/knowledge_detail/38830.html

关于弹性伸缩自动创建实例的密码与登录问题:
创建云主机的时候,主机密码都不是自定义镜像中的密码。为了保证密码的安全性,推荐您通过设置”公私钥”认证的方式来进行SSH免密码登录。
如果您不需要通过设置”公私钥”认证的方式来进行SSH免密码登录,则需要在控制台重置密码(重启生效)才能登录。

配置Linux主机SSH无密码访问:
# 在master上生成密钥对
#
 ssh-keygen
#
 通过ssh-copy-id下发公钥到servant镜像
#
 ssh-copy-id -i /root/.ssh/id_rsa.pub root@servanthost
#
 <输入root@servanthost口令>
#
 尝试无密码登录
#
 ssh root@servanthost
以servant镜像为蓝本创建的弹性ECS实例,皆可在master上无密码登录

相关笔记:《阿里云ECS服务器搭建Nginx+PHP+MySql环境详细步骤(CentOS7环境)》
http://blog.csdn.net/kenkao/article/details/53333595

Ecs部署:
master servant(镜像)
1.安装svn 1.安装svn svn拉取部署
2.安装ansible 运维工具搭建
3.生成密钥对 3.下发得到公钥 无密码访问
4.nginx+php环境搭建 基本服务环境
5.部署脚本 5.部署自启脚本并开启 自动运维脚本
6.nginx调优 运行环境调优

SVN及Ansible安装:
http://blog.chinaunix.net/uid-21146222-id-5761320.html
http://blog.chinaunix.net/uid-21146222-id-5757647.html

相关笔记:
阿里云自定义监控的使用》(关注其中python脚本部分)
《通过crontab为linux添加定时任务》http://blog.chinaunix.net/uid-21146222-id-4326110.html
总结:
可以直接 vim /etc/crontab ,并添加类似 */1 * * * * root /home/scripts/report.sh 的定时任务,与 crontab -e 的区别在于需要显示指定所属用户 root
/sbin/service crond restart 重启crond服务
tail -f /var/log/cron 动态查看crond日志

关于《阿里云自动告警》机制中遇到的坑:(crontab定时执行python的坑)
https://bbs.aliyun.com/read.php?tid=135851&page=1
http://blog.bomobox.org/2016-10-06/crontab-python/
http://blog.csdn.net/shanliangliuxing/article/details/7980298
总结:
通过crontab定时执行python脚本失败的根本原因在于crontab的运行时环境有别于root用户的python环境
解决方法:
1. 编写shell脚本挂载python脚本,而后crontab定时执行shell脚本(crontab对于shell脚本拥有更好的亲和力
2. 编辑/etc/hosts文件,把::1条目注释掉(解决ipv6冲突问题,该步骤是否必须有待考证..)

关于解决shell脚本正常执行,但是crontab执行失败的土办法:先cd到相关目录下,在./执行相关命令行。例如:
/home/loganalysis/dealexcel.sh
修改为
cd /home/loganalysis/ && ./dealexcel.sh
参考:http://blog.csdn.net/jkunzhang/article/details/7440215


附件下载:
>> xxxxansible.zip
>> xxxxwarning.zip
posted on 2017-03-28 11:29 思月行云 阅读(163) 评论(0)  编辑 收藏 引用 所属分类: Python服务器\Ops

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理