首页 > 解决方案 > Ansible 列表未排序

问题描述

我有一个要循环的列表,问题是它给出了一个奇怪的顺序。

param.yml 文件:

my_list:
  a: val1
  b: val2
  c: val3
  d: val3

这是我的简单调试循环:

- name: debug
  debug:
    msg: "{{ item }}"
  loop: "{{ my_list | list }}"

这里的输出:

ok: [host] => (item=a) => {
    "msg": "a"
}
ok: [host] => (item=c) => {
    "msg": "c"
}
ok: [host] => (item=b) => {
    "msg": "b"
}
ok: [host] => (item=d) => {
    "msg": "d"
}

我将 ansible 2.10 与 python 2.7.5 一起使用:

ansible --version
ansible 2.10.2
  config file = /home/ansible.cfg
  configured module search path = [u'/home/ansible/library']
  ansible python module location = /usr/lib/python2.7/site-packages/ansible
  executable location = /bin/ansible
  python version = 2.7.5 (default, Apr  2 2020, 13:16:51) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)]

当我切换到 python3 时的问题,它按预期工作:

ok: [host] => (item=a) => {
    "msg": "a"
}
ok: [host] => (item=b) => {
    "msg": "b"
}
ok: [host] => (item=c) => {
    "msg": "c"
}
ok: [host] => (item=d) => {
    "msg": "d"
}

不幸的是,我无法将环境升级到 python3,我需要列表与 param.yml 文件中的顺序相同。

谢谢!

标签: python-2.7ansible

解决方案


变量my_list不是列表。这是一本字典。无法保证字典的键将被迭代的顺序。使用排序过滤器。例如

    loop: "{{ my_list | list | sort }}"

问:“我需要以与 param.yml 中相同的顺序对其进行迭代”

答:这是用例的错误数据结构。YAML 映射是一个无序集。您不能“以相同的顺序迭代它”,因为没有顺序。使用键列表。例如

    - debug:
        msg: "{{ item }}: {{ my_list[item] }}"
      loop: "{{ my_keys }}"
      vars:
        my_keys: [a,b,c,d]

给出(删节)

  msg: 'a: val1'

  msg: 'b: val2'

  msg: 'c: val3'

  msg: 'd: val3'

下面是一个列表迭代的例子。任务

    - debug:
        msg: "{{ item }}"
      loop: "{{ my_list }}"
      vars:
        my_list:
          - a: val1
          - b: val2
          - c: val3
          - d: val3

给出(删节)

  msg:
    a: val1

  msg:
    b: val2

  msg:
    c: val3

  msg:
    d: val3

推荐阅读