我有一個劇本,其中在任務中是模板文件複製到具有delegate_to特定的服務器:一個名爲「格羅弗」Ansible任務已授權的主機上運行的問題時,文件名匹配的主機名
存貨清單,這裏的重要服務器是:bigbird,grover,oscar
這些模板文件必須具有與每個服務器的主機名匹配的名稱,並且委託服務器grover也必須具有它自己的所述文件實例。只有在文件尚不存在的情況下,才能進行此模板複製操作。/tmp/grover預先存在於服務器grover上,並且它需要保持未被劇本運行所改變。
最終除了服務器grover上的/ tmp/grover之外,在運行之後還應該存在:/ tmp/bigbird和/ tmp/oscar。
我遇到的問題是,當劇本運行時沒有任何條件,它確實有效,但它也會破壞/覆蓋/ tmp/grover,這是不可接受的。但是,如果我在之前的播放中添加任務以預先檢查這些文件,然後在模板播放時有條件跳過grover(如果該文件已存在),它不僅會跳過grover,而且會跳過其他所有服務器那將會在那場比賽中同時運行。如果我嘗試將它設置爲在其他所有服務器上運行但是grover,它仍會失敗,因爲代理服務器是grover,並且會被跳過。
下面是實際的示例代碼snipits,劇本是由於主機模式的所有3臺服務器上運行:
- hosts: bigbird:grover:oscar
- name: File clobber check.
stat:
path: /tmp/{{ansible_hostname}}
register: clobber_check
delegate_to: "{{ item }}"
with_items:
- "{{ grover }}"
- name: Copy templates to grover.
template:
backup: yes
src: /opt/template
dest: /tmp/{{ansible_hostname}}
group: root
mode: "u=rw,g=rw"
owner: root
delegate_to: "{{ item }}"
with_items:
- "{{ grover }}"
when: (not clobber_check.stat.exists) and (clobber_check is defined)
如果我運行,和/ tmp目錄/格羅弗在格羅弗存在,那麼它就會簡單地跳過因爲條件失敗,所以整個副本都會播放。因此,由於此問題,其他服務器永遠不會將其/ tmp/bigbird和/ tmp/oscar模板複製到grover。
最後,我想避免貧民區的解決方案,如保存grover的原始配置文件的備份,允許clobber,然後將保存的文件複製回最後一項任務。
我必須在這裏失去一些東西,我不能是唯一遇到這種情況的人。任何人有任何想法如何編碼?
開始刪除不必要的'with_items' ... –
@Konstantin Suvorov:謝謝!這實際上是答案,但我不知道如何製作,因爲這是一條評論。在我使用實際庫存主機名的那一刻,它開始按預期工作。但有點令人失望,我無法正確地將變量分配給一個組,並讓它們參與該組中的每個主機,就像我希望的那樣。這意味着我現在必須設立更多的任務,但我想這只是一個小細節。再次感謝! – Viscosity