如何清除服务器上不再使用的角色中的内容?


15

假设我有一个主机,其中包括Web服务器,相关的Ansible角色将nginx在其中安装,在其中执行一些基本配置/etc/nginx,并在防火墙中打开端口80和443。

在某些时候,我希望该特定主机不再是Web服务器,因为出于某种原因,我将该服务移到了其他地方。仅从[webservers]清单中删除服务器会在服务器中留下垃圾。理想情况下,我想卸载nginx,删除/etc/nginx目录(和其他一些目录),并关闭防火墙中的端口80和443。

在Puppet中,我可以做到这一点。作为Web服务器的主机在其配置中将具有以下内容:

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

我要做的就是用“缺席”代替“出席”。如果nginx该类写得很好,它将撤消其所做的更改。(通常,管理员将“ present”替换为“ absent”,稍后,当他确定所有受影响的主机都撤消了配置后,他将从清单中删除该项目。)

而且,我认为Puppet防火墙模块会自动删除清单中找不到的防火墙规则。因此,我认为,对于防火墙,您甚至不需要执行上面的“缺少”操作,防火墙将自动关闭。

我如何通过Ansible实现这些目标?


1
我认为这里的假设问题并不是真正的话题,尽管您的问题本身并非没有道理。而不是“让我们假装......”改写说例如“在木偶我可以改变一个服务器角色和卸载nginx的这是通过改变以前安装ensure => present ensure => absent这也将...如何做同样的ansible”等。理想举一个您已经尝试过的例子。
HBruijn 2014年

2
我会说Ansible并不是真的为这种事情设计的。它针对可重复使用的一次性服务器。如果您不再希望一台机器成为网络服务器,则只需擦除它(如果是云实例,则将其终止),而不用重新使用它。
ceejayoz 2014年

@ceejayoz,我对Ansibles的了解最多,是在Orson Scott Card Card的《Ender's Game&sequals》中,但是您所说的在云编排中很有意义
HBruijn 2014年

@ceejayoz:我目前不使用Ansible进行多服务器设置,而是配置小型自主服务器。我认为这是一种有效的用法。因此,服务器可以具有nginx + django + PostgreSQL。如果以后我决定将nginx或nginx + django放在其他地方,则要删除整个服务器并需要从备份中恢复PostgreSQL似乎不是最佳选择(更不用说停机时间了)。
Antonis Christofides 2014年

Answers:


10

使用Ansible,您将不会像使用Puppet那样真正地完成此操作。

在您的示例中,您将设置

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

您依靠该人偶模块的作者编写了必要的代码来处理删除所有内容。并非每个人偶模块都具有此功能。

同样,使用Ansible,您可能拥有的角色具有安装和删除它的必要步骤。区别仅在于如何调用两者。

一种方法可能是,所讨论的角色公开一个变量以切换行为。例如,该nginx角色可能采用一个变量nginx_state,该变量采用值installedabsent

在角色中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

与Puppet相比,Ansible可以说应做的事情的规则和准则较少,因此实践在野外的变化更大,但适用相同的概念。


1
从技术上讲,您也可以将参数直接传递给角色,但我建议您使用嵌套角色。我会发现在剧本中扮演某些角色真的很奇怪,因为实际上在剧本中定义的变量会在剧本执行时将其卸载。通过嵌套角色将其明确显示似乎更加简洁。从技术上讲,可以将参数传递给角色(- { role: nginx, state: absent }),但是在我看来,它非常冗长。我看到的嵌套角色的唯一缺点是,我需要从父级链接默认变量。
bogdan.mustiata

您需要做什么roles: -nginx/uninstalled才能工作?我到处都看过,但是找不到任何有关嵌套角色的文档,因此我无法做到这一点。
汇总

1

由于您在Ansible中进行了配置/配置,因此您可以轻松地删除整个服务器,重新安装/配置一台新服务器,并拥有一个良好的已知运行状态。

如果您实际上要“重新配置”它以用于其他目的,则需要创建一个新的剧本来执行必要的清理任务。

据我所知,所有Ansible 打包模块都支持state=absent确保您的服务器上未安装给定的软件包。此外,apt模块具有purge=yes将清除所有剩余的自定义配置文件的参数。

您也可以创建任务以确认端口80是否已防火墙。但是,由于该端口上将没有任何进程在运行,因此对其进行防火墙保护不会对服务器的安全性产生任何影响。


除此之外,我敢打赌该角色中的大多数角色都可以state=absent增加。很可能会删除或撤消您所做的大部分配置更改。根据角色的大小,这可能是要测试的真实PITA。
Christopher Karel 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.