Deployment Ansible:以与角色相同的默认值/魔法播放';s main.yml

Deployment Ansible:以与角色相同的默认值/魔法播放';s main.yml,deployment,ansible,devops,Deployment,Ansible,Devops,我经常需要执行特定任务的“自定义剧本”,但仍在一个角色内,例如,对于数据库备份任务,我希望它位于roles/databases/backup.yml中。像这样的自定义任务将享受main.yml所享受的相同功能(自动读取角色变量等) 唯一的解决方法是依赖main.yml中的标记,但这很麻烦-需要创建标记的“障碍路线”以确保运行某些任务,并在命令行上指定标记(因为一个播放无法运行其他播放的标记筛选列表) 我最终不得不在自定义文件中手动和显式地完成所有工作。进一步思考,困惑是因为我试图绕过Ansibl

我经常需要执行特定任务的“自定义剧本”,但仍在一个角色内,例如,对于数据库备份任务,我希望它位于roles/databases/backup.yml中。像这样的自定义任务将享受main.yml所享受的相同功能(自动读取角色变量等)

唯一的解决方法是依赖main.yml中的标记,但这很麻烦-需要创建标记的“障碍路线”以确保运行某些任务,并在命令行上指定标记(因为一个播放无法运行其他播放的标记筛选列表)


我最终不得不在自定义文件中手动和显式地完成所有工作。

进一步思考,困惑是因为我试图绕过Ansible的两个限制:(a)如前所述;(b) ,即禁用任务的标记,除非显式调用该标记。这意味着在剧本中没有简单的方法来运行特殊/异常任务的特定子集

我试图通过制作一个单独的剧本来绕过这个限制。然而,不管怎样,这最终都会从主要角色剧本中复制出一堆逻辑


目前最好的方法是变通方法,即依赖变量作为“白名单”特定任务的变通方法。然后制作一个包装器脚本,声明这些变量,还可以使用跳过标记来消除不必要的/缓慢的任务。

如果您明确说明您的问题,这会很有帮助吗?据我所知,您希望在角色中有一个自定义的剧本——那么为什么不在角色中创建一个单独的任务文件并包含它(带有“when:…”)?main.yml中的所有任务都默认运行,因此使用“when”将需要在每个任务中添加“when”标记以排除它。e、 g.如果我在10个总任务中有一个“备份”任务,我必须将其他9个标记为“不备份时”,以防止它们运行。如果我有第二个任务“还原”,我必须在9个不还原的任务中添加“不还原时”。因此,我认为使用主角色文件来指定自定义任务并不实际。然而,这是获得这些好的默认值的唯一明显的方法。你不能在你的main.yml:include:'tasks/backup.yml'when:backup='yes'。。。然后在你的backup.yml中有你的备份相关任务吗?我就是这么做的。然后你可以在命令行上传入backup变量。是的,再进一步想想,这确实是目前最好的做法,如果不是最理想的。在这里留下了详细的答案。