Удаление Tomcat в Windows без вывода сообщений через Ansible
Ansible Control Specs
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 (поэтому это должно быть сделано в автоматическом режиме, без взаимодействия с пользователем).
Я могу успешно установить Tomcat с помощью установщика Windows, как это:
- 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
каталоги, но это ожидается - см. этот пост). Но запуск через ansible просто удаляет файл Uninstall.exe из корня tomcat - и все! Он не удаляет ничего другого из корня tomcat, ни элементов реестра, ни службы tomcat. И все же перечислены в списке "Программы и компоненты".
Вот тот синтаксис, который я использую:
- name: Uninstall Tomcat
win_shell: '& "C:\Program Files\Apache Software Foundation\Tomcat 8.0\Uninstall.exe" /S -ServiceName="Tomcat8"'
Почему команды "ручной" и "ANSIBLE" ведут себя одинаково, помещая "/S" в конце, а затем ведут себя совершенно иначе, когда "/S" ставят в середине?
2 ответа
В итоге я использовал 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
Я понял, как успешно удалить с помощью модуля 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
Я знаю, что вы сказали, что предпочитаете 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