运维开发入门记录

 

后来 找了小半下午,python+salt 就能够搞定。node

很少废话 直接开搞:python

思路以下 ,直接画图:mysql

架构草图linux

 

下来这个是基本拓扑:ios

 

 




这是一个 用python实现 调用salt的实例,具体思路是这样的
salt 咱们介绍一下吧,简单点的,好了咱们来看这玩意干吗的
SALTSTACK

Salt, a new approach to infrastructure management, is easy enough to get running in minutes, scalable enough to manage tens of thousands of servers, and fast enough to communicate with those servers in seconds.

Salt delivers a dynamic communication bus for infrastructures that can be used for orchestration, remote execution, configuration management and much more.
大概意思是
salt一种新的基础设施管理的方法,是很容易获得运行在几分钟内,可扩展到管理成千上万的服务器,并快速足够的沟通与这些服务器在几秒钟。
salt提供了一个动态的通讯总线的基础设施,可用于业务流程,远程执行,配置管理和更多......。

那咱们先来安装salt  
安装很简单 ,楼主是virtualBOX创建两个虚拟机装有linux centos6.5 ,装master 和mini  就是主控制机器 和被控制机器,对没错是被控制哦,SM 嘻嘻嘻嘻~咱们想干吗干吗的那种 滴蜡 小皮鞭什么的。
虚拟机两台,saltmaster 10.219.25.241 
                     minion 10.219.25.242nginx

 

下面是安装脚本
master:redis

#!/usr/bin/bash
cd /usr/local/src/;
wget http://mirrors.sohu.com/fedora-epel/6/x86_64/epel-release-6-8.noarch.rpm;
rpm -ivh epel-release-6-8.noarch.rpm;
wget http://apt.sw.be/redhat/el6/en/x86_64/rpmforge/RPMS/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm;
rpm -ivh rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm;
yum install python-jinja2;
yum -y install salt-master enablerepr=epel-testing;

minion:sql

#!/usr/bin/bash
cd /usr/local/src/;
wget http://mirrors.sohu.com/fedora-epel/6/x86_64/epel-release-6-8.noarch.rpm;
rpm -ivh epel-release-6-8.noarch.rpm;
wget http://apt.sw.be/redhat/el6/en/x86_64/rpmforge/RPMS/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm;
rpm -ivh rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm;
yum install python-jinja2;
yum -y install salt-minion enablerepr=epel-testing;

装完改配置,*注意空格:shell

Masterjson

vim /etc/salt/master
# The address of the interface to bind to:
  interface: 10.219.25.241

mini

vim /etc/salt/minion
# resolved, then the minion will fail to start.
master: 10.219.25.241

关闭两台机器防火墙

/etc/init.d/iptables stop

启动两台机器的salt服务

master:

/etc/init.d/salt-master start

mini:

/etc/init.d/salt-minion start

先发证书:

[root@salt-master ~]# salt-key -L
Accepted Keys:
salt-master   //这里是娶回家的
slave01  
slave02
Denied Keys:
Unaccepted Keys:  //这里是小情人  要接进来的 
Rejected Keys:

 

接受证书:

[root@salt-master ~]# salt-key -A 
点Y  回车

测试下能够调教了不,先来么么哒:

[root@salt-master ~]# salt \* test.ping
slave02:
    True
slave01:
    True

OK没问题

接下来是重头戏
salt 是python写的 提供了api调用
咱们装上salt api
比较简单

*这里只须要在master端安装:

yum -y install salt-api

进入python 注意 这里python是2.6.6的:[centos6.5 redhat6.5 默认安装2.6.6python  ubuntu 为python2.7]

作个简单的测试,执行cmd.run没有问题,返回结果是dict字典

>>> import salt.client
>>> local = salt.client.LocalClient()
>>> local.cmd('*','cmd.run',['whoami'])
{'slave01': 'root'}

咱们获取静态信息试试:

>>> local.cmd('*','grains.items',)
{'slave01': {'biosversion': 'VirtualBox', 'kernel': 'Linux', 'domain': '', 'zmqversion': '3.2.5', 'kernelrelease': '2.6.32-431.el6.x86_64', 'selinux': {'enforced': 'Enforcing', 'enabled': True}, 'serialnumber': '0', 'ip_interfaces': {'lo': ['127.0.0.1', '::1'], 'eth1': ['10.219.25.242', 'fe80::a00:27ff:fe8b:263e']}, 'shell': '/bin/bash', 'mem_total': 996, 'saltversioninfo': [2015, 5, 8, 0], 'host': 'slave01', 'SSDs': [], 'mdadm': [], 'id': 'slave01', 'osrelease': '6.5', 'ps': 'ps -efH', 'server_id': 1039472111, 'ip6_interfaces': {'lo': ['::1'], 'eth1': ['fe80::a00:27ff:fe8b:263e']}, 'num_cpus': 1, 'hwaddr_interfaces': {'lo': '00:00:00:00:00:00', 'eth1': '08:00:27:8b:26:3e'}, 'init': 'upstart', 'ip4_interfaces': {'lo': ['127.0.0.1'], 'eth1': ['10.219.25.242']}, 'osfullname': 'CentOS', 'master': '10.219.25.241', 'ipv4': ['10.219.25.242', '127.0.0.1'], 'ipv6': ['::1', 'fe80::a00:27ff:fe8b:263e'], 'cpu_flags': ['fpu', 'vme', 'de', 'pse', 'tsc', 'msr', 'pae', 'mce', 'cx8', 'apic', 'sep', 'mtrr', 'pge', 'mca', 'cmov', 'pat', 'pse36', 'clflush', 'mmx', 'fxsr', 'sse', 'sse2', 'syscall', 'nx', 'rdtscp', 'lm', 'constant_tsc', 'up', 'rep_good', 'xtopology', 'nonstop_tsc', 'unfair_spinlock', 'pni', 'pclmulqdq', 'monitor', 'ssse3', 'cx16', 'sse4_1', 'sse4_2', 'movbe', 'popcnt', 'aes', 'xsave', 'avx', 'rdrand', 'hypervisor', 'lahf_lm', 'abm'], 'localhost': 'slave01', 'lsb_distrib_id': 'CentOS', 'fqdn_ip4': [], 'fqdn_ip6': [], 'nodename': 'slave01', 'saltversion': '2015.5.8', 'lsb_distrib_release': '6.5', 'pythonpath': ['/usr/bin', '/usr/lib64/python26.zip', '/usr/lib64/python2.6', '/usr/lib64/python2.6/plat-linux2', '/usr/lib64/python2.6/lib-tk', '/usr/lib64/python2.6/lib-old', '/usr/lib64/python2.6/lib-dynload', '/usr/lib64/python2.6/site-packages', '/usr/lib/python2.6/site-packages', '/usr/lib/python2.6/site-packages/setuptools-0.6c11-py2.6.egg-info'], 'saltpath': '/usr/lib/python2.6/site-packages/salt', 'pythonversion': [2, 6, 6, 'final', 0], 'osmajorrelease': '6', 'os_family': 'RedHat', 'oscodename': 'Final', 'osfinger': 'CentOS-6', 'biosreleasedate': '12/01/2006', 'manufacturer': 'innotek GmbH', 'num_gpus': 1, 'virtual': 'VirtualBox', 'cpu_model': 'Intel(R) Core(TM) i5-4200H CPU @ 2.80GHz', 'fqdn': 'slave01', 'pythonexecutable': '/usr/bin/python2.6', 'productname': 'VirtualBox', 'osarch': 'x86_64', 'cpuarch': 'x86_64', 'lsb_distrib_codename': 'Final', 'osrelease_info': [6, 5], 'locale_info': {'detectedencoding': 'UTF-8', 'defaultlanguage': 'en_US', 'defaultencoding': 'UTF8'}, 'gpus': [{'model': 'VirtualBox Graphics Adapter', 'vendor': 'unknown'}], 'path': '/sbin:/usr/sbin:/bin:/usr/bin', 'machine_id': 'c208c39c323edb1ac57c14a50000000b', 'os': 'CentOS'}}

 

返回字典python操做方法

radiansdict.values()
以列表返回字典中的全部值
radiansdict.keys()
以列表返回一个字典全部的键

这是百度到别人处理这类字符串 整合为表格的代码对我启发很大:

#coding=utf-8
import salt.client as sc
import json
###salt调用
local = sc.LocalClient()
###目标主机指定
tgt = "*"
###获取grains,disk信息
grains = local.cmd(tgt,"grains.items")
diskusage = local.cmd(tgt,"disk.usage")
###主要应用列表即文件开头
app_name = ["tomcat","zookeeper","redis","mysql","nginx"]
cols = "主机名,IP地址,内存(GB),CPU核数,操做系统,数据盘/data(GB),所属项目,主要应用"
###打开一个.csv文件,以便写入
ret_file = open("ret.csv","w")
###首先写入开头,有点字段名的意思
ret_file.write(cols + "\n")
try:
for i in grains.keys():
###打印信息可注释掉
print grains[i]["nodename"]
print "ipv4" + ":" ,grains[i]["ipv4"]
print "mem_total" + ":" , grains[i]["mem_total"] / 1024 + 1
print "num_cpus" + ":" , grains[i]["num_cpus"]
print "osfullname" + ":" , grains[i]["osfullname"]
print "release" + ":" , grains[i]["lsb_distrib_release"]
###可能一些主机没有/data数据盘1048576是1024x1024
if "/data" not in diskusage[i]:
print "diskusage" + ":" + "have no /data disk"
else:
data_vol = int(diskusage[i]["/data"]["1K-blocks"])
print "diskusage" + ":" , data_vol / 1048576
###去掉127.0.0.1这个地址
ipv4 = str(grains[i]["ipv4"]).replace(", '127.0.0.1'","")
###由于一些历史遗留问题,这里取得不是主机名,而是salt-minion的id名,用以判断主要应用
hostname = grains[i]["id"]
ipv4 = str(grains[i]["ipv4"]).replace(", '127.0.0.1'","")
ipv4 = ipv4.replace(",","and")
mem = grains[i]["mem_total"] / 1024 + 1
num_cpu = grains[i]["num_cpus"]
OS = grains[i]["osfullname"] + grains[i]["lsb_distrib_release"]
if "/data" not in diskusage[i]:
disk_data = "None"
else:
disk_data = data_vol / 1048576
###项目名为空
project = ""
###经过minion ID名来判断主要运行服务,好比xx-mysql-1,则运行mysql
for j in app_name:
if j in hostname.lower():
app = j
break
else:
app = "undefined"
c = ","
###链接并写入
line = hostname + c + ipv4 + c + str(mem) + c + str(num_cpu) + c + str(OS) + c + str(disk_data) + c + project + c + app
ret_file.write(line + "\n")
except Exception,e:
print "Exception:\n",e
finally:
ret_file.close()

不过若要根据本身需求来作cmdb咱们的路还要往前走

相关文章
相关标签/搜索