2017-04-03 69 views
0

我有一個劇本,其中在任務中是模板文件複製到具有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,然後將保存的文件複製回最後一項任務。

我必須在這裏失去一些東西,我不能是唯一遇到這種情況的人。任何人有任何想法如何編碼?

+0

開始刪除不必要的'with_items' ... –

+0

@Konstantin Suvorov:謝謝!這實際上是答案,但我不知道如何製作,因爲這是一條評論。在我使用實際庫存主機名的那一刻,它開始按預期工作。但有點令人失望,我無法正確地將變量分配給一個組,並讓它們參與該組中的每個主機,就像我希望的那樣。這意味着我現在必須設立更多的任務,但我想這只是一個小細節。再次感謝! – Viscosity

回答

0

這個問題的答案是刪除代碼中不必要的with_items。儘管使用with_items的確可以讓您委派一個主機模式組,但它也使得變量無法正確定義/分配給該組中的主機。

爲delegate_to定義單個主機實體可修復此問題,然後按預期在所定義的所有主機上執行任務。

康斯坦丁蘇沃洛夫應該得到這個信用,因爲他是原來的答案呃。

此外,我很驚訝,Ansible不允許輕鬆委派一組主機。一定有他們不允許的理由。

相關問題