Ansible 可恢復播放e.G.和我一樣。_____重試___和.G.在一世噸Hs一世噸和.r和噸r是e.g. with site.retry?
使用 ansible 通常依賴於一個稱為“冪等性”的屬性。如果您第二次應用角色,則預期會產生相同的結果。例如,它不會在配置文件中添加同一行的第二個副本。
還有另一個你可能稱之為“可恢復”的屬性。如果控制器和目標之間出現網路分區,分區解決後是否可以重新執行中斷的播放?
Ansible通過列出失敗的目標並允許重試來提示此屬性*。*
但是,如果您查看實際範例,它們似乎不具備此屬性。建議一種方法,以確保我認識到我的劇本的任何失敗都可以正確恢復。
- name: Create Mysql configuration file template: src=my.cnf.j2 dest=/etc/my.cnf notify: - restart mysql - name: Start Mysql Service service: name=mysqld state=started enabled=yes
例如,上面來自 ansible-examples 的片段無法實現“可恢復”屬性。如果在創建配置文件之後但在執行處理程序“restart mysql”之前播放中斷,則處理程序“restart mysql”將永遠不會觸發。
Ansible 文件提到了這一點,但只是順便提及。“某些錯誤仍然可能阻止處理程序執行,例如主機無法訪問。” 沒有關於在這種情況下該怎麼做的建議。
它提到
--force-handlers
. 這裡有些混亂。問題#4777請求一個--force-handlers
選項,該選項將執行所有處理程序,無論它們是否被通知,以允許在這種情況下恢復。此問題已通過評論“現在已實施”關閉。旁白:沒有實施。我已經打開了一個新問題來請求這樣的功能。不幸的是,我相信這個評論已經導致一些人建議
--force-handlers
在 stackexchange 或其他地方解決這個問題,但事實並非如此。一個完整的解決方案將修改 ansible 以記錄待處理處理程序的數據庫。(當任務檢測到即將進行更改時,將立即記錄處理程序)。
除此之外,您會希望避免此類中斷。因為您需要仔細檢查這兩個處理程序以及任何以 為條件的任務
|changed
,並確保在重試目標上執行所有這些。道德:使用處理程序可能很有用,並避免
|changed
在整個劇本中散佈。一個不太優雅但同樣正確的解決方案是使用強制執行所有處理程序的選項來修改 ansible。或者也許將所有未跳過的任務視為已更改。如果最初的執行需要重新啟動服務,那麼安排第二次執行來重新啟動服務並不是完全不合理的。缺點是如果原來的執行只需要重啟一些服務。
您還可以通過使用 ansible “拉模式”來避免播放中斷。或者,如果主要問題是因為 ansible 是遠端執行的,那麼您可以在同一站點的伺服器上執行 ansible,使用帶有
screen
/的持久會話tmux
。
原則上,重啟服務後觸摸時間戳文件即可實現續播。那麼重啟服務的條件就是重啟時間戳是否早於配置文件的修改時間。(靈感來自
make
)。對於配置文件,這也可以使用本機 ansible 模組:
- name: Create Mysql configuration file template: src=my.cnf.j2 dest=/etc/my.cnf - name: query | mysql has been restarted with new config file template: src=my.cnf.j2 dest=/ansible-managed/mysql/restarted/my.cnf check_mode: yes register: mysql_restarted - name: ensure | mysql has been restarted with new config file service: name=mysqld state=restarted when: mysql_restarted|changed - name: record | mysql has been restarted with new config file template: src=my.cnf.j2 dest=/ansible-managed/mysql/restarted/my.cnf
(或例如
- name: query | mysql has been restarted with new config file copy: remote_src=yes src=/etc/my.cnf dest=/ansible-managed/mysql/restarted/my.cnf check_mode: yes register: mysql_restarted
雖然
remote_src
僅適用於單個配置文件,而不適用於目錄)