2017-03-06 8 views
1

ノードのリモートセットでyumコマンドを実行しようとしています。しかし、それらは並行して実行する必要はなく、特定の順序で実行する必要があります。可能なホストの設定

--- 
- 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 

です:これはyumのコマンドのセットは、最初のdatabase-witness上で実行されます

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

意味していますTHEN on database-standbyおよびTHEN on database-master

答えて

2

を実行し、異なるホスト上で並列に実行されます:

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

これはYUMのセットを意味していますコマンドはまず database-witness THEN on database-standbyで実行され、THENは database-masterに実行されます。

いいえAnsibleは、指定されたを使用するプレーブックを実行します。デフォルトでは(linear戦略)、Ansibleは5つのスレッドをフォークし、各タスクを5つのホスト上で並列に実行します。現在のグループ内のすべてのホストが終了した(または失敗した)場合のみ、Ansibleは次のタスクに移動します。

単一のホスト上のすべてのタスクが完了した後で次のホストに移動したいので、デフォルトの戦略は機能しません。


あなたはAnsibleは、次のいずれかに進む前に、単一のホスト上のすべてのタスクを実行します遊びに(Rolling Update Batch Sizeを参照)serial: 1宣言を追加することができますが、順序の疑問は残ります。

理論上ホストのリストが注文され、一度経験的にテストされると再現性があるはずですが、SOの質問には少数の例があり、Anabilitiesが常に「常識」を維持しているわけではない注文。

--- 
- 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

「シリアル:1」が指定した順序を維持するかどうかを確認します。http://docs.ansible.com/ansible/playbooks_delegation.html#id8 それ以外の場合は、タスクを別々のファイルに移動し、3つのタスク(各ホストに1つずつ)を割り当てることをお勧めします。各タスクには、作成したばかりのファイルが含まれます。 –

関連する問題