处理 Ansible 角色间依赖关系的最佳实践

处理 Ansible 角色间依赖关系的最佳实践

我目前正在使用 ansible 迈出第一步,所以这可能是一个基本问题。

我正在尝试使用 ansible 配置一个服务器,该服务器托管几个网页,并公开许多其他服务。对于其中每一个,我可以选择能够

  • 使用作为服务之一的名称服务器注册子域名
  • 使用 Let's Encrypt 为服务颁发证书
  • 在我的防火墙中打开 sme 端口

我目前还负责设置名称服务器、让我们加密和防火墙。角色之间进行通信的最佳实践是什么?例如,Web 服务器角色是否应该知道如何为自己创建证书的确切命令,或者是否有办法将其抽象为通知调用?每个服务角色是否应该能够写入我的防火墙配置文件,或者这应该是防火墙角色的某种特权?

也许我太过于偏向程序员的思维了,但是我喜欢“关注点分离”这样的东西,而且我希望能够改变我的防火墙软件而不必改变其他所有角色。

答案1

由于显而易见的原因,不可能对您的问题提供确切的答案,但至少让我指出一些问题,其中一些从程序员的角度来看很容易理解:

  1. 将数据和逻辑分开。ansible提供了使这一任务变得简单的方法,但您需要以功能性的方式创建您的角色,也就是说,使您的角色可以通过数据进行配置。

  2. 编写角色时,让它们只做一件事,但要做好。这可以提高角色的可重用性,并简化后续维护。

  3. 在定义驱动角色行为的数据时,不要设计过于复杂的数据结构。ansible有相当多的迭代器可供您使用,甚至还提供编写自己的迭代器的能力,但如果您发现自己需要比更复杂的东西with_subelements,那么是时候重新考虑您的数据结构了。

  4. 使用标签。您可以使用组和标签的组合来确定操作范围。

  5. 使用registers 来捕获操作的结果,并在后续操作中使用它们来使用when语句控制流程。不过,不要让条件过于复杂。

  6. set_factsassert有助于收集有关目标系统状态的数据。

  7. 幂等性。保持你的操作幂等,这样你就不需要在你的操作之上构建太多逻辑。从目标状态(期望状态)的角度来思考,而不是从程序语言的角度来思考。

相关内容