假设我有一个主机,其中包括一个Web服务器,相关Ansibleangular色安装nginx ,在/etc/nginx执行一些必要的configuration,并在防火墙中打开端口80和443。
在某些时候,我希望那个特定的主机不再是一个Web服务器,因为我由于某种原因将其他服务移到了其他地方。 只需从库存中的[webservers]中删除服务器就会在服务器中留下垃圾。 理想情况下,我想卸载nginx ,删除/etc/nginx目录(和其他一些目录),并closures防火墙中的端口80和443。
在木偶,我可以做到这一点。 作为Web服务器的主机在其configuration中将具有类似这样的内容:
class { 'nginx': ensure => present, }
而我所要做的就是用“缺席”取代“现在”。 如果nginx类写得很好,它将撤消它所做的更改。 (通常,pipe理员将“存在”replace为“不存在”,之后,当他确定所有受影响的主机都撤消了configuration时,他将从清单中删除该项目。)
更重要的是,我认为Puppet防火墙模块会自动删除在清单中找不到的防火墙规则; 所以我认为,对于防火墙,你甚至不需要做那个“缺席”的事情,防火墙也会自动closures。
我怎样才能用Ansible来实现这些?
与Ansible,你不会真的这样做与Puppet如何做。
在你的例子中,你将设置
class { 'nginx': ensure => absent, }
你是依靠这个傀儡模块的作者写了必要的代码来处理一切事情。 不是每个傀儡模块都有这个。
类似地,对于Ansible,您可能具有既安装又删除它的必要步骤的angular色。 区别只在于如何调用这两个。
一种方法可能是所涉及的angular色暴露variables来切换行为。 例如,那个nginxangular色可能需要一个variablesnginx_state ,它取得installed和absent的值。
在angular色的tasks/main.yml ,angular色的作者可能有一些东西。
- include: install.yml when: nginx_state|default('present') == "present" - include: uninstall.yml when: nginx_state|default('present') == "absent"
..相应的安装/卸载逻辑在这两个有条件包含的文件之间被分开。
Ansibleangular色也可以嵌套。 作为另一种方法,angular色作者可能会提供一个angular色nginx其中包含另一个angular色,称为uninstalled 。 你可以这样做:
- name: Uninstall nginx hosts: some_group roles: - nginx/uninstalled
Ansible相对于Puppet来说,可以说没有什么规则和指导方针可以做,所以做法会有所差异,但同样的概念也适用。
由于您在Ansible中有自己的configuration/configuration,因此您可以简单地将整个服务器吹走,重新安装/configuration一个新的服务器,并且拥有一个干净的已知状态。
如果你真的想“重新configuration”它用于其他目的,那么你需要创build一个新的剧本,执行必要的清理任务。
据我所知,所有Ansible 打包模块都支持state=absent以确保给定的软件包没有安装在您的服务器上。 此外, apt模块具有purge=yes参数,将清除所有剩余的自定义configuration文件。
您也可以创build任务来确认端口80被防火墙。 但是,由于您不会在该端口上运行任何进程,因此防火墙对您服务器的安全性没有任何影响。