Linux

Ansible - 任務file.yml中鍵“run_once”的目的是什麼?

  • April 18, 2020

在一個任務文件中,其作用是在遠端伺服器上安裝 php

有人使用此模組(在專用於安裝的模組之後)更新全新安裝:

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

所以我不明白的是,afaik,Ansible 腳本化任務在解析時(當腳本啟動到遠端伺服器時)本機有 3 個結果:類似於

-好的(在該呼叫之前已經完成),

-改變(這是一個新要求,所以它剛剛完成),

或者我不記得第三個狀態

但無論如何,因為基本上 Ansible 將僅執行目前伺服器狀態中缺少的配方步驟。文件和人們喜歡使用 << indempotent >> 這個詞來表示這種類似 delta 的行為。

那麼為什麼我們需要精確化run_once呢?我錯過了它的關鍵概念嗎?

run_once通過文件如下

在某些情況下,可能只需要為一批主機執行**一次任務。**這可以通過配置run_once任務來實現。

$$ Bolding is mine. $$

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

它有廣泛的案例。

  • 應用數據庫遷移。(在每台主機上應用遷移沒有任何意義。一個就足夠了)
  • 創建數據庫備份。在一批主機上執行劇本,在其中一個上進行備份是很有價值的。
  • 進行這種需要從特定主機執行的 API 呼叫。(做一次……)
  • $$ … $$

它經常與local_actionor一起使用delegate_to。在這種情況下,您在一批主機上執行操作,但在locally其他地方執行或完全執行它。


冪等性是完全不直接相關的東西run_once

根據定義,冪等性就是這樣一種運算f(x),即如果f(x)=y,那麼f(f(x))=y。根據人類的理解,我們可以說在同一個參數上應用這個函式兩次,它不會改變結果。你可以把函式想像成一個角色,y是你的程式碼的結果。

引用自:https://serverfault.com/questions/1012879