我怎样才能抽象出 Ansible 角色?

我怎样才能抽象出 Ansible 角色?

我的基础架构中有 2 个不同的数据库实例,每个实例用于保存不同的数据,每个实例在不同的机器上运行,并且每个实例都需要不同级别的可用性和安全性,因此虽然它们都使用 Postgresql 作为数据库,但由于它们在我的基础架构中扮演不同的“角色”,我已在 ansible 代码中编写了不同的角色,以便设置它们并准备好处理请求。我们称它们为数据库AB
因为A我需要一个由管理的副本,它在单独的机器上运行,并且我的代码中还有另一个角色,它使用特定于的配置repmgr设置了的副本。由于和的副本是AAAA不是可互换,它们不属于库存文件中的同一组,并且我有一个A组和一个A_replica组,它们明显不同。
现在,我想添加 的副本B,使用repmgr与 的副本相同的代码A,但我看不到重用我为 编写的代码的方法A,因为它们的不同之处在于:

  • hosts剧本中的任务是按照这个方式运行的,
  • 指令中用于template生成配置文件的一些变量。默认情况下,我在 中定义这些变量group_vars,但我不知道如何在剧本中定义它们,特别是包含其他(低级)剧本的剧本

有解决方案吗?还是我应该直接复制粘贴代码B
非常感谢。

答案1

首先,对于hosts目标,你可以将其设置为额外变量在命令行上(你可以找到另一个使用 extra-vars 的示例这里)。

如果你在模板文件中针对两种情况分别使用不同的变量,请确保检查变量是否指定然后再继续。然后,使用host_vars而不是group_vars

希望这可以帮助!

答案2

我的代码中的另一个角色是设置A具有特定配置的副本A

为了最大程度地重复使用,提取全部配置可以分为变量和模板。主/次布尔值、主机名和端口、用户和机密。概括可能意味着更聪明,例如根据是否需要副本在模板中使用 if 语句。抽象的成功意味着您(或其他人,如果您在 Galaxy 上发布!)可以在其他项目中重复使用该角色。

默认情况下,我在 group_vars 中定义这些,但我不知道如何在剧本中定义它们,特别是包含其他(低级)剧本的剧本

有很多地方可以放置变量:变量优先级:我应该把变量放在哪里?

您始终创建的管理员用户可以是默认角色,“我是副本”布尔值可能位于组变量中,特定数据库的复制名称可能位于主机变量中。这样,您可以运行游戏,hosts: A_replica,B_replica但每个游戏都使用一些独特的配置。

制作“子类”角色的一个有效方法是使用角色依赖关系. 创建一个功能齐全但抽象的角色db. 为数据库的每个实例创建角色db-adb-b每个角色在其元中都具有依赖关系db。 A 和 B 角色只需提供不同的变量,可能还有一两个任务。

相关内容