【问题标题】:Ansible list not orderedAnsible 列表未排序
【发布时间】:2020-10-08 00:47:09
【问题描述】:

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

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.7 ansible


    【解决方案1】:

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

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

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

    答:这是用例的错误数据结构。YAML mapping s an unordered set。您不能“以相同的顺序对其进行迭代”,因为没有顺序。使用键列表。例如

        - 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
    

    【讨论】:

    • 感谢您的回复,问题my_list我无法排序,我需要按照param.yml文件中的相同顺序对其进行迭代(我只是在这里简化了它)
    • 这个问题没有解决办法。 YAML mapping s an unordered set。即您不能“以相同的顺序对其进行迭代”,因为没有顺序。
    • 谢谢,这个文件包含对象的字典,最后还有另一个自动化插入到这个文件中,我需要通过 ansible 插入最后 10 个对象,将其转换为列表并获取最后一个10 没有用(由于这个随机顺序),知道我怎么能做到这一点吗?
    • 您必须自己解析文件。
    • @sadok-f 建立在这个答案的基础上,你可以做的是有一个包含值和你要排序的字段的字典(对不起,这是 JSON 表示法,比更适合评论 YAML 之一)例如{'a': { 'value': 'val1', 'added_at': '2020-10-07 08:00:00' } } 然后对这个 added_at 字段进行排序
    猜你喜欢
    • 2017-03-11
    • 1970-01-01
    • 1970-01-01
    • 2017-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-23
    • 1970-01-01
    相关资源
    最近更新 更多