如何处理从Ansible资源清册组中删除的主机?

如何处理从Ansible资源清册组中删除的主机?,ansible,Ansible,由于主机完全不可用或已重新调整用途,如何处理从Ansible资源清册组中删除主机的操作 让我举一个简单的例子,说明3个(示范性)可扮演的角色。它们并不代表实际做了什么,但有助于解释我的问题: Web服务器角色安装特定的Web服务器应用程序,将HTML内容复制到目标主机,并在防火墙中打开端口80和/或443(例如,使用) Kubernetes角色将主机加入现有Kubernetes群集。为了使网络正常工作,它会打开受影响主机和所有其他群集成员上的防火墙端口 NodeExporter角色在防火墙中安

由于主机完全不可用或已重新调整用途,如何处理从Ansible资源清册组中删除主机的操作

让我举一个简单的例子,说明3个(示范性)可扮演的角色。它们并不代表实际做了什么,但有助于解释我的问题:

  • Web服务器角色安装特定的Web服务器应用程序,将HTML内容复制到目标主机,并在防火墙中打开端口80和/或443(例如,使用)
  • Kubernetes角色将主机加入现有Kubernetes群集。为了使网络正常工作,它会打开受影响主机和所有其他群集成员上的防火墙端口
  • NodeExporter角色在防火墙中安装并打开其端口,以允许来自特定Prometheus服务器的传入连接
主剧本将角色应用于相应库存组中的主机

现在考虑2种情况。

  • 主机是nodeexporter和Web服务器组的成员。主机需要重新用于其他目的,因此需要从Web服务器资源清册组中删除。这仍然使端口80/443保持打开状态
  • 物理主机是nodeexporter和kubernetes资源清册组的成员。机器有缺陷,已完全从系统中移除。这使得所有剩余Kubernetes节点上的旧IP防火墙规则保持打开状态
  • 我编写角色的方式是添加/确保防火墙端口之类的东西。nodeexporter角色服务器就是一个例子,说明了为什么我不能简单地刷新防火墙。那么,如果主机将组留给主机本身和其他受影响的主机(如Kubernetes示例中的主机),如何确保状态正确

    我目前针对Kubernetes案例的解决方法是在每个主机上维护一个自动生成的文件,其中包含允许的IP地址列表。这(在每个剧本运行中)与实际授予的IP匹配。此方法无法很好地解决的问题,例如,如果团队离开,安装的软件包可能会过时

    有更好的方法吗

    有更好的方法吗

    处理此问题的典型方法是,在将服务器重新部署到其他角色时,从头开始重新部署服务器。这可确保服务器从已知状态启动,并避免因过时的包/防火墙配置/其他不适合新角色的系统配置而导致的问题

    如果您已经在使用Ansible进行配置管理,那么这应该是一个简单的过程:

    • 使用一些自动安装机制为服务器提供基本操作系统
    • 用你的剧本做其他事情

    我在以前的项目中使用了两种方法来解决这种行为:

    • 使用a:在这种情况下,您可以根据自己的规则(主机名、操作系统、位置、环境变量等)以编程方式将主机分配给组。只要机器很少,并且库存代码很快,就可以很好地工作
    • 使用以主机为中心的方法:在这种情况下,对于每个主机,您安装ansible并使用命令
      ansible inventory
      而不是
      ansible playbook
      克隆playbook并仅对本地主机执行。Playbook执行可以检索一些信息(主机名、操作系统、位置、环境变量等)来调节执行。我更喜欢这种方法,因为您可以在每次启动时自动执行配置(第一次安装,下次升级)。缺点:所有虚拟机上都需要ansible
    为了解决第二种情况,我重建了一个完整的配置文件,它是要应用的新引用。每次添加或删除机器时,您都必须这样做。使用Ansible时,必须考虑“最终状态”,新配置文件是必须删除旧配置文件的新状态:

    • 有了动态资源清册,很容易做到:为每个主机生成所有新的防火墙规则,并在需要时应用它们
    • 使用以主机为中心的方法会更加复杂,因为每个主机都不知道其他主机。在这个问题中有一些解决方案,但过于复杂,无法描述

    但我的第二个例子(Kubernetes)怎么样?在这个例子中,主人的存在或不存在会对其他人产生影响?谢谢你的回答。不过,这对案例2)有何帮助?在案例2中,我需要删除
    ufw
    规则,允许从其余主机中删除主机的ip地址?