web-dev-qa-db-ja.com

Ansible、if then elseステートメントを使用したset_fact

別の変数に基づいて、実行時にset_factを使用してAnsibleで変数を設定しようとしています。実際の値が何であれ、最初の値を使用する場合。これが私のコード例です:

- name: Global_vars - get date info
    set_fact:  
      jm_env: "{{lookup('env', 'Environment')}}"
      l_env: "{% if '{{jm_env}}==Develop' %}d{% Elif '{{jm_env}}==Staging'%}s{% else %}p{% endif %}"

l_envは、設定されているjm_envに関係なくdです。

8
thepod71

まず、YAMLの辞書は順序付けされていないため(ここでAnsibleが使用する構文はYAML辞書です)、Ansibleがjm_envに設定してからl_envに進む保証はなく、分割する必要があります。 2つのタスクへの割り当て。

次に、テスト式が正しくありません。引用符で囲まれているため、'{{jm_env}}==Develop'は文字列です。そしてif 'string'をテストすると、常にtrueに評価されます(これが出力で常にdを取得する直接的な理由です)。

使用する:

- name: Set the jm_env
    set_fact:  
      jm_env: "{{lookup('env', 'Environment')}}"

- name: Set the l_env
    set_fact:  
      l_env: "{% if jm_env=='Develop' %}d{% Elif jm_env=='Staging'%}s{% else %}p{% endif %}"
10
techraf

ファクトベースの条件の例を次のように設定する簡単な方法の1つ:

  - name: Set facts for delete operation results
    set_fact:
        tr_result: "{{ '{\"status\": \"SUCCESS\"}' if (op_result['output'] == 'Deleted') else '{\"status\" : \"FAILED\"}' }}"

注:op_resultは辞書であり、すでに定義されていると想定します。

コードはテストされ、うまく機能しています。

4
S.K. Venkat