如何在 git 中管理具有可交换库存的可靠项目结构

How to manage an ansible project structure with exchangable inventories in git

我正在编写一些通过 git 进行版本控制的 ansible 剧本。我想在两个不同的服务器(控制节点,为简洁起见:node-a 和 node-b)上维护相同的角色和剧本,但在这些控制节点上有两个独立的清单。这些库存需要分开(即节点 a 的库存应该只存在于节点 a 上,不能从节点 b 访问,反之亦然)。目前我的项目结构是 alternate best practices layout 的变体,如下所示:

ansible-project/ (git repo)
   ansible.cfg
   inventories/
       inventory-a
       inventory-b
   roles/
   playbooks/

在这里,两个清单仍然在一个大 git 存储库中的同一个文件夹中。我试图将库存移动到他们自己的仓库中以单独维护它们。

我最初的计划是让 inventories 文件夹成为一个子模块,并在我的两个控制节点上添加一个不同的子模块。这不起作用,因为子模块也通过 git 同步,因此节点 a 的库存将交叉到节点 b,反之亦然。

我的第二个想法是按如下方式重组项目:

On both nodes:
ansible-project/ (git repo)
   ansible.cfg
   roles/
   playbooks/

On node-a:
inventory_node-a/ (git repo)
    inventory-a/

On node-b:
inventory_node-b/ (git repo)
    inventory-b
    ...

这将需要对代码进行重大重构,并且偏离(甚至更多)最佳实践项目结构。但是,这似乎是唯一可用的方法。

有没有更简单的方法来为一个项目维护两个“可替换”ansible 库存 git?是否有我缺少的 git 功能可以帮助解决这个问题?或者我可以为项目采用不同的结构吗?

总结 phd 和 Vladimir Botka 的有用评论,我写这个答案来标记这个问题已关闭。谢谢你们的反馈。

是否可以按要求管理库存?

是的。按照 Vladimir Botka 的建议,您可以创建一个文件夹结构,其中库存是控制节点上某处的独立 git 存储库。例如在 node-a 上,这将如下所示:

inventory_node-a/ (git repo)
    inventory-a/

ansible-project/ (git repo)
    .gitignore
    ansible.cfg
    inventories/
        inventory-a (symlink to ../../inventory_node-a/)
    roles/
    playbooks/

您需要将 .gitignore 文件添加到 ansible-project 存储库以忽略子文件夹 inventories/inventory-a,这样它就不会显示已更改的文件。

我应该这样做吗?

最终,我们采纳了 phd 的建议,并从存储库中删除了所有库存。这为我们省去了很多麻烦和复杂的结构。

出于最小测试目的,我们在清单中保留了一个条目,将清单文件夹添加到 .gitignore,并独立管理每台主机上的清单。