我有一个配置 nginx 的角色。正如您所期望的那样,它将文件添加到一个目录中,然后由主配置文件包含该目录。我开始遇到读取这些文件的顺序问题,所以我想将其中一些文件移动到此目录之后包含的另一个目录中。
问题是该角色已经在多个地方运行,因此如果我仅将某些配置文件的路径更改为新目录,那么旧副本将留在旧目录中。我想到的解决方案是:
- 包括删除旧文件的任务 - 这感觉像是将永远停留在角色中的混乱。
- 删除目录中的所有内容并让角色重新创建应该存在的文件 - 来自其他来源(例如其他角色或多次运行的同一角色)的文件将丢失。
在这种情况下,我知道该角色已被使用过的所有地方,所以我可以等到我知道旧文件已经消失,然后删除删除它们的步骤,甚至手动删除文件,但这肯定不可扩展。是否有任何处理此类问题的既定做法或我应该知道的思考方式?
答案1
您不需要永远保留删除旧文件的角色。
下次运行删除旧文件的角色时,您始终可以只运行一次性操作。但请记住,如果在迁移时某些主机无法访问,或者您遇到其他问题,您可能必须保留该一次性操作。
或者您可以将其添加到角色中,并保留一段时间。一旦您确定所有受影响的主机都已删除文件,您就可以删除删除它们的任务。保留它几乎是无害的。
我更喜欢这种方式,而不是删除并重新创建整个目录,因为这种方式不是幂等的。即使语义上没有任何改变,它也始终会被记录为已更改。请记住,在 Ansible 中,幂等性是无法保证的;您必须自己做。