質問:

質問:

次のスクリプトを使用します。

~ # cat play.yml

- name: MAIN PLAY
  hosts: localhost
  gather_facts: no

  vars:
    status:
      check1: present
      check2: ""

  tasks:
  - debug:
      var: status

  - name: Verify status
    set_fact:
      status_old: "{{status}}"
      status_new:
        check1: "{{'present' if status.check1 is defined and status.check1 != '' else 'absent'}}"
        check2: "{{'present' if status.check2 is defined and status.check2 != '' else 'absent'}}"
  
  - name: Combine facts
    set_fact:
      status: "{{status|combine(status_old, status_new, recursive=True) }}"

  - debug:
      var: status

出力:

PLAY [MAIN PLAY] **********************************************************************************************************************************************************************************************************************************************************

TASK [debug] **************************************************************************************************************************************************************************************************************************************************************
ok: [localhost] => {
    "status": {
        "check1": "present",
        "check2": ""
    }
}

TASK [Verify status] ******************************************************************************************************************************************************************************************************************************************************
ok: [localhost]

TASK [Combine facts] ******************************************************************************************************************************************************************************************************************************************************
ok: [localhost]

TASK [debug] **************************************************************************************************************************************************************************************************************************************************************
ok: [localhost] => {
    "status": {
        "check1": "present",
        "check2": "absent"
    }
}

ご覧のとおり、これはうまくいきますが、2番目の使命はショーにあるはずname: Combine factsです。

質問:

変数が存在し、検出された条件に基づいて特定の状態を設定できることを確認するより良い方法はありますか?
ここでの目標は、タスクを削除し、「ブロック」を使用せずにタスクname: Combine factsの下にすべてを設定することです。name: Verify status

私もこれをしようとしています:

  - name: Verify status
    set_fact:
      status: "{{ status |combine(status_old, status_new, recursive=True) }}"
      vars:
        status_old: "{{status}}"
        status_new:
          check1: "{{'present' if status.check1 is defined and status.check1 != '' else 'absent'}}"
          check2: "{{'present' if check2 is defined and check2 != '' else 'absent'}}"

しかし今、出力には変化があります。

TASK [debug] **************************************************************************************************************************************************************************************************************************************************************
ok: [localhost] => {
    "status": {
        "check1": "present",
        "check2": ""
    }
}

「set_fact」を次に設定すると

- name: Verify status
  set_fact:
    status:
      check2: present

status.check1消えたより

ok: [localhost] => {
    "status": {
        "check2": "present"
    }
}

どんな提案がありますか?

ベストアンサー1

status_oldそれらを設定してstatus_new組み合わせる理由はありません。statusstateの値を簡単に変更できますset_fact。代わりに:

  - name: Verify status
    set_fact:
      status_old: "{{status}}"
      status_new:
        check1: "{{'present' if status.check1 is defined and status.check1 != '' else 'absent'}}"
        check2: "{{'present' if status.check2 is defined and status.check2 != '' else 'absent'}}"
  
  - name: Combine facts
    set_fact:
      status: "{{status|combine(status_old, status_new, recursive=True) }}"

これを行う:

  - name: Verify status
    set_fact:
      status:
        check1: "{{'present' if status.check1 is defined and status.check1 != '' else 'absent'}}"
        check2: "{{'present' if status.check2 is defined and status.check2 != '' else 'absent'}}"

おすすめ記事