豆子需要在一些服务器上安装Java服务并保证更新版本。之前都是手动定期检查,现在考虑能否自动化一下这个流程。豆子考虑了Powershell 的Invoke-commnad,Powershell DSC或者GPO来实现。GPO用过很多次了,这里就不尝试了。
首先我试了试invoke-command的命令。这个思路很简单,远程直接执行exe文件就行了。刚开始没反应,后来发现必须以管理员身份执行才可以。注意invoke-command里面不可以访问网络资源,因此我首先需要拷贝到本地路径才行。
out-null是为了保证该复制命令完成才执行下一条; -verb runas 表示以管理员身份执行;-passthrough 是显示后台进程
1
2
3
|
new-item
\\sydittest\temp\jre8.exe -force
copy-item
C:\test\jre8.exe \\sydittest\c$\temp\jre8.exe |
out-null
invoke-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模式,推送配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
[DSCLocalConfigurationManager()]
Configuration LCM_Push
{
Node sydittest
{
Settings
{
AllowModuleOverwrite =
$True
ConfigurationMode =
'ApplyAndAutoCorrect'
RefreshMode =
'Push'
}
}
}
LCM_Push -instancename sydittest -OutputPath C:\DSC\Mod5Config
Set-DSCLocalConfigurationManager
-ComputerName sydittest -Path c:\DSC\mod5Config –Verbose
Get-DscLocalConfigurationManager
-CimSession sydittest
|
确认模式配置成功
然后看具体的资源配置
首先复制一个MSI文件到客户端,然后安装
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
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\nscpconfig
Start-DscConfiguration
-computername sydittest -Path c:\temp\nscpConfig -Wait -Verbose -force
|
效果如下
成功安装!
配合豆子之前写过的程序 (http://beanxyz.blog.51cto.com/5570417/1695998),可以查看指定软件在不同机器上的安装版本编号,我可以完全用脚本来实现Java的版本比较,卸载和更新了。