web-dev-qa-db-ja.com

ansible with_itemsループの条件で特定のアイテムをスキップする

追加のステップを生成せずに、条件付きで、Ansible with_itemsループ演算子の一部の項目をスキップすることは可能ですか?

ちょうど例:

- name: test task
    command: touch "{{ item.item }}"
    with_items:
      - { item: "1" }
      - { item: "2", when: "test_var is defined" }
      - { item: "3" }

このタスクでは、test_varが定義されている場合にのみファイル2を作成します。

12
m_messiah

他の答えは近いですが、すべてのアイテムをスキップします!=2。それはあなたが望むものではないと思います。これが私がやることです:

- hosts: localhost
  tasks:
  - debug: msg="touch {{item.id}}"
    with_items:
    - { id: 1 }
    - { id: 2 , create: "{{ test_var is defined }}" }
    - { id: 3 }
    when: item.create | default(True) | bool
12
Petro026

when:タスクを条件として、各アイテムに対して評価されます。したがって、この場合、あなたはただ行うことができます:

...
with_items:
- 1
- 2
- 3
when: item != 2 and test_var is defined
3
nitzmahone

ファイル1とファイル3は常に作成されますが、ファイル2はtest_varが定義されています。 ansibleのwhen条件を使用すると、次のような個々のアイテムではなく、タスク全体で機能します。

- name: test task
  command: touch "{{ item.item }}"
  with_items:
      - { item: "1" }
      - { item: "2" }
      - { item: "3" }
  when: test_var is defined

このタスクでは、3つすべてのラインアイテム1、2、3の状態をチェックします。

ただし、これは2つの簡単なタスクで実現できます。

- name: test task
  command: touch "{{ item }}"
  with_items:
      - 1 
      - 3

- name: test task
  command: touch "{{ item }}"
  with_items:
      - 2
  when: test_var is defined
0
Deepali Mittal