Ansible - 任务 file.yml 中的键“run_once”有什么用途?

Ansible - 任务 file.yml 中的键“run_once”有什么用途?

在任务文件中,其作用是在远程服务器上安装 php

有人使用此模块(在专用于安装的模块之后)来更新全新安装:

  command:
    php update.php --quick
  run_once: yes
  delegate_to: "{{item}}"
  with_items: "{{servernetwork.nodes}}"

所以我不明白的是,据我所知,Ansible 脚本任务在解析时(当脚本启动到远程服务器上时)本机有 3 个结果:类似于
-好的(在该调用之前已经完成),
-已更改(这是一项新要求,所以刚刚才完成),
或者我不记得了第三状态
但无论如何,因为基本上 Ansible 只会在本地执行当前服务器状态下缺少的配方步骤。文档和人们喜欢使用“indempotent”这个词来描述这种类似 delta 的行为。

那么我们为什么需要精确化run_once?我是否遗漏了其关键概念?

答案1

run_once通过文档如下

在某些情况下,可能只需要运行一项任务一度针对一批主机。这可以通过配置run_once任务来实现。[粗体部分是我加的。]

- command: /opt/application/upgrade_db.py
  run_once: true
  delegate_to: web01.example.org

它有广泛的用途。

  • 应用数据库迁移(在每个主机上应用迁移没有任何意义。一个就足够了)

  • 创建数据库备份。在一批主机上运行剧本,在其中一个主机上进行备份会很有价值。

  • 进行这样的需要从特定主机运行的 API 调用。(并且只做一次...)

  • [...]

它经常与local_action或者delegate_to。在这种情况下,您在一批主机上运行操作,但locally在其他地方执行它或完全执行它。


幂等性完全不直接相关的事情run_once

根据定义幂等性是这样的运算f(x),如果f(x)=y,那么f(f(x))=y。根据人类的理解,我们可以说对同一个参数两次应用此函数不会改变结果。你可以将函数视为一个角色,它y是你代码的结果。

答案2

run_once 表示此命令将在 servernetwork.node 列表中的第一个节点上执行,然后其结果(变量/事实)将用于列表中的所有主机。并且不会在其他节点上执行(第一个节点除外)。

相关内容