динамически получать доступные факты в playbook

У меня есть доступные факты, как показано ниже,

 "facter_partitions": {
            "/dev/loop0": {
                "backing_file": "/a",
                "size": "10.92 GiB",
                "size_bytes": 3080000000
            },
            "/dev/loop1": {
                "backing_file": "/b",
                "size": "11.92 GiB",
                "size_bytes": 1080000000
            },
            "/dev/loop10": {
                "backing_file": "/c",
                "size": "12.02 GiB",
                "size_bytes": 2064000000
            }
            },

Как мы можем динамически получать пары ключей и значений в playbook. может использовать для цикла.


person Community    schedule 07.04.2020    source источник


Ответы (1)


Это словарь. Вы должны преобразовать его в список, используя dict2items , то вы можете получить доступ к парам ключ-значение для каждого элемента, как

---
- hosts: localhost
  gather_facts: false
  vars:
     "facter_partitions": {
            "/dev/loop0": {
                "backing_file": "/a",
                "size": "10.92 GiB",
                "size_bytes": 3080000000
            },
            "/dev/loop1": {
                "backing_file": "/b",
                "size": "11.92 GiB",
                "size_bytes": 1080000000
            },
            "/dev/loop10": {
                "backing_file": "/c",
                "size": "12.02 GiB",
                "size_bytes": 2064000000
            }
       }
  tasks:
    - debug: msg="{{ item.key }} -  {{ item.value.backing_file }}"
      loop: "{{ facter_partitions | dict2items }}"

Это приведет к выводу, например,

TASK [debug] *******************************************************************
ok: [127.0.0.1] => (item={'key': u'/dev/loop10', 'value': {u'size_bytes': 2064000000, u'backing_file': u'/c', u'size': u'12.02 GiB'}}) => {
    "msg": "/dev/loop10 -  /c"
}
ok: [127.0.0.1] => (item={'key': u'/dev/loop1', 'value': {u'size_bytes': 1080000000, u'backing_file': u'/b', u'size': u'11.92 GiB'}}) => {
    "msg": "/dev/loop1 -  /b"
}
ok: [127.0.0.1] => (item={'key': u'/dev/loop0', 'value': {u'size_bytes': 3080000000, u'backing_file': u'/a', u'size': u'10.92 GiB'}}) => {
    "msg": "/dev/loop0 -  /a"
}
person franklinsijo    schedule 07.04.2020
comment
Спасибо за информацию, но если я попытаюсь ниже playbook получить значение backing_file, это не удастся - отладка: msg: {{ item.key }} - {{ item.value.backing_file }} loop: {{ facter_partitions | dict2items }} Ошибка: «объект dict» не имеет атрибута «backing_file - person ; 07.04.2020
comment
Используйте with_dict: "{{ facter_partitions }}" вместо loop и попробуйте. Оба идентичны. Не уверен, почему он не выбирает вложенный ключ - person franklinsijo; 07.04.2020
comment
Используется с _dict. Сбой с той же ошибкой для value.backing_file, ** {msg: Задача включает параметр с неопределенной переменной. Ошибка: «объект dict» не имеет атрибута «backing_file**». где, поскольку он работает для value.size - person ; 07.04.2020
comment
спасибо @franklinsijo, проблема была решена. На самом деле backing_file отсутствует в других случаях. when: item.value.backing_file is defined заявление решило проблему - person ; 16.04.2020
comment
Ах, ладно, поскольку образец словаря в вопросе не пропустил ни одного ключа, я не подумал о добавлении условного выражения. - person franklinsijo; 16.04.2020