首页 文章 精选 留言 我的

精选列表

搜索[自动化],共10001篇文章
优秀的个人博客,低调大师

python自动化巡检

#!/usr/bin/envpython #-*-coding:utf-8-*- #__author__="chenhao" #Email:312779641@qq.com #Date:2017/8/22 importparamiko defsftp_exec_command(host,port,username,password,command): ssh=paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(hostname=host,port=port,username=username,password=password) stdin,stdout,stderr=ssh.exec_command(command) list=[] foriteminstdout.readlines(): list.append(item.strip()) returnlist ssh.close() defsftp_down_file(host,port,username,password,server_path,local_path): try: t=paramiko.Transport((host,port)) t.connect(username=username,password=password) sftp=paramiko.SFTPClient.from_transport(t) sftp.get(server_path,local_path) t.close() exceptExceptionase: print(e) if__name__=='__main__': hosts_file=open('./hosts/host.info','r') forlineinhosts_file.readlines(): ifline[0:1]=='#':continue line=line.strip('\n') items=line.split() port=22 host=items[0] username=items[1] password=items[2] sftp_exec_command(host,port,username,password,"sh/root/xunjian.sh") n=sftp_exec_command(host,port,username,password,"ls-t/root/log/|head-1") filename="/root/log/%s"%(n[0]) print(filename) sftp_down_file(host,port,username,password,filename,"D:/大数据数据/%s"%(n[0])) 执行后自动巡检python脚本 shell运维脚本 #!/bin/bash #主机信息每日巡检 IPADDR=$(ifconfigeth0|grep'inetaddr'|awk-F'[:]''{print$13}') #环境变量PATH没设好,在cron里执行时有很多命令会找不到 exportPATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin source/etc/profile [$(id-u)-gt0]&&echo"请用root用户执行此脚本!"&&exit1 centosVersion=$(awk'{print$(NF-1)}'/etc/redhat-release) VERSION="2017.08.22" #日志相关 PROGPATH=`echo$0|sed-e's,[\\/][^\\/][^\\/]*$,,'` [-f$PROGPATH]&&PROGPATH="." LOGPATH="$PROGPATH/log" [-e$LOGPATH]||mkdir$LOGPATH RESULTFILE="$LOGPATH/HostDailyCheck-$IPADDR-`date+%Y%m%d`.txt" #定义报表的全局变量 report_DateTime=""#日期ok report_Hostname=""#主机名ok report_OSRelease=""#发行版本ok report_Kernel=""#内核ok report_Language=""#语言/编码ok report_LastReboot=""#最近启动时间ok report_Uptime=""#运行时间(天)ok report_CPUs=""#CPU数量ok report_CPUType=""#CPU类型ok report_Arch=""#CPU架构ok report_MemTotal=""#内存总容量(MB)ok report_MemFree=""#内存剩余(MB)ok report_MemUsedPercent=""#内存使用率%ok report_DiskTotal=""#硬盘总容量(GB)ok report_DiskFree=""#硬盘剩余(GB)ok report_DiskUsedPercent=""#硬盘使用率%ok report_InodeTotal=""#Inode总量ok report_InodeFree=""#Inode剩余ok report_InodeUsedPercent=""#Inode使用率ok report_IP=""#IP地址ok report_MAC=""#MAC地址ok report_Gateway=""#默认网关ok report_DNS=""#DNSok report_Listen=""#监听ok report_Selinux=""#Selinuxok report_Firewall=""#防火墙ok report_USERs=""#用户ok report_USEREmptyPassword=""#空密码用户ok report_USERTheSameUID=""#相同ID的用户ok report_PasswordExpiry=""#密码过期(天)ok report_RootUser=""#root用户ok report_Sudoers=""#sudo授权ok report_SSHAuthorized=""#SSH信任主机ok report_SSHDProtocolVersion=""#SSH协议版本ok report_SSHDPermitRootLogin=""#允许root远程登录ok report_DefunctProsess=""#僵尸进程数量ok report_SelfInitiatedService=""#自启动服务数量ok report_SelfInitiatedProgram=""#自启动程序数量ok report_RuningService=""#运行中服务数ok report_Crontab=""#计划任务数ok report_Syslog=""#日志服务ok report_SNMP=""#SNMPOK report_NTP=""#NTPok report_JDK=""#JDK版本ok functionversion(){ echo"" echo"" echo"系统巡检脚本:Version$VERSION" } functiongetCpuStatus(){ echo"" echo"" echo"############################CPU检查#############################" Physical_CPUs=$(grep"physicalid"/proc/cpuinfo|sort|uniq|wc-l) Virt_CPUs=$(grep"processor"/proc/cpuinfo|wc-l) CPU_Kernels=$(grep"cores"/proc/cpuinfo|uniq|awk-F':''{print$2}') CPU_Type=$(grep"modelname"/proc/cpuinfo|awk-F':''{print$2}'|sort|uniq) CPU_Arch=$(uname-m) echo"物理CPU个数:$Physical_CPUs" echo"逻辑CPU个数:$Virt_CPUs" echo"每CPU核心数:$CPU_Kernels" echo"CPU型号:$CPU_Type" echo"CPU架构:$CPU_Arch" #报表信息 report_CPUs=$Virt_CPUs#CPU数量 report_CPUType=$CPU_Type#CPU类型 report_Arch=$CPU_Arch#CPU架构 } functiongetMemStatus(){ echo"" echo"" echo"############################内存检查############################" if[[$centosVersion<7]];then free-mo else free-h fi #报表信息 MemTotal=$(grepMemTotal/proc/meminfo|awk'{print$2}')#KB MemFree=$(grepMemFree/proc/meminfo|awk'{print$2}')#KB letMemUsed=MemTotal-MemFree MemPercent=$(awk"BEGIN{if($MemTotal==0){printf100}else{printf\"%.2f\",$MemUsed*100/$MemTotal}}") report_MemTotal="$((MemTotal/1024))""MB"#内存总容量(MB) report_MemFree="$((MemFree/1024))""MB"#内存剩余(MB) report_MemUsedPercent="$(awk"BEGIN{if($MemTotal==0){printf100}else{printf\"%.2f\",$MemUsed*100/$MemTotal}}")""%"#内存使用率% } functiongetDiskStatus(){ echo"" echo"" echo"############################磁盘检查############################" df-hiP|sed's/Mountedon/Mounted/'>/tmp/inode df-hTP|sed's/Mountedon/Mounted/'>/tmp/disk join/tmp/disk/tmp/inode|awk'{print$1,$2,"|",$3,$4,$5,$6,"|",$8,$9,$10,$11,"|",$12}'|column-t #报表信息 diskdata=$(df-TP|sed'1d'|awk'$2!="tmpfs"{print}')#KB disktotal=$(echo"$diskdata"|awk'{total+=$3}END{printtotal}')#KB diskused=$(echo"$diskdata"|awk'{total+=$4}END{printtotal}')#KB diskfree=$((disktotal-diskused))#KB diskusedpercent=$(echo$disktotal$diskused|awk'{if($1==0){printf100}else{printf"%.2f",$2*100/$1}}') inodedata=$(df-iTP|sed'1d'|awk'$2!="tmpfs"{print}') inodetotal=$(echo"$inodedata"|awk'{total+=$3}END{printtotal}') inodeused=$(echo"$inodedata"|awk'{total+=$4}END{printtotal}') inodefree=$((inodetotal-inodeused)) inodeusedpercent=$(echo$inodetotal$inodeused|awk'{if($1==0){printf100}else{printf"%.2f",$2*100/$1}}') report_DiskTotal=$((disktotal/1024/1024))"GB"#硬盘总容量(GB) report_DiskFree=$((diskfree/1024/1024))"GB"#硬盘剩余(GB) report_DiskUsedPercent="$diskusedpercent""%"#硬盘使用率% report_InodeTotal=$((inodetotal/1000))"K"#Inode总量 report_InodeFree=$((inodefree/1000))"K"#Inode剩余 report_InodeUsedPercent="$inodeusedpercent""%"#Inode使用率% } functiongetSystemStatus(){ echo"" echo"" echo"############################系统检查############################" if[-e/etc/sysconfig/i18n];then default_LANG="$(grep"LANG="/etc/sysconfig/i18n|grep-v"^#"|awk-F'"''{print$2}')" else default_LANG=$LANG fi exportLANG="en_US.UTF-8" Release=$(cat/etc/redhat-release2>/dev/null) Kernel=$(uname-r) OS=$(uname-o) Hostname=$(uname-n) SELinux=$(/usr/sbin/sestatus|grep"SELinuxstatus:"|awk'{print$3}') LastReboot=$(who-b|awk'{print$3,$4}') uptime=$(uptime|sed's/.*up\([^,]*\),.*/\1/') echo"系统:$OS" echo"发行版本:$Release" echo"内核:$Kernel" echo"主机名:$Hostname" echo"SELinux:$SELinux" echo"语言/编码:$default_LANG" echo"当前时间:$(date+'%F%T')" echo"最后启动:$LastReboot" echo"运行时间:$uptime" #报表信息 report_DateTime=$(date+"%F%T")#日期 report_Hostname="$Hostname"#主机名 report_OSRelease="$Release"#发行版本 report_Kernel="$Kernel"#内核 report_Language="$default_LANG"#语言/编码 report_LastReboot="$LastReboot"#最近启动时间 report_Uptime="$uptime"#运行时间(天) report_Selinux="$SELinux" exportLANG="$default_LANG" } functiongetServiceStatus(){ echo"" echo"" echo"############################服务检查############################" echo"" if[[$centosVersion>7]];then conf=$(systemctllist-unit-files--type=service--state=enabled--no-pager|grep"enabled") process=$(systemctllist-units--type=service--state=running--no-pager|grep".service") #报表信息 report_SelfInitiatedService="$(echo"$conf"|wc-l)"#自启动服务数量 report_RuningService="$(echo"$process"|wc-l)"#运行中服务数量 else conf=$(/sbin/chkconfig|grep-E":on|:启用") process=$(/sbin/service--status-all2>/dev/null|grep-E"isrunning|正在运行") #报表信息 report_SelfInitiatedService="$(echo"$conf"|wc-l)"#自启动服务数量 report_RuningService="$(echo"$process"|wc-l)"#运行中服务数量 fi echo"服务配置" echo"--------" echo"$conf"|column-t echo"" echo"正在运行的服务" echo"--------------" echo"$process" } functiongetAutoStartStatus(){ echo"" echo"" echo"############################自启动检查##########################" conf=$(grep-v"^#"/etc/rc.d/rc.local|sed'/^$/d') echo"$conf" #报表信息 report_SelfInitiatedProgram="$(echo$conf|wc-l)"#自启动程序数量 } functiongetLoginStatus(){ echo"" echo"" echo"############################登录检查############################" last|head } functiongetNetworkStatus(){ echo"" echo"" echo"############################网络检查############################" if[[$centosVersion<7]];then /sbin/ifconfig-a|grep-vpackets|grep-vcollisions|grep-vinet6 else #ipa foriin$(iplink|grepBROADCAST|awk-F:'{print$2}');doipaddshow$i|grep-E"BROADCAST|global"|awk'{print$2}'|tr'\n''';echo"";done fi GATEWAY=$(iproute|grepdefault|awk'{print$3}') DNS=$(grepnameserver/etc/resolv.conf|grep-v"#"|awk'{print$2}'|tr'\n'','|sed's/,$//') echo"" echo"网关:$GATEWAY" echo"DNS:$DNS" #报表信息 IP=$(ip-finetaddr|grep-v127.0.0.1|grepinet|awk'{print$NF,$2}'|tr'\n'','|sed's/,$//') MAC=$(iplink|grep-v"LOOPBACK\|loopback"|awk'{print$2}'|sed'N;s/\n//'|tr'\n'','|sed's/,$//') report_IP="$IP"#IP地址 report_MAC=$MAC#MAC地址 report_Gateway="$GATEWAY"#默认网关 report_DNS="$DNS"#DNS } functiongetListenStatus(){ echo"" echo"" echo"############################监听检查############################" TCPListen=$(ss-ntul|column-t) echo"$TCPListen" #报表信息 report_Listen="$(echo"$TCPListen"|sed'1d'|awk'/tcp/{print$5}'|awk-F:'{print$NF}'|sort|uniq|wc-l)" } functiongetCronStatus(){ echo"" echo"" echo"############################计划任务检查########################" Crontab=0 forshellin$(grep-v"/sbin/nologin"/etc/shells);do foruserin$(grep"$shell"/etc/passwd|awk-F:'{print$1}');do crontab-l-u$user>/dev/null2>&1 status=$? if[$status-eq0];then echo"$user" echo"--------" crontab-l-u$user letCrontab=Crontab+$(crontab-l-u$user|wc-l) echo"" fi done done #计划任务 find/etc/cron*-typef|xargs-ils-l{}|column-t letCrontab=Crontab+$(find/etc/cron*-typef|wc-l) #报表信息 report_Crontab="$Crontab"#计划任务数 } functiongetHowLongAgo(){ #计算一个时间戳离现在有多久了 datetime="$*" [-z"$datetime"]&&echo"错误的参数:getHowLongAgo()$*" Timestamp=$(date+%s-d"$datetime")#转化为时间戳 Now_Timestamp=$(date+%s) Difference_Timestamp=$(($Now_Timestamp-$Timestamp)) days=0;hours=0;minutes=0; sec_in_day=$((60*60*24)); sec_in_hour=$((60*60)); sec_in_minute=60 while(($(($Difference_Timestamp-$sec_in_day))>1)) do letDifference_Timestamp=Difference_Timestamp-sec_in_day letdays++ done while(($(($Difference_Timestamp-$sec_in_hour))>1)) do letDifference_Timestamp=Difference_Timestamp-sec_in_hour lethours++ done echo"$days天$hours小时前" } functiongetUserLastLogin(){ #获取用户最近一次登录的时间,含年份 #很遗憾last命令不支持显示年份,只有"last-tYYYYMMDDHHMMSS"表示某个时间之间的登录,我 #们只能用最笨的方法了,对比今天之前和今年元旦之前(或者去年之前和前年之前……)某个用户 #登录次数,如果登录统计次数有变化,则说明最近一次登录是今年。 username=$1 :${username:="`whoami`"} thisYear=$(date+%Y) oldesYear=$(last|tail-n1|awk'{print$NF}') while(($thisYear>=$oldesYear));do loginBeforeToday=$(last$username|grep$username|wc-l) loginBeforeNewYearsDayOfThisYear=$(last$username-t$thisYear"0101000000"|grep$username|wc-l) if[$loginBeforeToday-eq0];then echo"从未登录过" break elif[$loginBeforeToday-gt$loginBeforeNewYearsDayOfThisYear];then lastDateTime=$(last-i$username|head-n1|awk'{for(i=4;i<(NF-2);i++)printf"%s",$i}')"$thisYear"#格式如:SatNov220:332015 lastDateTime=$(date"+%Y-%m-%d%H:%M:%S"-d"$lastDateTime") echo"$lastDateTime" break else thisYear=$((thisYear-1)) fi done } functiongetUserStatus(){ echo"" echo"" echo"############################用户检查############################" #/etc/passwd最后修改时间 pwdfile="$(cat/etc/passwd)" Modify=$(stat/etc/passwd|grepModify|tr'.'''|awk'{print$2,$3}') echo"/etc/passwd最后修改时间:$Modify($(getHowLongAgo$Modify))" echo"" echo"特权用户" echo"--------" RootUser="" foruserin$(echo"$pwdfile"|awk-F:'{print$1}');do if[$(id-u$user)-eq0];then echo"$user" RootUser="$RootUser,$user" fi done echo"" echo"用户列表" echo"--------" USERs=0 echo"$( echo"用户名UIDGIDHOMESHELL最后一次登录" forshellin$(grep-v"/sbin/nologin"/etc/shells);do forusernamein$(grep"$shell"/etc/passwd|awk-F:'{print$1}');do userLastLogin="$(getUserLastLogin$username)" echo"$pwdfile"|grep-w"$username"|grep-w"$shell"|awk-F:-vlastlogin="$(echo"$userLastLogin"|tr'''_')"'{print$1,$3,$4,$6,$7,lastlogin}' done letUSERs=USERs+$(echo"$pwdfile"|grep"$shell"|wc-l) done )"|column-t echo"" echo"空密码用户" echo"----------" USEREmptyPassword="" forshellin$(grep-v"/sbin/nologin"/etc/shells);do foruserin$(echo"$pwdfile"|grep"$shell"|cut-d:-f1);do r=$(awk-F:'$2=="!!"{print$1}'/etc/shadow|grep-w$user) if[!-z$r];then echo$r USEREmptyPassword="$USEREmptyPassword,"$r fi done done echo"" echo"相同ID的用户" echo"------------" USERTheSameUID="" UIDs=$(cut-d:-f3/etc/passwd|sort|uniq-c|awk'$1>1{print$2}') foruidin$UIDs;do echo-n"$uid"; USERTheSameUID="$uid" r=$(awk-F:'ORS="";$3=='"$uid"'{print":",$1}'/etc/passwd) echo"$r" echo"" USERTheSameUID="$USERTheSameUID$r," done #报表信息 report_USERs="$USERs"#用户 report_USEREmptyPassword=$(echo$USEREmptyPassword|sed's/^,//') report_USERTheSameUID=$(echo$USERTheSameUID|sed's/,$//') report_RootUser=$(echo$RootUser|sed's/^,//')#特权用户 } functiongetPasswordStatus{ echo"" echo"" echo"############################密码检查############################" pwdfile="$(cat/etc/passwd)" echo"" echo"密码过期检查" echo"------------" result="" forshellin$(grep-v"/sbin/nologin"/etc/shells);do foruserin$(echo"$pwdfile"|grep"$shell"|cut-d:-f1);do get_expiry_date=$(/usr/bin/chage-l$user|grep'Passwordexpires'|cut-d:-f2) if[[$get_expiry_date='never'||$get_expiry_date='never']];then printf"%-15s永不过期\n"$user result="$result,$user:never" else password_expiry_date=$(date-d"$get_expiry_date""+%s") current_date=$(date"+%s") diff=$(($password_expiry_date-$current_date)) letDAYS=$(($diff/(60*60*24))) printf"%-15s%s天后过期\n"$user$DAYS result="$result,$user:$DAYSdays" fi done done report_PasswordExpiry=$(echo$result|sed's/^,//') echo"" echo"密码策略检查" echo"------------" grep-v"#"/etc/login.defs|grep-E"PASS_MAX_DAYS|PASS_MIN_DAYS|PASS_MIN_LEN|PASS_WARN_AGE" } functiongetSudoersStatus(){ echo"" echo"" echo"############################Sudoers检查#########################" conf=$(grep-v"^#"/etc/sudoers|grep-v"^Defaults"|sed'/^$/d') echo"$conf" echo"" #报表信息 report_Sudoers="$(echo$conf|wc-l)" } functiongetInstalledStatus(){ echo"" echo"" echo"############################软件检查############################" rpm-qa--last|head|column-t } functiongetProcessStatus(){ echo"" echo"" echo"############################进程检查############################" if[$(ps-ef|grepdefunct|grep-vgrep|wc-l)-ge1];then echo"" echo"僵尸进程"; echo"--------" ps-ef|head-n1 ps-ef|grepdefunct|grep-vgrep fi echo"" echo"内存占用TOP10" echo"-------------" echo-e"PID%MEMRSSCOMMAND $(psaux|awk'{print$2,$4,$6,$11}'|sort-k3rn|head-n10)"|column-t echo"" echo"CPU占用TOP10" echo"------------" topb-n1|head-17|tail-11 #报表信息 report_DefunctProsess="$(ps-ef|grepdefunct|grep-vgrep|wc-l)" } functiongetJDKStatus(){ echo"" echo"" echo"############################JDK检查#############################" java-version2>/dev/null if[$?-eq0];then java-version2>&1 fi echo"JAVA_HOME=\"$JAVA_HOME\"" #报表信息 report_JDK="$(java-version2>&1|grepversion|awk'{print$1,$3}'|tr-d'"')" } functiongetSyslogStatus(){ echo"" echo"" echo"############################syslog检查##########################" echo"服务状态:$(getStatersyslog)" echo"" echo"/etc/rsyslog.conf" echo"-----------------" cat/etc/rsyslog.conf2>/dev/null|grep-v"^#"|grep-v"^\\$"|sed'/^$/d'|column-t #报表信息 report_Syslog="$(getStatersyslog)" } functiongetFirewallStatus(){ echo"" echo"" echo"############################防火墙检查##########################" #防火墙状态,策略等 if[[$centosVersion<7]];then /etc/init.d/iptablesstatus>/dev/null2>&1 status=$? if[$status-eq0];then s="active" elif[$status-eq3];then s="inactive" elif[$status-eq4];then s="permissiondenied" else s="unknown" fi else s="$(getStateiptables)" fi echo"iptables:$s" echo"" echo"/etc/sysconfig/iptables" echo"-----------------------" cat/etc/sysconfig/iptables2>/dev/null #报表信息 report_Firewall="$s" } functiongetSNMPStatus(){ #SNMP服务状态,配置等 echo"" echo"" echo"############################SNMP检查############################" status="$(getStatesnmpd)" echo"服务状态:$status" echo"" if[-e/etc/snmp/snmpd.conf];then echo"/etc/snmp/snmpd.conf" echo"--------------------" cat/etc/snmp/snmpd.conf2>/dev/null|grep-v"^#"|sed'/^$/d' fi #报表信息 report_SNMP="$(getStatesnmpd)" } functiongetState(){ if[[$centosVersion<7]];then if[-e"/etc/init.d/$1"];then if[`/etc/init.d/$1status2>/dev/null|grep-E"isrunning|正在运行"|wc-l`-ge1];then r="active" else r="inactive" fi else r="unknown" fi else #CentOS7+ r="$(systemctlis-active$12>&1)" fi echo"$r" } functiongetSSHStatus(){ #SSHD服务状态,配置,受信任主机等 echo"" echo"" echo"############################SSH检查#############################" #检查受信任主机 pwdfile="$(cat/etc/passwd)" echo"服务状态:$(getStatesshd)" Protocol_Version=$(cat/etc/ssh/sshd_config|grepProtocol|awk'{print$2}') echo"SSH协议版本:$Protocol_Version" echo"" echo"信任主机" echo"--------" authorized=0 foruserin$(echo"$pwdfile"|grep/bin/bash|awk-F:'{print$1}');do authorize_file=$(echo"$pwdfile"|grep-w$user|awk-F:'{printf$6"/.ssh/authorized_keys"}') authorized_host=$(cat$authorize_file2>/dev/null|awk'{print$3}'|tr'\n'','|sed's/,$//') if[!-z$authorized_host];then echo"$user授权\"$authorized_host\"无密码访问" fi letauthorized=authorized+$(cat$authorize_file2>/dev/null|awk'{print$3}'|wc-l) done echo"" echo"是否允许ROOT远程登录" echo"--------------------" config=$(cat/etc/ssh/sshd_config|grepPermitRootLogin) firstChar=${config:0:1} if[$firstChar=="#"];then PermitRootLogin="yes"#默认是允许ROOT远程登录的 else PermitRootLogin=$(echo$config|awk'{print$2}') fi echo"PermitRootLogin$PermitRootLogin" echo"" echo"/etc/ssh/sshd_config" echo"--------------------" cat/etc/ssh/sshd_config|grep-v"^#"|sed'/^$/d' #报表信息 report_SSHAuthorized="$authorized"#SSH信任主机 report_SSHDProtocolVersion="$Protocol_Version"#SSH协议版本 report_SSHDPermitRootLogin="$PermitRootLogin"#允许root远程登录 } functiongetNTPStatus(){ #NTP服务状态,当前时间,配置等 echo"" echo"" echo"############################NTP检查#############################" if[-e/etc/ntp.conf];then echo"服务状态:$(getStatentpd)" echo"" echo"/etc/ntp.conf" echo"-------------" cat/etc/ntp.conf2>/dev/null|grep-v"^#"|sed'/^$/d' fi #报表信息 report_NTP="$(getStatentpd)" } functionuploadHostDailyCheckReport(){ json="{ \"DateTime\":\"$report_DateTime\", \"Hostname\":\"$report_Hostname\", \"OSRelease\":\"$report_OSRelease\", \"Kernel\":\"$report_Kernel\", \"Language\":\"$report_Language\", \"LastReboot\":\"$report_LastReboot\", \"Uptime\":\"$report_Uptime\", \"CPUs\":\"$report_CPUs\", \"CPUType\":\"$report_CPUType\", \"Arch\":\"$report_Arch\", \"MemTotal\":\"$report_MemTotal\", \"MemFree\":\"$report_MemFree\", \"MemUsedPercent\":\"$report_MemUsedPercent\", \"DiskTotal\":\"$report_DiskTotal\", \"DiskFree\":\"$report_DiskFree\", \"DiskUsedPercent\":\"$report_DiskUsedPercent\", \"InodeTotal\":\"$report_InodeTotal\", \"InodeFree\":\"$report_InodeFree\", \"InodeUsedPercent\":\"$report_InodeUsedPercent\", \"IP\":\"$report_IP\", \"MAC\":\"$report_MAC\", \"Gateway\":\"$report_Gateway\", \"DNS\":\"$report_DNS\", \"Listen\":\"$report_Listen\", \"Selinux\":\"$report_Selinux\", \"Firewall\":\"$report_Firewall\", \"USERs\":\"$report_USERs\", \"USEREmptyPassword\":\"$report_USEREmptyPassword\", \"USERTheSameUID\":\"$report_USERTheSameUID\", \"PasswordExpiry\":\"$report_PasswordExpiry\", \"RootUser\":\"$report_RootUser\", \"Sudoers\":\"$report_Sudoers\", \"SSHAuthorized\":\"$report_SSHAuthorized\", \"SSHDProtocolVersion\":\"$report_SSHDProtocolVersion\", \"SSHDPermitRootLogin\":\"$report_SSHDPermitRootLogin\", \"DefunctProsess\":\"$report_DefunctProsess\", \"SelfInitiatedService\":\"$report_SelfInitiatedService\", \"SelfInitiatedProgram\":\"$report_SelfInitiatedProgram\", \"RuningService\":\"$report_RuningService\", \"Crontab\":\"$report_Crontab\", \"Syslog\":\"$report_Syslog\", \"SNMP\":\"$report_SNMP\", \"NTP\":\"$report_NTP\", \"JDK\":\"$report_JDK\" }" #echo"$json" curl-l-H"Content-type:application/json"-XPOST-d"$json""$uploadHostDailyCheckReportApi"2>/dev/null } functioncheck(){ version getSystemStatus getCpuStatus getMemStatus getDiskStatus getNetworkStatus getListenStatus getProcessStatus getServiceStatus getAutoStartStatus getLoginStatus getCronStatus getUserStatus getPasswordStatus getSudoersStatus getJDKStatus getFirewallStatus getSSHStatus getSyslogStatus getSNMPStatus getNTPStatus getInstalledStatus } #执行检查并保存检查结果 check>$RESULTFILE echo"检查结果:$RESULTFILE" 添加host.info信息 192.168.2.30 root root 192.168.2.28 root root 192.168.2.27 root root 192.168.2.29 root root 执行python脚本生成文件 #使用exe执行python脚本 安装pyinstaller E:\python新版学习\pyinstaller-develop>PyInstaller E:\python新版学习\3.6.2\inspe ction.py

优秀的个人博客,低调大师

Docker自动化双主-02自动化脚本制作镜像启动

基于 DOCKER MySQL 主从搭建: 一、根据 Linux 系统版本号安装 dockerEG:Centos 7:1.shell>sudo yum update2.添加 dockeryum$[dockerrepo] name=Docker Repository baseurl=https://yum.dockerproject.org/repo/main/centos/7/ enabled=1gpgcheck=1 gpgkey=https://yum.dockerproject.org/gpg EOF 3.安装 docker 的包shell>sudo yum install docker-engine4.将 docker 加到服务里面shell>sudo systemctl enable docker.service 5.启动 dockershell> sudo systemctl start docker二、将 docker 镜像导入 linux: 镜像文件上传到/opt/dtstack 目录下: 1.载入镜像:Shell>cd /opt/dtstackShell>docker load < mysql-5.6-x86_64.tar[root@centos7 docker]# docker load < mysql-5.6-x86_64.tarc411e76031a4: Loading layer [==================================================>] 201.9 MB/201.9 MBabd40b5d012f: Loading layer [==================================================>] 60.97 MB/60.97 MB7d082aa6bb0c: Loading layer [==================================================>] 263.3 MB/263.3 MB173e11cd6be1: Loading layer [==================================================>] 6.656 kB/6.656 kBbdb04743768e: Loading layer [==================================================>]sudotee /etc/yum.repos.d/docker.repo <<-'EOF'3.072 kB/3.072 kB9da6836b8f64: Loading layer [==================================================>] 4.872 MB/4.872 MBd47abb872b5c: Loading layer [==================================================>] 20.3 MB/20.3 MB008419e2fbfc: Loading layer [==================================================>] 108.9 MB/108.9 MB95d9d0bff849: Loading layer [==================================================>] 23.04 kB/23.04 kB71405897d961: Loading layer [==================================================>] 1.68 MB/1.68 MB58b14b6eb7df: Loading layer [==================================================>] 49.48 MB/49.48 MBfffc1c2170a5: Loading layer [==================================================>] 94.12 MB/94.12 MB9d60f33d82f1: Loading layer [==================================================>] 23.7 MB/23.7 MB2b9b1be70303: Loading layer [==================================================>] 6.656 kB/6.656 kBa2018f6089d9: Loading layer [==================================================>] 1.122 GB/1.122 GB9e274ef73e1d: Loading layer [==================================================>] 13.82 kB/13.82 kBd0ca45b2e986: Loading layer [==================================================>] 6.144 kB/6.144 kBLoaded image: dtstack_db_01:5.62.列出本地已有镜像:Shell> docker images REPOSITORY TAG SIZEdtstack_db_01 5.6 1.92 GB3.传参脚本说明: #!/bin/bash APP_NAME=db_01DOCKER_IMAGE=dtstack_db_01:5.6docker_run(){docker run -dt \--restart=always --name $APP_NAME \IMAGE ID 26e6aa6ed6c2CREATED 22 hours ago -p 3306:3306 #映射的端口号-v /etc/localtime:/etc/localtime:ro \-v /data/mysql/my3306:/data/mysql \/data/mysql 目录必须存在-e "dbport=3306" #dbport-e "db_root_password=root123" -e "db_master_ip=172.16.1.65" -e "db_slave_ip=172.16.1.86" \ 宿主机目录挂载到/data/mysql/myxxx 下, -e "db_tag=master" -e "db_instance=4" \实例...-i $DOCKER_IMAGE} docker_run4.运行 mysql_docker.sh 脚本 Shell>./mysql_docker.sh db 角色 选择性部署多实例。EG:单实例 db_instance=1, 3 则是 3 个 5.检查容器运行状态: Shell>docker ps –a CONTAINER IDSTATUSIMAGE PORTSCOMMAND"/bin/sh -c '/home..." 34 seconds agoNAMESCREATED dd47a290ae94Up 34 secondsdtstack_db_01:5.60.0.0.0:3306->3306/tcp, 3307-3311/tcp db_01 6.进行观察日志信息是否搭建成功:Shell>docker logs dd47a290ae94170317 19:31:09 mysqld_safe Logging to '/data/mysql/log/alert.log'.170317 19:31:09 mysqld_safe Starting mysqld daemon with databases from /data/mysql/data create replicaiton logmaster change master toupdate root password logSLAVE: 同上述操作: 1.需要更改的: #!/bin/bash APP_NAME=db_01DOCKER_IMAGE=dtstack_db_01:5.6docker_run(){ docker run -dt \ --restart=always \--name $APP_NAME \-p 3306:3306 \-v /etc/localtime:/etc/localtime:ro \-v /data/mysql/my3306:/data/mysql \-e "dbport=3306" \-e "db_root_password=root123" \-e "db_master_ip=172.16.1.69" \-e "db_slave_ip=172.16.1.86" \-e "db_tag=slave" #将 tag 标签转换为 slave,其他不需要修改 -e "db_instance=4" \-i $DOCKER_IMAGE}2.启动 mysql_slave.sh 脚本: Shell>./mysql_docker.sh [root@localhost docker]# docker ps -aCONTAINER ID CREATED NAMES fb45654c2eda Up 6 minutes docker_runIMAGE STATUSdtstack_db_01:5.6 0.0.0.0:3306->3306/tcp, 3307-3311/tcpCOMMAND PORTS6 minutes agodb_01"/bin/sh -c '/home..."三、通过外部连接 mysql:检查主从是否正常:1.SLAVE:Shell>mysql -h172.16.1.86 -uroot -proot123 -P3306 -e "start slave;show slave statusG" | grep _Running | awk 'NR!=3'Warning: Using a password on the command line interface can be insecure.2.master:[root@centos7 docker]# mysql -h172.16.1.65 -uroot -proot123 -P3306 -e "start slave;show slave statusG" | grep _Running | awk 'NR!=3' Slave_IO_Running: Yes Slave_SQL_Running: Yes Slave_IO_Running: Yes

优秀的个人博客,低调大师

jenkins docker springcloud 自动化

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34173549/article/details/80632522 由于公司要做微服务所以我对jenkins docker springcloud如何集成起来做自动部署做了一些研究,这里写出来也算是结自己一个总结,同时也希望能帮助到其他人。 我这里环境如下: Contos7 64 jdk-8u144-linux-x64.tar.gz jenkins.war 2.78 docker gitlab maven git 因为jenkins是java 编写的所以需要安装jdk安装步骤很简单这大概也就是一步: 进入jdk的目录 cd /usr/local 我这里是/usr/local这个目录 查看目录下文件 ls -il 解压jdktar zxvf jdk-8u144-linux-x64.tar.gz 配置jdk 编辑profile 文件加入jdk 环境变量 vim /etc/profile export JAVA_HOME=/usr/local/jdk1.8.0_144export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarexport PATH=$PATH:$JAVA_HOME/bin 使用source命令使配置生效 source/etc/profile 这时我们来执行 java -version 出现下面这个就说明配置成功了。 接下来我们就可以安装jenkins了首选需要下载jenkins 下载地址 http://updates.jenkins-ci.org/download/war/ 下载后将jenkins.war上传到 /usr/local 到jenkins.war 目录下 执行 java -jar jenkins.war 或者是 java -jar httpPort=8080(这里可以指定怎么想指定的端口) jenkins.war jenkins 默认是8080 因为liunx 系统没有开放8080端口所以要开放8080端口firewall-cmd --add-port=8080/tcp --permanent 重新加载防火墙配置 firewall-cmd --reload 这时在浏览器访问 http://ip:8080 就可以看到 这是jenkins为我们自动生成的一个密钥 这个密钥可以在控制台找到 当然也可以去 这个目录下找到/root/.jenkins/secrets/initialAdminPassword这里我们到控制台去找 将这个密钥复制到文本框 点击Continue 就可以看到这个页面 这里这们选择推荐(install suggested plugins)这时可以看到已经在安装插件 安装完成后需要创建一个管理员账户 填写完成后点击 Save and finish 当进入下面这个页面后jenkins就算是安装完成了 docker 的安装我这里是安官网的安装这里就不做请说明。请参考官网 https://docs.docker.com/engine/installation/linux/docker-ce/centos/#install-using-the-repository maven 安装 首先要下载一上maven 的安装文件 使用wget下载 wget http://mirror.bit.edu.cn/apache/maven/maven-3/3.5.0/binaries/apache-maven-3.5.0-bin.tar.gz 下载完成后解压 maven :tar zxvf apache-maven-3.5.0-bin.tar.gz 配置MAVEN_HONE 环境变量 编辑 vim /etc/profile 加入下面这两句 export MAVEN_HOME=/usr/local/apache-maven-3.5.0export PATH=$PATH:$MAVEN_HOME/bin 配置生效 source /etc/profile 执行mvn -version 看到如果图说明配置成功 配置阿里云的maven repository 进入 maven conf目录下 cd /usr/local/apache-maven-3.5.0/conf 编辑settings.xml加入阿里云的maven仓库 vimsettings.xml <mirror> <id>nexus-aliyun</id> <mirrorOf>*</mirrorOf> <name>Nexus aliyun</name> <url>http://maven.aliyun.com/nexus/content/groups/public</url> </mirror> 安装git yum install -y git 安装完成执行 git --version 接下来进入主题来构建我们的第一个项目 1.在jenkins中创建一个新任务 2.构建一个自由风格的软件项目 3.配置项目构建信息 1)配置git 2)配置git web hook 安装 gitlab hook plugin 系统管理 -> 插件管理 -> 可选插件 -> 搜索 gitlab hook plugin -> 选中安装 首先说明我这里用的是私有的gitlab 如果你的机器可以公网访问那么你可以使用github 或 码云 。搭建私有gitlab请看 http://www.imooc.com/article/17128?block_id=tuijian_wz 进入点击generate生成一个token 复制 http://192.168.189.139:8080/project/microservice-discovery 进入 gitlab Settings -> Integrations -> 添加url和 token 3)配置构建环境 maven构建 增加构建步骤 -> invoker top-level-Maven targets 构建命令 clean package shell 脚本 增加构建步骤 -> Execute shell 构建前我们需要设置一下docker 的regitry通过不安全的http访问 地址以及阿里云加速器 vim /usr/lib/systemd/system/docker.service 加入如下 --registry-mirror=https://aj2rgad5.mirror.aliyuncs.com --insecure-registry 192.168.189.133:5000 完成已上步骤我们点构建就可以构建我们的项目了 从下图中可以看到已经开始在构建 构建完成后我们访问http://192.168.189.139:8761就可以看到springcloud eureak的管理页了 构建脚本如下: #!/bin/bash REGISTRY_URL=192.168.189.133:5000 WORK_DIR=/root/work_build PROJECT_NAME=microservice-provider PROJECT_VERSION=0.0.1 if [ ! -e ${WORK_DIR}/${PROJECT_NAME} ] && [ ! -d ${WORK_DIR}/${PROJECT_NAME} ]; then mkdir -p ${WORK_DIR}/${PROJECT_NAME} echo "Create Dir: ${WORK_DIR}/${PROJECT_NAME}" fi if [ -e ${WORK_DIR}/${PROJECT_NAME}/Dockerfile ]; then rm -rf ${WORK_DIR}/${PROJECT_NAME}/Dockerfile echo "Remove File: ${WORK_DIR}/${PROJECT_NAME}/Dockerfile" fi cp ./Dockerfile ${WORK_DIR}/${PROJECT_NAME}/ cp ./target/*.jar ${WORK_DIR}/${PROJECT_NAME}/ cd ${WORK_DIR}/${PROJECT_NAME}/ docker build -t ${REGISTRY_URL}/microservice/${PROJECT_NAME}:${PROJECT_VERSION} . docker push ${REGISTRY_URL}/microservice/${PROJECT_NAME}:${PROJECT_VERSION} if docker ps -a | grep ${PROJECT_NAME}; then docker rm -f ${PROJECT_NAME} echo "Remove Docker Container: ${PROJECT_NAME}" fi docker run -d -p 8761:8761 --name ${PROJECT_NAME} ${REGISTRY_URL}/microservice/${PROJECT_NAME}:${PROJECT_VERSION}

优秀的个人博客,低调大师

Docker与自动化部署

Docker安装与基本使用 虚拟机系统centOS7 mini Docker的应用场景 1.简化配置,同一Docker的配置可以在不同 环境中使用,降低了硬件要求和应用环境之间的耦合度.2.代码的流水线管理.代码从开发者的假期到最终在生产环境上的部署,需要经过很多的中间环境.而每一个中间环境都有自己微小的蛤贝,Docker给应用提供一个从开发到上线均一致的环境,让代码的流水线变得简单.3.提高开发效率4.隔离应用,使应用松耦合5.快速部署docker [CMD] [options]基本命令与释义attach进入到正在运行的容器build由Dockerfile构建镜像commit由容器的改变创建一个新的镜像cp在容器中复制文件或文件夹到本地文件或文件夹中.logs获取容器日志network管理Docker网络node管理Docker集群节点pause暂停一个或多个容器内的所有进程port列表端口映射或用于容器的特定的映射ps列出容器pull从镜像仓库中拉出镜像push上传镜像rename重命名镜像restart重启一个容器rm 删除容器rmi删除镜像run在容器中运行命令search在Docker Hub中查找镜像service管理Docker服务start启动停止的容器stats显示容器的实时流资源使用统计信息stop停止正在运行的容器swarm管理Docker集群tag将镜像标记到存储库中top显示容器的正在运行的进程volume管理Docker卷 docker run [options]常用参数与释义(主要介绍docker run) -a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;-d: 后台运行容器,并返回容器ID;-i: 以交互模式运行容器,通常与 -t 同时使用;-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;–name=”nginx-lb”: 为容器指定一个名称;–dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;–dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;-h “mars”: 指定容器的hostname;-e username=”ritchie”: 设置环境变量;–env-file=[]: 从指定文件读入环境变量;–cpuset=”0-2” or –cpuset=”0,1,2”: 绑定容器到指定CPU运行;-m :设置容器使用内存最大值;–net=”bridge”: 指定容器的网络连接类型,支持 bridge/host/none/Container: 四种类型;–link=[]: 添加链接到另一个容器;–expose=[]: 开放一个端口或一组端口; 1.安装Docker2.加入开机启动3.启动Docker4.下载镜像5.查看本地镜像6.启动容器7.查看容器 搭建本地镜像仓库 仓库IP 192.168.247.142 1.拉取registry镜像 2.启动镜像仓库容器并且映射虚拟机端口5000和容器端口5000 3.将本地目录/opt/data/registry挂载到容器内目录/tmp/registry中 4.用busybox做试验 5.在需要拉取镜像的虚拟机上创建/etc/docker/daemon.json(这一步很关键,解决的http和https服务冲突问题) 6.向私有仓库中上传镜像 docker的网络配置 1.查看docker的所有网络 2.指定查看bridge网络的配置 3.启动两个busybox做实验,分别是container1和container2 4.再次查看bridge,这时可以看到container1和container2已经被加入bridge中了 5.也可以进入到container1中,用ifconfig查看网络配置6.ping7.8.自建桥接模式的网络isolated_nw9.查看网络能看到已经建立的isolated_nw10.启动container3时指定网络isolated_nw,则可以加入自建网络中 Tomcat与Mysql 这部分我把网上的教程基本都做了一遍,但是由于我对javaweb项目的结构了解不透彻,web应用部署也不熟悉,所以没能达到预期的要求。以下我分别列出Tocmcat和Mysql容器的启动和使用。还有部分参数解释。 docker run -it –rm -p 8888:8080 tomcat:8.0 虚拟机端口:容器端口 tomcat镜像指定 docker run –name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag指定容器名,mysql密码,镜像 将mysql与web应用容器相连的命令是:docker run –name some-app –link some-mysql:mysql -d application-that-uses-mysql启动web应用容器,用–link连接mysql容器 官方文档指出,–link几乎已经废弃 单容器应用部署实践 说明:部署一个单页面的应用参考网址:https://github.com/docker/labs/blob/master/beginner/chapters/votingapp.md 1.启动容器会自动下载dockersanples/static-site镜像 2.启动容器 3.查看端口 4.查看容器运行情况 5.在浏览器中输入地址和端口号,就可以看到网页 6.创建文件夹flask-app 7.flask-app下有四个文件 8.构建镜像 9.启动容器,将虚拟机8888端口映射到容器的5000端口 10.在浏览器中输入网址,查看运行效果 多容器应用部署实践 说明:用docker compose和docker deploy stack 部署参考网址:https://github.com/docker/labs/blob/master/beginner/chapters/votingapp.md应用说明:该应用基于以下镜像搭建PythonNode.jsredis.netpostgress 1.下载工程 2.创建Docker Swarm 3.docker stack deploy是在Docker Swarm模式下docker-compose的替代 4.查看启动的服务 5.查看容器的运行情况 6.浏览器中输入虚拟机地址,这是5000端口,是投票服务 7.浏览器中输入虚拟机地址,这是5001端口,投票统计服务 8.镜像更新,只需要修改虚拟机中的配置文件9. 10.重启app 11.在浏览器中查看运行情况 12.13.14. Kubernetes安装和配置 1.创建多台centOS7 mini 系统的虚拟机备用2.修改主机名3.设置hosts4.关闭防火墙5.安装etcd6.修改etc配置文件/etc/etcd/etcd.conf7.安装Docker8.修改配置/etc/sysconfig/docker9.将Docker设为开机启动项,启动Docker10.安装Kubernetes11.修改/etc/kubernetes/apiserver12.修改/etc/kubernetes/config13.启动服务并设置开机项自启动14.修改/etc/kubernetes/config15.修改/etc/kubernetes/kubelet16.启动服务并设置开机自启动17.在master上查看节点和各节点状态18.安装flannel19.修改配置/etc/sysconfig/flanneld 用kubeadm安装kubernetes并且部署微服务 因为GFW问题导致遇到很多下载失败问题 1.安装Docker 2.安装k8s工具包 3.kubeadm 初始化 Kuberbernetes基础概念 Pod Pod是Kubernetes的最小操作单元,一个Pod可以由一个或多个容器组成;同一个Pod只能运行在同一主机上,共享相同的volumes,network,namespace ReplicationController(RC) RC用来管理Pod,一个RC可以由一个或多个Pod组成,在RC被创建后,系统会根据定义好的副本数来创建Pod数量.在运行过程中,如果Pod数量小于定义的,就会重启停止的或重新分配Pod,反之则kill多余的.当然,也可以动态伸缩运行的Pods规模或熟悉. Service Service定义了一个Pod逻辑集合的抽象资源,Pod集合中的容器提供相同的共而过.集合根据定义的Label和Selector完成,当创建一个Service后,会分配一个ClusterIP,这个IP与定义的端口提供这个集合一个统一的访问接口,并且实现负载均衡. Label Label是用于区分Pod,Service,RC的key/value键值对;Pod,Service,RC可以有多个label,但是每个label的key只能对应一个;主要是将Service的请求通过label转发给后端提供服务的Pod集合. kubectl 客户端命令行工具,将接受的命令格式化后发送给kube-apiserver,作为整个系统的操作入口. kube-apiserver 作为整个系统的控制入口,以REST API服务提供接口. kube-controller-manager 用来执行整个系统中的后台任务,包括节点状态状况,Pod个数,Pods和Service的关联等. kube-scheduler 负责节点资源管理,接受来自kube-apiserver创建Pods任务,并分配到某个节点. etcd 负责节点间的服务发现和配置共享. kube-proxy 运行在每个计算节点上,负责Pod网络代理.定时从etcd获取到service信息来做相应的策略. kubelet 运行在每个计算节点上,作为agent,节后分配该节点的Pods任务及管理容器,周期性获取容器状态,反馈给kube-apiserver. DNS 一个可选的DNS服务,用于为每个Service对象创建DNS记录,这样所有的Pod就都可以通过DNS访问服务了.

优秀的个人博客,低调大师

Spring自动化装配bean

阅读目录 1. 场景 2. 架构图示 3. 代码 回到顶部 1. 场景 用CD(Compact disc)和CD播放器(CDPlayer)阐述DI(依赖注入)。 如果不将CD插入(注入)到CDPlayer中,那么CDPlayer其实没有太大的用处,所以,可以这样说:CDPlayer依赖于CD才能完成它的使命。 回到顶部 2. 架构图示 回到顶部 3. 代码 接口: CompactDisc.java package soundsystem; public interface CompactDisc { void play(); } 接口: MediaPlayer.java package soundsystem; public interface MediaPlayer { void play(); } SgtPeppers.java package soundsystem; import org.springframework.stereotype.Component; @Component public class SgtPeppers implements CompactDisc { private String title = "Sgt. Pepper's Lonely Hearts Club Band"; private String artist = "The Beatles"; @Override public void play() { System.out.println("Playing " + title + " by " + artist); } } 注:SgtPeppers类上使用了@Component注解。这个简单的注解表明该类会作为组件类,并告知Spring要为这个类创建bean CDPlayer.java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class CDPlayer implements MediaPlayer { private CompactDisc cd; @Autowired public CDPlayer(CompactDisc cd) { this.cd = cd; } @Override public void play() { cd.play(); } } 不过,组件扫描默认是不启用的,我们还需显式配置一下Spring,从而命令它去寻找带有@Component注解的类,并未其创建bean。下例中使用了@ComponentScan注解,这个注解能够在Spring中启用组件扫描。如没有其他配置,@ComponentScan默认会扫描与配置类相同的包:soundsystem CDPlayerConfig.java package soundsystem; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; @Configuration @ComponentScan public class CDPlayerConfig { } 测试CDPlayerTest.java package soundsystem; import static org.junit.Assert.*; import org.junit.Test; import org.junit.contrib.java.lang.system.StandardOutputStreamLog; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes=CDPlayerConfig.class) public class CDPlayerTest { @Autowired private MediaPlayer player; @Autowired private CompactDisc cd; @Test public void cdShouldNotBeNull() { assertNotNull(cd); } @Test public void play() { player.play(); } } 自动装配就是让Spring自动满足bean依赖的一种方法,在满足依赖的过程中,会在Spring应用的上下文中寻找匹配某个bean需求的其他bean。为了声明要进行自动装配,我们借助Spring的@Autowired注解。 上述代码中,在构造器中添加了@Autowised注解,这表明当Spring创建CDPlayer bean的时候,会通过这个构造器来进行实例化,并传入一个可设置为CompactDisc类的bean,在上面的代码中,SgtPeppers被声明为组件,并实现了CompactDisc接口。因此,在实际运行中会把SgtPeppers作为实例化类。 本文转自jihite博客园博客,原文链接:http://www.cnblogs.com/kaituorensheng/p/6942296.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android robotium自动化测试

Robotium是一款测试AndroidApp的测试框架,它使得编写黑盒测试代码更加容易和稳定。它其实是对android自带测试类Instrumentation的一个封装,方便于测试人员直接调用封装好的接口。通过使用Robotium,测试用例开发人员能够跨越多个Activity,开发出功能,系统以及验收测试用例。如果你能够拿到代码,你可以直接进行白盒测试,比如assert一下当前的activity,操作的结果对不对等等,都可以验证。官方例子: http://code.g...m/p/robotium/ 下面的以测试Android自带的NotePad源代码为例: 首先创建一个Android Project,选择Create Project form existing source,选择F:\android-sdk-windows\samples\android-8\NotePad 接下来创建Android Test Project 导入 robotium-solo-2.5.jar(可到官方例子下载,上边的链接),编写自动测试脚本如下: 下面是详细的测试内容: 附上截图的功能: 有时textview或者button的click方法会失效,解决方法是在被测程序的配置文件AndroidManifest.xml文件里加上这么一句: <supports-screens android:anyDensity="true"/>就行了。如果要想在robotium的测试程序里读写SD 卡,可以被测程序的AndroidManifest.xml文件里加上 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>。 注意是在被测程序里加上。 本文转自06peng 51CTO博客,原文链接:http://blog.51cto.com/06peng/962867,如需转载请自行联系原作者

资源下载

更多资源
Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册