在任务文件中,其作用是在远程服务器上安装 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 列表中的第一个节点上执行,然后其结果(变量/事实)将用于列表中的所有主机。并且不会在其他节点上执行(第一个节点除外)。