【发布时间】:2017-11-01 11:21:38
【问题描述】:
说明
假设我有一本字典 mydict 设置为 { "key1": "value1" }:
-
Ansible 中
dictsort过滤器(mydict|dictsort)的结果似乎是一个包含另一个列表的列表:[ [ "key1", "value1" ] ] -
但是,当直接在 Jinja2 模板
(mydict|dictsort)[0]中访问此列表的第一个元素时,它呈现出一个奇怪的外观:(u'key1', u'value1') -
然后,如果我使用
(mydict|dictsort)的值设置一个事实,它的行为就像一个常规列表 - 使用[0]访问第一个元素会导致:[ "key1", "value1" ]访问其
[0]元素返回key1。 但如果我设置一个值为
(mydict|dictsort)[0]的事实,它的行为就像一个字符串——访问[0]元素会返回第一个字符,即(。另一方面,如果我直接访问子元素,例如
(mydict|dictsort)[0][0],它的行为就像一个列表,即返回key1。
问题
什么是
(u'key1', u'value1')?dictsort产生什么样的对象?如何以一致、可靠的方式访问
dictsort结果?
完整的剧本:
---
- hosts: localhost
gather_facts: no
connection: local
vars:
mydict:
key1: value1
tasks:
- name: show dict
debug:
msg: "{{ mydict }}"
- name: show mydict|dictsort
debug:
msg: "{{ mydict|dictsort }}"
- set_fact:
mydict_dictsorted: "{{ mydict|dictsort }}"
- name: show (mydict|dictsort)[0]
debug:
msg: "{{ (mydict|dictsort)[0] }}"
- name: show mydict_dictsorted[0]
debug:
msg: "{{ mydict_dictsorted[0] }}"
- name: show (mydict|dictsort|list)[0]
debug:
msg: "{{ (mydict|dictsort|list)[0] }}"
- name: show (mydict_dictsorted|list)[0]
debug:
msg: "{{ (mydict_dictsorted|list)[0] }}"
- set_fact:
mydict_dictsorted_element: "{{ (mydict|dictsort)[0] }}"
- name: mydict_dictsorted_element
debug:
msg: "{{ mydict_dictsorted_element }}"
- name: mydict_dictsorted_element[0]
debug:
msg: "{{ mydict_dictsorted_element[0] }}"
- name: (mydict|dictsort)[0][0]
debug:
msg: "{{ (mydict|dictsort)[0][0] }}"
完整的成绩单:
PLAY [localhost] ********************************************************************************************
TASK [show dict] ********************************************************************************************
ok: [localhost] => {
"msg": {
"key1": "value1"
}
}
TASK [show mydict|dictsort] *********************************************************************************
ok: [localhost] => {
"msg": [
[
"key1",
"value1"
]
]
}
TASK [set_fact] *********************************************************************************************
ok: [localhost]
TASK [show (mydict|dictsort)[0]] ****************************************************************************
ok: [localhost] => {
"msg": "(u'key1', u'value1')"
}
TASK [show mydict_dictsorted[0]] ****************************************************************************
ok: [localhost] => {
"msg": [
"key1",
"value1"
]
}
TASK [show (mydict|dictsort|list)[0]] ***********************************************************************
ok: [localhost] => {
"msg": "(u'key1', u'value1')"
}
TASK [show (mydict_dictsorted|list)[0]] *********************************************************************
ok: [localhost] => {
"msg": [
"key1",
"value1"
]
}
TASK [set_fact] *********************************************************************************************
ok: [localhost]
TASK [mydict_dictsorted_element] ****************************************************************************
ok: [localhost] => {
"msg": "(u'key1', u'value1')"
}
TASK [mydict_dictsorted_element[0]] *************************************************************************
ok: [localhost] => {
"msg": "("
}
TASK [(mydict|dictsort)[0][0]] ******************************************************************************
ok: [localhost] => {
"msg": "key1"
我检查了copy/content 的值,它们与debug 的值相同(缩进除外),因此为了清楚起见,发布debug 结果。
【问题讨论】:
标签: ansible jinja2 ansible-template