Ansible - 如何将一个列表分成两个列表?

3
我搜索并尝试了每种方法将列表分成两个列表。 没有常规过滤器或其他支持。 有关将列表合并为一个的示例和帖子,但没有反向操作的内容。
我编写了下面的代码,但由于非常奇怪的原因,它无法正常工作,列表没有属性0?
---
- hosts: localhost
  gather_facts: no
  vars:
    - listA: ['a','b','c','d']
    - listB: []
    - listC: []

  tasks:
  - block:
      - debug:
          var: listA[0]
      - debug:
          var: listB
      - debug:
          var: listC
  - set_fact:
      listB: "{{ listB + [listA[item]] }}"
    with_sequence: start=0 end=3 stride=2
  - set_fact:
      listC: "{{ listC + [listA[item]] }}"
    with_sequence: start=1 end=3 stride=2

  - block:
      - debug:
          var: listA
      - debug:
          var: listB
      - debug:
          var: listC

这是使用Ansible 2.1.1.0进行的测试运行结果。
$ ansible-playbook test_sequenceeasy.yml
[WARNING]: log file at '{{planfile | dirname}}/AnsibleLog.txt' is not writeable and we cannot create it, aborting


PLAY [localhost] ***************************************************************

TASK [debug] *******************************************************************
ok: [localhost] => {
    "listA[0]": "a"
}

TASK [debug] *******************************************************************
ok: [localhost] => {
    "listB": []
}

TASK [debug] *******************************************************************
ok: [localhost] => {
    "listC": []
}

TASK [set_fact] ****************************************************************
fatal: [localhost]: FAILED! => {"failed": true, "msg": "the field 'args' has an invalid value, which appears to include a variable that is undefined. The error was: 'list object' has no attribute u'0'\n\nThe error appears to have been in '/apps/infra/Tools/Ansible_WLNMiddleware/test_sequenceeasy.yml': line 17, column 5, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n          var: listC\n  - set_fact:\n    ^ here\n"}

NO MORE HOSTS LEFT *************************************************************
 [WARNING]: Could not create retry file 'test_sequenceeasy.retry'.         [Errno 2] No such file or directory: ''

https://github.com/ansible/ansible/issues/17852 - techraf
感谢techraf提出这个讨论。 - user3376413
1个回答

4

我找到了原因。

关于错误信息 "'list object' has no attribute u'0'" 的问题是Ansible没有将0识别为数字,而是认为0是字符串。怎么可能呢?Ansible如何迭代开始、结束和步长,并将值存储到“字符串”中?我不知道。

但是以下代码更新解决了这个问题:

---
- hosts: localhost
  gather_facts: no
  vars:
    - listA: ['a','b','c','d']
    - listB: []
    - listC: []

  tasks:
  - block:
      - debug:
          var: listA[0]
      - debug:
          var: listB
      - debug:
          var: listC
  - set_fact:
      listB: "{{ listB + [ listA[item|int] ] }}"
    with_sequence: start=0 end=3 stride=2
  - set_fact:
      listC: "{{ listC + [ listA[item|int] ] }}"
    with_sequence: start=1 end=3 stride=2

  - block:
      - debug:
          var: listA
      - debug:
          var: listB
      - debug:
          var: listC

结果如下:

$ ansible-playbook test_sequenceeasy.yml
[WARNING]: log file at '{{planfile | dirname}}/AnsibleLog.txt' is not writeable and we cannot create it, aborting


PLAY [localhost] ***************************************************************

TASK [debug] *******************************************************************
ok: [localhost] => {
    "listA[0]": "a"
}

TASK [debug] *******************************************************************
ok: [localhost] => {
    "listB": []
}

TASK [debug] *******************************************************************
ok: [localhost] => {
    "listC": []
}

TASK [set_fact] ****************************************************************
ok: [localhost] => (item=0)
ok: [localhost] => (item=2)

TASK [set_fact] ****************************************************************
ok: [localhost] => (item=1)
ok: [localhost] => (item=3)

TASK [debug] *******************************************************************
ok: [localhost] => {
    "listA": [
        "a",
        "b",
        "c",
        "d"
    ]
}

TASK [debug] *******************************************************************
ok: [localhost] => {
    "listB": [
        "a",
        "c"
    ]
}

TASK [debug] *******************************************************************
ok: [localhost] => {
    "listC": [
        "b",
        "d"
    ]
}

PLAY RECAP *********************************************************************
localhost                  : ok=8    changed=0    unreachable=0    failed=0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接