簡體   English   中英

使用Ansible,記住先前成功執行的命令的最佳方法是什么?

[英]With Ansible what is the best way of remembering a command has executed successfully previously?

使用命令模塊 ,如果命令創建了文件,則可以檢查該文件是否存在。 如果這樣做,將阻止命令再次執行。

- command: touch ~/myfile
  args:
    creates: ~/myfile

但是,如果該命令未創建文件,則在重新運行時它將再次執行。

為了避免再次執行,我在更改時創建了一些隨機文件(通知),如下所示:

- command: dothisonceonly # this does not create a file
  args:
    creates: ~/somefile
  notify: done

然后處理程序:

- name: done
  command: touch ~/somefile

這種方法有效,但是有點難看。 任何人都可以放棄最佳實踐嗎? 也許設置一些事實? 也許是全新的方法?

一個事實(用通用語言)是在特定目標主機上成功運行了命令,因此最合適的方法是使用本地事實 (使用Ansible 本地語言)。

在處理程序中,使用copy模塊和content參數將狀態另存為/etc/ansible/facts.d下的JSON文件。

只要您通過常規的事實收集過程與主持人進行對戰,就可以檢索和訪問該文件。

然后,您可以使用when條件控制任務(您需要在情況不存在時包括default過濾器)。

理想情況下,使用Ansible,請檢查第一個命令已更改的狀態,而不是使用文件作為代理。 原因是檢查某事物的實際狀態會提供更好的不變性,因為每次通過都會對其進行測試。

如果有理由不使用該方法。 然后注冊命令的結果,並使用它而不是通知程序來觸發文件的創建。

- command: dothisonceonly # this does not create a file
  creates: ~/somefile
  register: result

- file:
    path: ~/somefile
    state: touch
  when: result|succeeded

如果您想看看這里發生了什么,請添加:

- debug: var=result

注意通知者,它們在播放結束時運行。 這意味着,如果通知程序是由任務觸發的,但是隨后播放無法完成,則通知程序將不會運行。 相反,有Ansible選項可以使通知程序運行,即使未由任務觸發也是如此。

這是我基於@techraf的答案的實際實現

- command: echo 'phew'
  register: itworks
  notify: Done itworks
  when: ansible_local.itworks | d(0) == 0

和處理程序:

- name: Done itworks
  copy:
    content: '{{ itworks }}'
    dest: /etc/ansible/facts.d/itworks.fact

文件:

http://docs.ansible.com/ansible/playbooks_variables.html#local-facts-facts-d

謝謝@techraf,這很有效,並且可以保留事實。

編輯

在@techraf的注釋中應用了默認值邏輯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM