python-2.7 - 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 文件中的顺序相同。
谢谢!
解决方案
变量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
推荐阅读
- bash - bash 脚本在 MAC 终端上运行时给我一个错误
- spring-integration - 将 JdbcMetadataStore 与 s3-inbound-streaming-channel-adapter 一起使用
- html - 如何自定义 CK Editor 的输出?
- azure - 如何使用 Terraform 为 Azure 服务主体创建客户端密码
- angular - 角度垫选择无法显示选择项目的图标
- java - 如何在每个场景中运行一个 java 方法
- quarkus - 在 Quarkus 上配置 P6Spy
- php - Laravel:如何使用 select2 将多个数据插入 mysql 数据库?
- python - 值未更新为 dict
- java - Java math.random 查询、取整(概念理解)