【问题标题】:Is it possible to use a state for ansible?是否可以将状态用于ansible?
【发布时间】:2021-01-21 19:26:51
【问题描述】:

您可能不明白我在问题中要表达的意思。在陈述问题之前,我先举个例子来进一步理解。

我们以 terraform 为例。

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

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

tags = {
    Name = "HelloWorld"
  }

没什么复杂的,就是这么简单。因此,当我们添加标签时,terraform 将查找状态中的任何更改,当它发现已添加标签时,它会运行并且仅添加标签,而不重新创建整个实例。 (可能还有其他需要重新创建实例的情况,但我们暂时先不考虑)

所以,正如我所提到的,terraform 不会重新创建实例来添加标签。如果我们想添加另一个标签,它将添加标签而不重新创建实例。就这么简单。 不管我们运行terraform apply 多少次,它都不会对现有资源进行任何更改,除非我们在 terraform 文件中进行任何更改。

那么,现在让我们来看看真正的问题。

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

好吧,就这么简单。

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

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

是否可以像我们在terraform 中一样保留ansible 中的状态,以便它始终只执行较新的更改,而不是在第二次运行时从头开始执行?? p>

【问题讨论】:

    标签: ansible terraform


    【解决方案1】:

    你好像在描述idempotence

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

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

    - 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 无法通过在控制器上保留状态来实现幂等性。每个模块都应该检查它正在运行的主机的状态,以确定它需要进行哪些更改才能达到剧本指定的状态。如果它确定不需要进行任何更改,那么这就是它应该向控制器报告的内容。

    【讨论】:

    • 好的,可以理解。但是假设我们有一个场景,我们只能执行一次该命令,如果我们执行这个,它会失败。 (例如:- 将 Kubernetes 工作节点与主节点连接起来)。如何用 ansible 解决这种情况?
    • 我不熟悉 Kubernetes,但在那种情况下,您可以创建一个模块,首先检查工作节点是否已加入主节点,如果尚未加入则加入。这样的模块很可能已经存在。
    • 你能举例说明如何创建这样的模块吗?我怎样才能做到这一点?忘记工作节点或 kubernetes,假设使用 ansible 创建文件相当于将工作节点加入主节点,您能告诉我如何编写模块以及如何进行检查吗?
    • 模块是用python编写的,在目标主机上执行代码。您将使用 python 的文件系统 API 来检查文件是否存在,如果不存在则创建它。有关更多详细信息,我建议阅读ansible docs
    猜你喜欢
    • 1970-01-01
    • 2018-03-09
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 2012-03-06
    • 1970-01-01
    • 2017-03-31
    相关资源
    最近更新 更多