Ansible 中从 shell 命令输出生成一个数组,类似于下面这样:
foo: [value0, value1, value2, value3]
现在根据 shell 命令的输出,元素的数量foo
可能会有所不同。
然后我生成一个 jinja2 模板来显示:
foo[0] will return value0
foo[1] will return value1
...
我如何确定存储了多少个元素foo
?
答案1
Number_of_elements: "{{ foo|length }}"
答案2
只是为了扩展 Vladimir Botka 的回复,您确实需要先检查以确保您的项目是一个列表(或字典)!在类型检查方面很容易犯错误,因为这是一个很容易犯的错误。
为了证明这一点,这里有一个示例剧本:
---
- hosts: localhost
gather_facts: false
vars:
a_string: abcd1234
a_list: ['a', 'short', 'list']
a_dict: {'a': 'dictionary', 'with': 'values'}
tasks:
- debug:
msg: |
[
"a_string length: {{ a_string | length }}",
"a_list length: {{ a_list | length }}",
"a_dict length: {{ a_dict | length }}"
]
结果如下:
PLAY [localhost] ******************************************************************************************************************************
TASK [debug] **********************************************************************************************************************************
ok: [localhost] => {
"msg": [
"a_string length: 8",
"a_list length: 3",
"a_dict length: 2"
]
}
PLAY RECAP ************************************************************************************************************************************
localhost : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
那么,在我们检查元素的数量之前,我们如何确认这实际上是一个列表?
像这样:
{% if my_value is string %}
1
{% elif my_value is iterable %}
{{ my_value | length }}
{% endif %}
我们必须检查它是否是一个字符串第一的因为字符串也是可迭代的,而字典(映射)和列表(序列)不是字符串。整数和浮点数没有“长度”属性,所以也许你也应该先检查一下(使用if my_value is number
)?