运维自动化项目 CMDB
运维自动化项目: ????目的:减少人工干预,降低人员成本 ????方向: ????????- 资产管理 ????????- 操作管理 自动装机 自动部署环境 监控(实时状态) CMDB ????????- 运维自动化基础 ????????- 资产管理 目前CMDB资产管理的实现有如下方式: 使用API原因: ????????1. 集中管理 ????????? ?2. 减少对数据库直接操作 客服端方法: SSH类(Paramiko类)方法: ????优点:无客户端 ????缺点:效率低 代码示例: 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' ])
puppet方式: ????puppet-master ????puppet-slave ? ? puppet-slave默认30分钟连接puppet-master(报表功能),可以自定义执行一段代码 ????注意:需要使用ruby语言编写功能 ????优点:自动汇报 ????缺点:需要使用ruby 基于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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |