2017-10-05 18 views
0

問題:パッケージ更新が必要な多くのノードがあります。ノードの中には、これらのパッケージがインストールされているものもあれば、そうでないものもあります。 目的は です。1. yumモジュールを使用してパッケージがインストールされているかどうかを確認します。 2.パッケージがインストールされていて、アップデートが利用可能であれば、yum updateを実行してください。可能性:結果の戻り値yumモジュールを反復する

これはコマンドやシェルでは簡単に実行できますが、非常に非効率です。

tasks: 
    - name: check if packages are installed 
    yum: list="{{ item }}" 
    with_items: 
     - acpid 
     - c-ares 
     - automake 
    register: packages 


    - debug: 
     var: packages 

は私が行うことがansible欲しい the results

を生産する場合にのみ、yumのパッケージを更新することです:リストがインストールされたパッケージと、上記の結果から入手可能なアップグレードを見ています。

yumモジュールを使用することが可能かどうかはわかりません。

迅速かつ簡単な方法は、単にコマンドを使用するでしょう:

tasks: 
    - name: check if packages are installed 
    command: yum update -y {{ item }} 
    with_items: 
     - acpid 
     - c-ares 
     - automake 

それがインストールされている場合は、yumのアップデートパッケージは、パッケージのみを更新しますので、。

+0

迅速かつ簡単な方法を使用しないのはなぜ? – larsks

答えて

0

The Ansible loopsドキュメントにはsection about using register in a loopがあります。

あなたdebugタスクの出力を見てみると、あなたはあなたのpackages変数が最初のタスクであなたのwith_itemsループの結果が含まれていresultsという名前のキーを持っていることがわかります。大規模な構造は次のようになります。

{ 
    "packages":{ 
     "changed":false, 
     "msg":"All items completed", 
     "results":[ 
     { 
      "item":"...", 
      "results":[ 

      ] 
     }, 
     { 
      "item":"...", 
      "results":[ 

      ] 
     } 
     ] 
    } 
} 

個々の結果は、その結果に対するループイテレータの値が含まれているキーitem、およびによって返されたパッケージのリストを(空の可能性)が含まれresults鍵を持っていますモジュールyumに対するlistオプション。このような結果以上を念頭に置いて

、あなたは可能性がループ:

- debug: 
    msg: "{{ item.item }}" 
    with_items: "{{ packages.results }}" 
    when: item.results 

when条件はlist操作が空でない結果が返される結果のみにマッチします。一致するパッケージをアップグレードするには

- yum: 
    name: "{{ item.item }}" 
    state: latest 
    with_items: "{{ packages.results }}" 
    when: item.results 
関連する問題