Как обеспечить порядок с dict в Ansible?

у меня есть словарь-тип данных, которые я хочу перебрать и сохранить порядок важно:

with_dict_test:
  one:   1
  two:   2
  three: 3
  four:  4
  five:  5
  six:   6

Теперь, когда я пишу задачу для печати ключей и значений, они печатаются в кажущемся случайном порядке (6, 3, 1, 4, 5, 2).

---
- name: with_dict test
  debug: msg="{{item.key}} --> {{item.value}}"
  with_dict: with_dict_test

как я могу применить Ansible для итерации в данном порядке? Или есть что-нибудь лучше, чем with_dict? Мне действительно нужен как ключ, так и значение во время выполнения задачи...

2 ответов


Я не вижу простого способа использовать дикты, поскольку они определяют там порядок из порядка его хэшированных ключей.
Вы можете сделать следующее:

with_dict_test:
  - { key: 'one', value: 1 }
  - { key: 'two', value: 2 }
  - { key: 'three', value: 3 }
  - { key: 'four', value: 4 }
  - { key: 'five', value: 5 }
  - { key: 'six', value: 6 }

и в playbook просто заменить with_dict С with_items:

---
- name: with_dict test
  debug: msg="{{item.key}} --> {{item.value}}"
  with_items: with_dict_test

если вы найдете это решение (объявление переменной) уродливым, вы можете сделать следующее:

key: ['one', 'two', 'three', 'four', 'five', 'six']
values: [1, 2, 3, 4, 5, 6]

и в playbook

---
- name: with_dict test
  debug: msg="{{item.0}} --> {{item.1}}"
  with_together:
    - key
    - value

Я не совсем уверен, но, возможно, это поможет вам по пути:

  - hosts: localhost
    vars:
      dict:
        one: 1
        two: 2
        three: 3
      sorted: "{{ dict|dictsort(false,'value') }}"

    tasks:
      - debug:
          var: sorted
      - debug:
          msg: "good {{item.1}}"
        with_items: sorted

Я предполагаю,что вы можете использовать фильтр Jinja для сортировки сложных значений. Еще одна вещь, которую вы можете проверить, - это объединение dict.values()|list и with_sequence, но все, что вы доите из этого камня, не будет точно кричать "ремонтопригодно"."