【问题标题】:Silently Uninstall Tomcat on Windows via Ansible通过 Ansible 在 Windows 上静默卸载 Tomcat
【发布时间】: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 根目录中删除文件夹,除了 binconfliblogswebapps。此外,这两个选项都不会删除注册表项或 tomcat 服务,并且 tomcat 仍然列在“程序和功能”列表中。

在中间添加“/S”参数

& "C:\Program Files\Apache Software Foundation\Tomcat 8.0\Uninstall.exe" /S -ServiceName="Tomcat8"

手动运行上面的命令可以完美运行(它会留下conflogswebapps 目录,但这是意料之中的——请参阅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


    【解决方案1】:

    我最终使用 win_shell 调用卸载程序,但我不得不在任务结束时添加一个睡眠。在没有睡眠的情况下,唯一发生的变化是删除了 Uninstall.exe:

    - name: Uninstall Tomcat
      win_shell: |
        $CMD = 'C:\Program Files\Apache Software Foundation\Tomcat 7.0\Uninstall.exe'
        $arg1 = '/S'
        $arg2 = '-ServiceName="Tomcat7"'
        & $CMD $arg1 $arg2
        Start-Sleep -s 30 
    

    【讨论】:

    • 顺便说一句,这是原始发布者解决方案尝试的变体。
    • 在运行此卸载之前,我必须停止 Tomcat8 服务。它仍然使服务处于“标记为删除”状态。事实证明,托盘图标实用程序锁定了服务,因此我不得不终止任务:taskkill /F /IM Tomcat8w.exe。但是你的ansible代码是唯一真正触发卸载的东西。没有其他工作。谢谢!!
    【解决方案2】:

    我想出了如何使用 win_package 模块成功卸载。您需要指定 Uninstall.exe 文件(在 tomcat 根目录内)而不是原始安装程序文件。

    - name: Uninstall Tomcat
      win_package:
        path: 'C:\Program Files\Apache Software Foundation\Tomcat 8.0\Uninstall.exe'
        product_id: 'Apache Tomcat 8.0 Tomcat8'
        arguments: '/S -ServiceName="Tomcat8"'
        state: absent
    

    【讨论】:

      【解决方案3】:

      我知道你说你更喜欢 win_package,但我想建议使用 choco?

      - name: Install Tomcat with Chocolatey
        win_chocolatey:
          name: tomcat
          state: present
          version: '8.5.12'
      
      - name: Uninstall Tomcat with Chocolatey
        win_chocolatey:
          name: tomcat
          state: absent
        no_log: True
      

      http://docs.ansible.com/ansible/latest/win_chocolatey_module.html https://chocolatey.org/packages/Tomcat/8.5.12

      【讨论】:

        猜你喜欢
        • 2013-03-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-04
        • 2017-09-10
        • 2011-09-11
        • 2018-07-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多