Ansible Run Once

2024 年 9 月 19 日 | 阅读 7 分钟

为了确切了解 Ansible 注册表,了解 Ansible 至关重要。 Ansible 是一个广泛使用的开源自动化工具,用于任务自动化、应用程序部署和配置管理。 通过自动化重复过程、控制基础设施即代码以及在服务器和系统之间保持一致性,旨在简化和精简 IT 运营。

Ansible 的特点

Ansible Run Once

以下是 Ansible 的一些主要思想和特点

无代理

Ansible 不需要任何软件安装在目标机器上,因为它是一个无代理系统。相反,它使用 SSH (安全外壳) 连接并控制远程服务器。这使得设置和管理变得简单。

声明式语言

为了指定系统的期望状态,Ansible 采用 YAML,一种简单易懂的语言。 Ansible 确保系统满足您定义的配置。

Playbook

包含任务列表和 Ansible 在远程服务器上执行的指令的 YAML 文件被称为 Ansible playbook。哪些必须完成,以什么顺序,以及在哪些 playbook 上指定主机?

模块

为了与系统和服务通信,Ansible 提供了大量的模块选择。模块负责执行特定的职责,例如管理包、文件、用户或运行命令。

库存

Ansible 将管理的主机列在清单文件中。 此文件可以是静态的或动态的,可以对主机进行分组以简化管理。

Ad-hoc 命令

除了允许您从命令行运行 playbook 之外,Ansible 还允许您从命令行执行 ad-hoc 命令,以便在不需要创建 playbook 的情况下在远程服务器上执行紧急操作。

角色

Ansible playbook 和任务可以使用角色进行组织和重用。通过允许您将配置和自动化功能封装到可重用组件中,它们可以更轻松地管理复杂的系统。

幂等性

Ansible playbook 可以执行多次而不影响系统的期望状态,因为它们是幂等的。 如果任务已经执行并且系统处于期望状态,Ansible 将不会进行任何更改。

集成

通过模块和插件,Ansible 可以连接到各种云服务提供商、网络硬件和第三方技术。 由于其多功能性,它可用于处理一系列基础设施部件。

Ansible 广泛用于 DevOps 和系统管理中,以自动化服务器配置、软件部署、配置管理和持续交付等过程。 大规模基础设施管理变得更加容易,它有助于企业提高其 IT 运营的一致性和效率。

AnsibleRunOnce

Ansible 内置的幂等性和任务控制方法可用于确保特定任务或剧本仅在目标主机上执行一次。 Ansible 应该具有幂等性,无论执行多少次,同一个任务都应该产生相同的结果。 尽管如此,无论主机的状态如何,您仍然可以管理执行以确保仅执行一次作业。 如下所示

方法 - 1

使用 Ansible Facts

如果目标主机上未满足给定条件,您可以使用 Ansible Facts 来检查它,然后执行该任务。 这是一个例子

在这种情况下

stat 模块用于第一个作业(检查文件是否存在),以收集有关特定文件的数据。 file_info 变量是保存结果的位置。

第二个任务“如果文件不存在则执行任务”会验证 file_info.stat.exists 属性。 如果文件不存在 (file_info.stat.exists 为 False),则执行您想要的命令。 通过这种方式,该作业仅在文件丢失时执行。

方法 - 2

使用条件变量

变量也可以用作标志来确定是否执行任务。 例如

在这种情况下

在第一个任务“仅执行一次任务”中检查 run_once_flag 变量的值。 如果为 false,则执行该命令。

第二个任务“在任务运行后设置标志”涉及在作业运行完成后将 run_once_flag 变量设置为 true。 这确保了即使剧本被执行多次,该作业也只会执行一次。

通过使用这两种技术中的任何一种,确保特定任务或剧本仅在目标主机上执行一次。 选择最适合您的口味和用例的技术。

除了已经说明的之外,您还可以使用更多策略在 Ansible 中确保特定任务或剧本仅在目标主机上执行一次

策略 - A

DelegateToLocalhost

您可以使用 delegate_to 参数在控制节点(localhost)而不是目标主机上运行任务。 无论您有多少目标主机,这都保证了该作业仅在控制节点上运行一次。 例如

策略 - B

使用 Ansible 的“when”条件

您可以使用变量和 when 条件来确定是否执行作业。 您可以通过设置变量然后根据变量的值使用 when 条件来确保仅在满足条件时执行作业。 例如

在这种情况下,如果声明了 my_condition_variable,则该任务将不会运行,并且在作业完成后设置变量后,它将不会再次运行。

这些附加方法为您提供了更多控制 Ansible 剧本和任务执行的能力,确保它们始终在目标主机或控制节点上运行。

策略 - C

Ansible 标签与 RunOnce

要保证作业仅在所有目标主机上运行一次,请将 Ansible 标签与 run_once 特殊属性结合使用。 您可以通过标记它并设置 run_once: true,确保任务仅在与该模式匹配的 inventory 中的第一个主机上完成。 例如

发生这种情况时,带有“my_unique_tag”的作业将在与它匹配的第一个主机上运行,然后再跳过其余部分。

策略 - D

使用 Hostvars 和 Ansible Facts

通过使用 Ansible facts 和 hostvars 字典,您可以确保作业每个主机只执行一次。 您可以通过设置每个主机唯一的 fact,然后在您的任务中验证该 fact 来实现每个主机的幂等性。 例如

在这种方法中,该任务为每个主机运行一次,但它通过检查 hostvars 中的 my_task_executed fact 确保它每个主机只执行一次。

借助这些复杂的技术,您可以更好地控制 Ansible 中作业或剧本的何时以及如何执行,从而可以定制您的自动化以满足某些需求和场景。 选择最能满足您的要求和独特用例的方法。

结论

您可以使用 Ansible 内置的幂等行为和任务控制方法来确保特定任务或剧本仅在目标主机上执行一次。 利用 Ansible facts(允许您检查目标主机的当前状态)是一种策略。 通过确保验证某个标准(例如文件是否存在)并且仅在未满足该条件时执行该标准,您可以确保该作业仅执行一次。 这种方法利用了 Ansible 的幂等性,以确保重复的操作产生与仅执行一次相同的结果。

您还可以使用条件变量作为标志。 通过使用此方法,该任务首先确定标志变量的值,并且仅在该值为预定值(例如 false)时执行。 您可以在作业完成后将标志变量更改为确保任务不会在后续剧本执行中再次执行的值。 这两种方法都为您提供了管理 Ansible 任务如何执行的自由,允许您仅在目标主机上运行它们一次,同时保留 Ansible 的自动化和幂等特性。