豆子需要在一些服务器上安装Java服务并保证更新版本。之前都是手动定期检查,现在考虑能否自动化一下这个流程。豆子考虑了Powershell 的Invoke-commnad,Powershell DSC或者GPO来实现。GPO用过很多次了,这里就不尝试了。
首先我试了试invoke-command的命令。这个思路很简单,远程直接执行exe文件就行了。刚开始没反应,后来发现必须以管理员身份执行才可以。注意invoke-command里面不可以访问网络资源,因此我首先需要拷贝到本地路径才行。
out-null是为了保证该复制命令完成才执行下一条; -verb runas 表示以管理员身份执行;-passthrough 是显示后台进程
new-item \\sydittest\temp\jre8.exe -forcecopy-item C:\test\jre8.exe \\sydittest\c$\temp\jre8.exe | out-nullinvoke-Command -ComputerName sydittest -ScriptBlock { Start-Process -filepath "c:\temp\jre8.exe" -argumentlist "/s /L c:\temp\install.txt" -Verb runas -PassThru -Wait }
成功!
第二种方式我尝试了PowerShell DSC的push模式。
最初我打算直接使用EXE文件,但是没反应,整个推送LCM就卡死了,状态显示正在更新~~
我估计这货不认EXE,于是把MSI从EXE文件里面给解压出来。解压方式很简单,直接点安装,他会自动解压出对应的MSI文件。Java的MSI文件不齐全,如果需要的话,还需要用Orca之类的MSI工具添加属性,这里我只是验证一下思路,就不去补齐属性了。用过GPO配置MSI文件的话,对于Orca应该很熟悉。
自动解压出来的MSI文件。
Okay,现在来配置一下DSC。
首先把客户端配置成Push模式,推送配置文件
[DSCLocalConfigurationManager()]Configuration LCM_Push {Node sydittest{Settings{AllowModuleOverwrite = $True ConfigurationMode = 'ApplyAndAutoCorrect'RefreshMode = 'Push' }}}LCM_Push -instancename sydittest -OutputPath C:\DSC\Mod5ConfigSet-DSCLocalConfigurationManager -ComputerName sydittest -Path c:\DSC\mod5Config –VerboseGet-DscLocalConfigurationManager -CimSession sydittest
确认模式配置成功
然后看具体的资源配置
首先复制一个MSI文件到客户端,然后安装
configuration Testmsi { Node sydittest { File MSIFile { Ensure = "Present" Type = "Directory“ # Default is “File” Force = $True Recurse = $True SourcePath = '\\sydit01\test2' DestinationPath = 'C:\Downloads' # On Sydittest } Package InstallJava { Ensure = "Present" Name='Java 8 Update 71 (64-bit)' path='c:\downloads\jre1.8.0_71.msi' productid="26A24AE4-039D-4CA4-87B4-2F86418071F0" dependson='[file]msifile' } }}Testmsi -OutputPath c:\temp\nscpconfigStart-DscConfiguration -computername sydittest -Path c:\temp\nscpConfig -Wait -Verbose -force
效果如下
成功安装!
配合豆子之前写过的程序 (http://beanxyz.blog.51cto.com/5570417/1695998),可以查看指定软件在不同机器上的安装版本编号,我可以完全用脚本来实现Java的版本比较,卸载和更新了。