Как очистить вещи от ролей, которые больше не используются на сервере?

15

Предположим, у меня есть хост, который, помимо прочего, является веб-сервером, на котором устанавливается соответствующая роль Ansible nginx, выполняет некоторые важные настройки /etc/nginxи открывает порты 80 и 443 в брандмауэре.

В какой-то момент я хочу, чтобы этот конкретный хост больше не был веб-сервером, потому что по какой-то причине я переместил этот сервис в другое место. Простое удаление сервера из [webservers]инвентаря оставит мусор на сервере. В идеале я хотел бы удалить nginx, удалить /etc/nginxкаталог (и некоторые другие каталоги) и закрыть порты 80 и 443 в брандмауэре.

В Puppet я могу это сделать. Хост, являющийся веб-сервером, будет иметь такую ​​конфигурацию:

class { 'nginx':
  ensure => present,
}

и все, что мне нужно сделать, это заменить «настоящее» на «отсутствующее». Если nginxкласс хорошо написан, он отменит внесенные изменения. (Обычно администратор заменяет «присутствует» на «отсутствует», и позже, когда он уверен, что все затронутые хосты отменили конфигурацию, он удалит элемент из манифеста.)

Более того, я думаю, что модуль межсетевого экрана Puppet автоматически удаляет правила межсетевого экрана, которые больше не могут быть найдены в манифесте; поэтому я думаю, что для брандмауэра вам даже не нужно делать эту «отсутствующую» вещь выше, брандмауэр автоматически все равно закроется.

Как я могу достичь этих вещей с Ansible?

Антонис Христофидес
источник
1
Я думаю, что гипотетические вопросы на самом деле не имеют отношения к теме, хотя сам ваш вопрос не лишен достоинств. Вместо «давайте притворимся ...» перефразируем и скажем, например: «В кукольном я могу изменить роль сервера и удалить ранее установленный nginx, изменив ensure => present на ensure => absentкоторый также ... Как сделать то же самое с ansible» и т. Д. В идеале с примером всего, что вы уже попробовали.
HBruijn
2
Я бы сказал, что Ansible на самом деле не предназначен для такого рода вещей. Он нацелен на воспроизводимые одноразовые серверы. Если вы больше не хотите, чтобы машина была веб-сервером, просто стереть ее (или прервать, если это облачный экземпляр), а не использовать ее заново.
ceejayoz
@ceejayoz больше всего я читал об Ansibles в «Игре и сиквалах » Эндера с карточкой Орсона Скотта, но то, что вы говорите, имеет большой смысл в облачной оркестровке
HBruijn
@ceejayoz: В настоящее время я не использую Ansible для настройки нескольких серверов, а для настройки небольших автономных серверов. Я думаю, что это правильное использование. Таким образом, сервер может иметь nginx + django + PostgreSQL. Если позже я решу поместить nginx или nginx + django в другое место, уничтожение всего сервера и необходимость вернуть PostgreSQL из резервной копии будет казаться неоптимальным (не говоря уже о времени простоя).
Антонис Христофидес

Ответы:

10

С 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, возможно, имеет меньше правил и руководств о том, как нужно действовать, так что практики немного отличаются в дикой природе, но применяются те же понятия.

Ник Гроенен
источник
1
Хотя технически вы также можете передавать аргументы прямо в роли, я бы рекомендовал использовать вложенную роль. Мне было бы очень странно видеть в пьесе какую-то роль, которая фактически будет удалена при исполнении playbook, поскольку в переменных она определена как таковая. Явное выражение через вложенную роль кажется намного чище. Технически можно передавать аргументы в роль ( - { role: nginx, state: absent }), но мне она кажется очень многословной. Единственный недостаток вложенной роли, который я видел, заключался в том, что мне нужно было связать переменные по умолчанию с родителем.
bogdan.mustiata
Что нужно сделать для того, roles: -nginx/uninstalledчтобы работать? Я посмотрел повсюду, но не могу найти какую-либо документацию о роли вложений таким образом, чтобы я мог это сделать.
aggregate1166877
1

Поскольку у вас есть конфигурация / инициализация в Ansible, вы можете просто сдуть весь сервер, переустановить / подготовить новый и получить хорошее чистое известное состояние для его работы.

Если вы действительно хотите «перенастроить» его для других целей, вам нужно будет создать новую пьесу, которая выполняет необходимые задачи по очистке.

Насколько мне известно, все модули упаковки Ansible поддерживают, state=absentчтобы гарантировать, что данный пакет не установлен на вашем сервере. Кроме того, aptмодуль имеет purge=yesпараметр, который будет очищать все оставшиеся настроенные файлы конфигурации.

Вы также можете создавать задачи для подтверждения того, что порт 80 защищен брандмауэром. Однако, поскольку у вас не будет никаких процессов, запущенных на этом порту, брандмауэр не будет иметь никакого значения для безопасности вашего сервера.

Mxx
источник
Чтобы добавить к этому, я держу пари, что большинство пьес в этой роли могли бы быть state=absentдобавлены. Есть хороший шанс, что удалит или отменит значительное большинство изменений конфигурации, которые вы сделали. В зависимости от того, насколько велика роль, это может быть реальная проверка PITA.
Кристофер Карел