2017-08-15 64 views
0

我搜索并试图用各种方法将列表分成两个列表。 没有传统的过滤器或任何支持。 有一些关于将列表合并成一个的例子和文章,但没有其他方法。Ansible - 如何将列表分成两个列表?

我在代码下面开发,但它不工作,很奇怪的原因,列表没有属性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: '' 
+0

https://github.com/ansible/ansible/issues/17852 – techraf

+0

感谢techraf为把它提出来讨论 – user3376413

回答

0

我找到了原因。

有关错误消息“'列表对象'没有属性u'0'”的问题是,Ansible没有将0识别为数字,但它认为0是字符串。 什么? Ansible如何迭代开始,结束并跨度并将值存储到“String”中? - 我不知道。

但与下面的代码更新解决了这个问题:

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