是否可以将状态用于ansible?

是否可以将状态用于ansible?,ansible,terraform,Ansible,Terraform,你可能不明白我在这个问题上想说什么。在说明问题之前,我会举一个例子来进一步理解 让我们以地形为例 假设我们使用terraform在aws中启动一个EC2实例。因此,我们目前正在本地存储状态。假设我们需要向ec2实例添加标记 所以我们要做的是,我们添加这个小模块来实现这一点 tags = { Name = "HelloWorld" } 没什么复杂的,只是简单而已。因此,当我们添加一个标记时,terraform将查找状态中的任何更改,当它发现一个标记已添加时,它将运

你可能不明白我在这个问题上想说什么。在说明问题之前,我会举一个例子来进一步理解

让我们以地形为例

假设我们使用terraform在
aws
中启动一个EC2实例。因此,我们目前正在本地存储状态。假设我们需要向
ec2
实例添加
标记

所以我们要做的是,我们添加这个小模块来实现这一点

tags = {
    Name = "HelloWorld"
  }
没什么复杂的,只是简单而已。因此,当我们添加一个标记时,terraform将查找状态中的任何更改,当它发现一个标记已添加时,它将运行并仅添加标记而不重新创建整个实例。(可能还有其他需要重新创建实例的场景,但我们暂时不谈这些场景)

因此,正如我提到的,
terraform
不会重新创建用于添加标记的实例。如果我们想添加另一个标记,它将添加该标记而不重新创建实例。就这么简单。 无论我们运行了多少次
terraformapply
它都不会对现有资源进行任何更改,除非我们在terraform文件中进行了任何更改

现在,让我们来讨论真正的问题

假设我们想使用
ansible
安装
httpd
。所以我写了一本剧本。它将使用
yum
软件包进行安装,然后启动并启用该服务

好吧,就这么简单

假设我们第二次运行相同的playbook,现在将尝试从头开始执行相同的命令,而不首先检查它以前是否执行过此playbook

我有几次尝试安装一些服务的经验,当我再次尝试执行同一个剧本时,它失败了

是否可以像我们在
terraform
中所做的那样,在
ansible
中保留状态,这样它总是只执行较新的更改,而不是从第二次运行开始执行?

您似乎在描述:

幂等性是数学和计算机科学中某些运算的性质,它们可以多次应用,而不会改变最初应用以外的结果

由您来确定您的剧本在ansible中是幂等的。您可以使用和模块为您的示例执行此操作

-名称:安装Apache
主机:Web服务器
任务:
-名称:安装Apache
包裹:
名称:httpd
国家:现在
-名称:启动并启用Apache
服务:
名称:httpd
国家:开始
启用:是

Ansible不会通过在控制器上保留状态来实现幂等性。每个模块都应该检查其运行的主机的状态,以确定需要进行哪些更改才能达到剧本中指定的状态。如果确定不需要进行任何更改,则应向控制器报告。

好的。但假设我们有一个场景,我们只能执行该命令一次,如果我们执行这个命令,它就会失败。(例如:-将kubernetes工作节点与主节点连接起来)。如何使用ansible解决这种情况?我不熟悉Kubernetes,但在这种情况下,您可以创建一个模块,首先检查工作节点是否已加入到主节点,如果尚未加入,则加入。这样一个模块很可能已经存在。你能举个例子说明如何创建这样一个模块吗?我该怎么做?忘记worker节点或kubernetes,假设使用ansible创建文件相当于一个worker节点加入主节点,您能告诉我如何编写模块以及如何完成检查吗?模块是用python编写的,并在目标主机上执行代码。您可以使用python的文件系统API检查文件是否存在,如果不存在,则创建它。要了解更多细节,我建议阅读。