2017-03-06 83 views
1

我想在遠程節點集上運行一些yum命令。但是他們需要按照特定的順序運行,而不是平行運行。Ansible主機首選項

--- 
- name: Java 1.8 upgrade for EFM on Witness 
    hosts: database-witness:database-standby:database-master 
    tasks: 
    - name: Installating Java 1.8 on Witness 
    yum: name=java-1.8.0-openjdk-1.8.0.111-2.b15.el7_3 state=present 
    notify: set unlimited java 1.8 security 
    - name: Remove Java 1.7 
    shell: rm -f /usr/lib/jvm/$(ls /usr/lib/jvm | grep "java-1.7")/jre/lib/security/*.jar 
    - name: Remove SDK 
    yum: name=java-1.7.0-openjdk.x86_64 state=absent 
    - name: Remove Headless 
    yum: name=java-1.7.0-openjdk-headless.x86_64 state=absent 

我的ENV文件是::

[database-master] 
172.X.X.1 

[database-standby] 
172.X.X.2 

[database-witness] 
172.X.X.3 

在上面的劇本我指定:

hosts: database-witness:database-standby:database-master 

這是否意味着該組的yum命令將首先在database-witness運行THEN database-standby,然後database-master

回答

2

運行在上面的劇本我指定:

hosts: database-witness:database-standby:database-master 

這是否意味着集合百勝命令將首先在 database-witness然後在database-standby和THEN在 database-master上運行。

編號Ansible使用指定的strategy運行劇本。默認情況下(linear策略),Ansible將分叉五個線程並在五臺主機上並行運行每個任務。只有在當前組中的所有主機完成(或失敗)後,Ansible纔會轉到下一個任務。

由於您希望在單個主機上的所有任務完成後移動到下一個主機,因此默認策略不適用於您。


您可以添加serial: 1聲明(見Rolling Update Batch Size),以這將導致Ansible在繼續執行下一個之前運行一臺主機上的所有任務的發揮,但訂單的問題依然存在。

理論上主持人的名單是有序的,一旦你得到它經驗測試它應該是可重複的,但有一個關於SO的問題的例子(小),這表明Ansible並不總是保持「常識」訂購。

--- 
- name: Java 1.8 upgrade for EFM on Witness 
    hosts: database-witness:database-standby:database-master 
    serial: 1 
    tasks: 
    # the tasks 

但是,如果你在你的問題有這樣嚴格的要求,最可靠的方法是將你的遊戲分爲三個。

您可以將任務提取到單獨的文件以避免重複。所以:

--- 
- name: Java 1.8 upgrade for EFM on Witness 
    hosts: database-witness 
    tasks: 
    - include: tasks.yml 

- name: Java 1.8 upgrade for EFM on Witness 
    hosts: database-standby 
    tasks: 
    - include: tasks.yml 

- name: Java 1.8 upgrade for EFM on Witness 
    hosts: database-master 
    tasks: 
    - include: tasks.yml 

而且tasks.yml

- name: Installating Java 1.8 on Witness 
    yum: name=java-1.8.0-openjdk-1.8.0.111-2.b15.el7_3 state=present 
    notify: set unlimited java 1.8 security 
- name: Remove Java 1.7 
    shell: rm -f /usr/lib/jvm/$(ls /usr/lib/jvm | grep "java-1.7")/jre/lib/security/*.jar 
- name: Remove SDK 
    yum: name=java-1.7.0-openjdk.x86_64 state=absent 
- name: Remove Headless 
    yum: name=java-1.7.0-openjdk-headless.x86_64 state=absent 

後者解決方案還可以確保執行將在任何主機上的錯誤的情況下停止。 serial: 1 - 方法你沒有這樣的保證,所以如果任務失敗database-witness,Ansible將繼續下一個目標。

0

他們將並行在不同的主機上運行,​​每個主機上這些任務的順序

+0

謝謝。但是,在我指定的主機上按順序執行最佳做法是什麼? –

+0

檢查「serial:1」是否會保持您指定的順序http://docs.ansible.com/ansible/playbooks_delegation.html#id8。 如果沒有,我建議將這些任務移動到一個單獨的文件中,然後完成3個任務,每個主機一個。每個任務將包含您剛創建的文件。 –