ANSIBLE выполнить задачу, если ключ существует в переменной словаря - PullRequest
0 голосов
/ 16 октября 2019

У меня есть книга с входным словарём. Я хочу выполнить задачу для 4 «элементов», только если они существуют в словаре.

Я сделал простую книгу для тестирования

---
- hosts: 127.0.0.1
  gather_facts: False

  vars:
    my_dict:
      level1:
        level10: niveau_10
      level2: niveau_2

  tasks:
    - name: display dictionary content
      debug: var=my_dict

    - name: iterate over dict
      debug: var="{{item}}"
      with_items:
        - my_dict.level2
        - my_dict.level1.level10
        - my_dict.level3
      when: item is defined

Когда я выполнял свою книгу, я ожидал, что нетчтобы увидеть какие-либо выходные данные для my_dict.level3, но, похоже, как мне правильно выполнить мой тест?

bash$ ansible-playbook -i hosts test_item.yml

PLAY [127.0.0.1] **************************************************************************************************

TASK [display dictionary content] *********************************************************************************
ok: [127.0.0.1] => {
    "my_dict": {
        "level1": {
            "level10": "niveau_10"
        },
        "level2": "niveau_2"
    }
}

TASK [iterate over dict] ******************************************************************************************
ok: [127.0.0.1] => (item=my_dict.level2) => {
    "item": "my_dict.level2",
    "my_dict.level2": "niveau_2"
}
ok: [127.0.0.1] => (item=my_dict.level1.level10) => {
    "item": "my_dict.level1.level10",
    "my_dict.level1.level10": "niveau_10"
}
ok: [127.0.0.1] => (item=my_dict.level3) => {
    "item": "my_dict.level3",
    "my_dict.level3": "VARIABLE IS NOT DEFINED!"
}

PLAY RECAP ********************************************************************************************************
127.0.0.1                  : ok=2    changed=0    unreachable=0    failed=0

Спасибо за ваши отзывы.

S,

1 Ответ

1 голос
/ 16 октября 2019

Q: "Когда я выполняю свою книгу игр, я ожидал, что не вижу никакого вывода для my_dict.level3, но, похоже, как мне правильно выполнить мой тест?"

A: В цикле всегда определяется item, а "when: item is defined" всегда true.

Можно просто проверить «голую переменную». См. CONDITIONAL_BARE_VARS и попробуйте

  when: item
  ignore_errors: true

Сокращенный вывод должен выглядеть следующим образом (исключая предупреждения и ошибки)

"ansible_loop_var": "item", 
"item": "my_dict.level2", 
"my_dict.level2": "niveau_2"

"ansible_loop_var": "item", 
"item": "my_dict.level1.level10", 
"my_dict.level1.level10": "niveau_10"

...ignoring

localhost: ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=1


Примечания
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...