Предположим, у меня есть хост, который, помимо прочего, является веб-сервером, на котором устанавливается соответствующая роль Ansible. nginx
, выполняет некоторые важные настройки в /etc/nginx
, и открывает порты 80 и 443 в брандмауэре.
В какой-то момент я хочу, чтобы этот конкретный хост больше не был веб-сервером, потому что по какой-то причине я переместил эту службу в другое место. Просто удалите сервер из [webservers]
в инвентаре оставил бы мусор на сервере. В идеале я бы хотел удалить nginx
, удалить /etc/nginx
каталог (и некоторые другие каталоги) и закройте порты 80 и 443 в брандмауэре.
В Puppet я могу это сделать. Хост, который является веб-сервером, будет иметь что-то вроде этого в своей конфигурации:
class { 'nginx':
ensure => present,
}
и все, что мне нужно сделать, это заменить «присутствует» на «отсутствует». Если nginx
class хорошо написан, он отменяет сделанные изменения. (Обычно администратор заменяет «присутствует» на «отсутствует», а позже, когда он будет уверен, что все затронутые хосты отменили конфигурацию, он удалит элемент из манифеста.)
Более того, я думаю, что модуль брандмауэра Puppet автоматически удаляет правила брандмауэра, которые больше нельзя найти в манифесте; поэтому я думаю, что для брандмауэра вам даже не нужно делать это "отсутствующее" выше, брандмауэр все равно автоматически закроется.
Как я могу добиться этого с помощью Ansible?
С Ansible вы не будете делать это иначе, чем с Puppet.
В вашем примере, где вы бы установили
class { 'nginx':
ensure => absent,
}
вы полагаетесь на то, что автор этого марионеточного модуля написал необходимый код для удаления всего. Это есть не в каждом марионеточном модуле.
Точно так же с Ansible у вас могут быть роли, в которых есть как необходимые шаги для его установки, так и для его удаления. Разница только в том, как их вызывать.
Один из подходов может заключаться в том, что рассматриваемая роль предоставляет переменную для переключения поведения. Например, эта роль nginx может принимать переменную nginx_state
который принимает значения installed
и absent
.
В роли tasks/main.yml
, у автора роли может быть что-то вроде ..
- include: install.yml
when: nginx_state|default('present') == "present"
- include: uninstall.yml
when: nginx_state|default('present') == "absent"
..с соответствующей логикой установки / удаления, разделенной между этими двумя условно включенными файлами.
Ansible роли также могут быть вложенными. В качестве другого способа сделать то же самое, автор роли может, например, предоставить роль nginx
с другой ролью внутри, называемой uninstalled
. Затем вы можете сделать:
- name: Uninstall nginx
hosts: some_group
roles:
- nginx/uninstalled
Ansible, по сравнению с Puppet, вероятно, имеет меньше правил и рекомендаций о том, как что-то должно быть сделано, поэтому практики немного различаются в естественных условиях, но применяются те же концепции.
Поскольку у вас есть конфигурация / инициализация в Ansible, вы можете просто удалить весь сервер, переустановить / подготовить новый и получить хорошее чистое известное состояние для его работы.
Если вы действительно хотите «перенастроить» его для других целей, вам нужно будет создать новую книгу воспроизведения, которая выполняет необходимые задачи очистки.
Насколько мне известно, все Ansible упаковочные модули служба поддержки state=absent
чтобы гарантировать, что данный пакет не установлен на вашем сервере. Дополнительно, apt
модуль имеет purge=yes
параметр, который очистит все оставшиеся настроенные файлы конфигурации.
Вы также можете создавать задачи, чтобы подтвердить, что порт 80 защищен брандмауэром. Однако, поскольку у вас не будет никаких процессов, запущенных на этом порту, его брандмауэр не повлияет на безопасность вашего сервера.