您可能不明白我要在问题中说什么。在说明问题之前,我将举一个例子来进一步理解。
让我们以terraform为例。
想象一下,我们使用Terraform在aws
中启动EC2实例。因此,我们目前将状态存储在本地。假设我们需要向tag
实例中添加一个ec2
。
所以我们要做的是,添加这个小块以实现目标。
tags = {
Name = "HelloWorld"
}
没什么复杂的,只是简单而已。因此,当我们添加标签时,terraform将查找状态的任何变化,并且当发现已添加标签时,它就会运行,并且仅添加标签而不会重新创建整个实例。 (在其他情况下,需要重新创建实例,但让我们暂时将其保留)
因此,正如我提到的,terraform
不会重新创建用于添加标签的实例。如果我们要添加另一个标签,它将添加标签而不重新创建实例。就这么简单。
不管我们运行terraform apply
有多少次,除非我们在terraform文件中进行了任何操作,否则它都不会对现有资源进行任何更改。
所以,现在让我们提出一个真正的问题。
假设我们要使用httpd
安装ansible
。所以我写了一个有趣的剧本。它将使用yum
软件包并安装,然后启动并启用该服务。
好吧,很简单。
假设我们第二次运行相同的剧本,现在将尝试从头开始执行相同的命令,而无需先检查它是否曾经执行过此剧本?
我有几次尝试安装某些服务的经验,当我再次尝试执行同一本剧本时,它会失败。
是否可以像在ansible
中一样保留terraform
中的状态,因此它总是仅执行更新的更改,而不是从第二次运行开始执行 >?
答案 0 :(得分:3)
您似乎在描述idempotence:
幂等性是数学和计算机科学中某些运算的属性,因此可以多次应用它们,而不会超出初始应用范围而改变结果。
由您来确定您的剧本在ansible中是幂等的。您可以使用package
和service
模块作为示例。
- name: Setup Apache
hosts: webservers
tasks:
- name: Install Apache
package:
name: httpd
state: present
- name: Start and enable Apache
service:
name: httpd
state: started
enabled: yes
Ansible无法通过保留控制器上的状态来实现幂等。每个模块都应检查其正在操作的主机的状态,以确定需要进行哪些更改才能达到剧本指定的状态。如果它确定不需要进行任何更改,则应将其报告给控制器。