加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

运维自动化项目 CMDB

发布时间:2020-12-17 16:59:33 所属栏目:Python 来源:网络整理
导读:运维自动化项目: ????目的:减少人工干预,降低人员成本 ????方向: ????????- 资产管理 ????????- 操作管理 自动装机 自动部署环境 监控(实时状态) CMDB ????????- 运维自动化基础 ????????- 资产管理 目前CMDB资产管理的实现有如下方式: 使用API原因:

运维自动化项目:

????目的:减少人工干预,降低人员成本

????方向:

????????- 资产管理

????????- 操作管理



自动装机

自动部署环境

监控(实时状态)


CMDB

????????- 运维自动化基础

????????- 资产管理

目前CMDB资产管理的实现有如下方式:

使用API原因:

????????1. 集中管理

????????? ?2. 减少对数据库直接操作

客服端方法:

96.png

SSH类(Paramiko类)方法:

????优点:无客户端

????缺点:效率低

97.png

代码示例:

import?paramiko


# 创建SSH对象
ssh?=?paramiko.SSHClient()
# 允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接服务器
ssh.connect(hostname='c1.salt.com',port=22'wupeiqi''123')

???

# 执行命令
stdin,stdout,stderr?ssh.exec_command('df')
# 获取命令结果
result?stdout.read()

???

# 关闭连接
ssh.close()

依赖第三方工具(SaltStack):

????如:saltstack-master

????客户端:saltstack-slave

????基于SaltStack的master上的pillar以及远程执行命令实现

salt.client
local?salt.client.LocalClient()
local.cmd('*''cmd.run''whoami'])

98.png

puppet方式:

????puppet-master

????puppet-slave

? ? puppet-slave默认30分钟连接puppet-master(报表功能),可以自定义执行一段代码

????注意:需要使用ruby语言编写功能

????优点:自动汇报

????缺点:需要使用ruby

99.png

基于Puppet的factor和report功能实现 ?

代码示例:

puppet中默认自带了5个report,放置在【/usr/lib/ruby/site_ruby/1.8/puppet/reports/】路径下。如果需要执行某个report,那么就在puppet的master的配置文件中做如下配置:
?
########################?on?master?###################
/etc/puppet/puppet.conf
[main]
reports?=?store?#默认
#report?=?true?#默认
#pluginsync?=?true?#默认
?
?
#######################?on?client?#####################
?
/etc/puppet/puppet.conf
[main]
#report?=?true?#默认
???
[agent]
runinterval?=?10
server?=?master.puppet.com
certname?=?c1.puppet.com
?
如上述设置之后,每次执行client和master同步,就会在master服务器的?【/var/lib/puppet/reports】路径下创建一个文件,主动执行:puppet?agent??--test

自定义factor示例

在?/etc/puppet/modules?目录下创建如下文件结构:?

modules
└——?cmdb
????├——?lib
????│???└——?puppet
????│???????└——?reports
????│???????????└——?cmdb.rb
????└——?manifests
????????└——?init.pp################?cmdb.rb?#################?cmdb.rbrequire?'puppet'require?'fileutils'require?'puppet/util'
??SEPARATOR?=?[Regexp.escape(File::SEPARATOR.to_s),?Regexp.escape(File::ALT_SEPARATOR.to_s)].join
??
Puppet::Reports.register_report(:cmdb)?do
??desc?"Store?server?info
????These?files?collect?quickly?--?one?every?half?hour?--?so?it?is?a?good?idea
????to?perform?some?maintenance?on?them?if?you?use?this?report?(it's?the?only
????default?report)."??
??def?process
????certname?=?self.name
????now?=?Time.now.gmtime
????File.open("/tmp/cmdb.json",'a')?do?|f|
??????f.write(certname)
??????f.write('?|?')
??????f.write(now)
??????f.write("r")
????end
??
??end
end################?配置?################/etc/puppet/puppet.conf
[main]
reports?=?cmdb#report?=?true?#默认#pluginsync?=?true?#默认

内存信息:

$LOAD_PATH.unshift(File.dirname(__FILE__))?unless?$LOAD_PATH.include?(File.dirname(__FILE__))
require?"rubygems"
require?'pp'
require?'json'
require?'utils'

def?dmi_get_ram(cmd)

????ram_slot?=?[]

????key_map?=?{
????????'Size'?=>?'capacity',????????'Serial?Number'?=>?'sn',????????'Type'?=>?'model',????????'Manufacturer'?=>?'manufactory',????????'Locator'?=>?'slot',????}

????output?=?Utils.facter_exec(cmd)
????devices?=?output.split('Memory?Device')

????devices.each?do?|d|
??????next?if?d.strip.empty?
??????segment?=?{}
??????d.strip.split("t").each?do?|line|
????????key,?value?=?line.strip.split(":")
????????if?key_map.has_key?(key.strip)
??????????if?key.strip?==?'Size'
????????????segment[key_map['Size']]?=?value.chomp("MB").strip.to_i?/?1024.0?#?unit?GB
??????????else
????????????segment[key_map[key.strip]]?=??value???value.strip?:?''
??????????end
????????end
??????end

??????ram_slot.push(segment)?unless?segment.empty?
????end

????return?ram_slot

end

Facter.add("ram")?do
??confine?:kernel?=>?"Linux"
??setcode?do

????ram_slot?=?[]
????cmd?=?"dmidecode?-q?-t?17?2>/dev/null"
????ram_slot?=?dmi_get_ram(cmd)

????JSON.dump(ram_slot)

??end
end


Facter.add("ram")?do
??confine?:kernel?=>?'windows'
??setcode?do

????ram_slot?=?[]

????if?Facter.value(:manufacturer)??=~?/.*HP.*/i
??????cli?=?'C:cmdb_reportdmidecode.exe'
??????cmd?=?"#{cli}?-q?-t?17"
??????ram_slot?=?dmi_get_ram(cmd)?if?File.exist?(cli)

????else

??????require?'facter/util/wmi'
??????Facter::Util::WMI.execquery("select?*?from?Win32_PhysicalMemory").each?do?|?item?|

????????if?item.DeviceLocator
??????????slot?=?item.DeviceLocator.strip
????????else
??????????slot?=?''
????????end

????????if?item.PartNumber
??????????model?=?item.PartNumber.strip
????????else
??????????model?=?''
????????end

????????if?item.SerialNumber
??????????sn?=?item.SerialNumber.strip
????????else
??????????sn?=?''
????????end

????????if?item.Manufacturer
??????????manufactory?=?item.Manufacturer.strip
????????else
??????????manufactory?=?''
????????end

????????ram_slot.push({
?????????'capacity'?=>?item.Capacity.to_i?/?(1024**3),?#?unit?GB
?????????'slot'?=>?slot,?????????'model'?=>?model,?????????'sn'?=>?sn,?????????'manufactory'?=>?manufactory,???????})

??????end
????end

????JSON.dump(ram_slot)

??end
end


(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读