【发布时间】:2018-05-11 04:37:35
【问题描述】:
Ansible 控制规范
OS: RHEL 6.8 (Santiago)
Ansible version: 2.3.2.0
Python version: 2.6.6
目标机器规格
OS: Windows 2008 Server R2
Tomcat version: 8.0.41
使用 win_package 模块(首选)
我正在尝试使用 Ansible 自动安装/卸载 tomcat(因此需要静默完成,无需用户交互)。
我可以像这样使用 Windows 安装程序成功安装 tomcat:
- name: Install Tomcat
win_package:
path: "https://archive.apache.org/dist/tomcat/tomcat-8/v8.0.41/bin/apache-tomcat-8.0.41.exe"
product_id: "Apache Tomcat 8.0 Tomcat8"
arguments: /S
但是,我在卸载软件时遇到问题。我尝试使用与上述类似的方法(并添加选项“状态:缺席”),但没有运气。我试过下载安装程序,并使用本地路径。并且还尝试省略“参数”选项。
使用 win_shell 模块
我检查了注册表项:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Apache Tomcat 8.0 Tomcat8,发现“UninstallString”属性包含以下内容:"C:\Program Files\Apache Software Foundation\Tomcat 8.0\Uninstall.exe" -ServiceName="Tomcat8"。
当然,在目标机器上手动运行这个确切的命令是可行的,但是通过 ansible 运行它会挂起(因为它不是静默的)。
在末尾添加“/S”参数
& "C:\Program Files\Apache Software Foundation\Tomcat 8.0\Uninstall.exe" -ServiceName="Tomcat8" /S
运行上面的命令不能手动和通过 ansible 工作(完全相同的行为)。两种方式都会从 tomcat 根目录中删除文件夹,除了 bin、conf、lib、logs 和 webapps。此外,这两个选项都不会删除注册表项或 tomcat 服务,并且 tomcat 仍然列在“程序和功能”列表中。
在中间添加“/S”参数
& "C:\Program Files\Apache Software Foundation\Tomcat 8.0\Uninstall.exe" /S -ServiceName="Tomcat8"
手动运行上面的命令可以完美运行(它会留下conf、logs 和webapps 目录,但这是意料之中的——请参阅this post)。但是通过 ansible 运行只会从 tomcat 根目录中删除 Uninstall.exe 文件 - 就是这样!它不会从 tomcat 根目录、注册表项和 tomcat 服务中删除任何其他内容。并且仍然列在“程序和功能”列表中。
这是我正在使用的 ansible 语法:
- name: Uninstall Tomcat
win_shell: '& "C:\Program Files\Apache Software Foundation\Tomcat 8.0\Uninstall.exe" /S -ServiceName="Tomcat8"'
为什么手动和 ansible 命令在将“/S”放在末尾时表现相同,但在将“/S”放在中间时表现完全不同?
【问题讨论】:
标签: windows tomcat ansible uninstallation silent