2017-05-15 19 views
1

{% for ... %}ansible

Iおおよそ次のステップがあります。

- name: Wait for Started status to clear 
    uri: 
    url: http://{{ container.ip }}:8080/upgrade/api/v1/upgrades/{{ theuuid }} 
    return_content: yes 
    register: progress_status 
    until: > 
    {% for c in (progress_status.content | from_json).data.states %} 
     {{ c.state != 'Started' }} 
     {% if not loop.last %}and{% endif %} 
    {% endfor %} 
    retries: 30 
    delay: 15 

uri呼び出しはコンテナやJSON形式での「状態」のリストを返します。コンテナのどれもStarted状態になるまで、このuriを照会し続けたいと思います。

{% for ... %}ループのため警告が生成されます。

開始状態を表すjson文字列の応答全体を見ると、それほど具体的ではないテストを行うことができます。しかし、それは各コンテナの状態を調べること(よりブール式true and true and ...を構築すること)よりも謎めいているようです。しかし、これは私の今の選択肢です。

またはblockを使用してクエリを実行してから、条件としてファクトを作成し、ブロック上のuntilとしてファクトを使用することができます。しかし、それも読むのが難しいようです。

このようなパターンを処理する方法についての提案はありますか? state=='Started'を持つすべての要素を削除し、

until: (progress_status.content | from_json).data.states | rejectattr('state','equalto','Started') | list | length == 0 

は、ここでは、 (progress_status.content | from_json).data.statesリストを取り、残りのリストの長さをチェックしてください。

+0

私は 'until'文のループが何をし、すべてのコンテナが停止したときにゼロを返すかを行う前のタスク(テンプレートとして)でシェルスクリプトを作成したいと思います。次に、そのスクリプトを 'local_action'として実行することができます ' until'ステートメントはスクリプトの結果を確認するだけで済むので、プレイブックはもっと簡単に見えます。 – ProfHase85

答えて

3

あなたはリストから特定の項目をフェッチ/削除するselectattr/rejectattrフィルタを使用することができます。

拒否後のリストが空の場合、すべてのアイテムがStartedの状態であることを意味するタスクは完了します。

+0

優れたソリューション!ありがとう - それは素晴らしい作品と私​​が探していたエレガンスの一種です! –