如何计算 Ansible 中数组中元素的数量?

如何计算 Ansible 中数组中元素的数量?

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)?

相关内容