2017-10-19 27 views
0
删除空行

所以我已经得到了检索广告组的成员,并给了我这样的用户ID列表的剧本:Ansible从列表

tasks: 
- name: Get group members 
    set_fact: 
    member: "{{ item }}" 
    register: members 
    with_ldap: 
    - context: group_members 
    - Jira_Administrators_GG 

- name: Get userids 
    set_fact: 
    userid: "{{ lookup('ldap', '{{ item.item }}', context='users') }}" 
    register: userids 
    with_items: "{{ members.results }}" 

- name: Create list of userids 
    set_fact: 
    userid_list: "{{ userids.results | map(attribute='ansible_facts.userid') | list }}" 

麻烦的是我结束了一个一些空行的结果列表:

- name: Show userids 
    debug: 
    msg: "{{ hostvars['localhost']['userid_list'] }}" 

输出:

TASK [Show userids] ************************************** 

ok: [xxxxxxxxx01] => { 
    "msg": [ 
     "xxxxxxxxx55", 
     "xxxxxxxxx58", 
     "xxxxxxxxx71", 
     [], 
     "xxxxxxxxx46", 
     [], 
     "xxxxxxxxx27", 
     [], 
     "xxxxxxxxx63", 
     "xxxxxxxxx27", 
     [], 
     "xxxxxxxxx04", 
     "xxxxxxxxx87" 
    ] 
} 

有谁知道如何删除Bla从列表中的nk行?我已经通过http://jinja.pocoo.org/docs/2.9/templates/#builtin-filters一看,并试图一对夫妇像replace()rejectattr()maplist之间,但不管是什么原因,我没有得到它的权利。

编辑 - 没有工作的一些尝试......

我显然没有得到正确的语法与此一:

- name: Create list of userids 
    set_fact: 
    userid_list: "{{ userids.results | rejectattr('ansible_facts.userid', 'equalto', '') | map(attribute='ansible_facts.userid') | list }}" 

..because输出是:

An exception occurred during task execution. To see the full traceback, use -vvv. The error was: TemplateRuntimeError: no test named '' 
fatal: [localhost]: FAILED! => {"failed": true, "msg": "Unexpected failure during module execution.", "stdout": ""} 

我又试图map之前移动rejectattr()。这是更好的,实际上它运行,但似乎并没有做出结果列表中的任何差异:

- name: Create list of userids 
    set_fact: 
    userid_list: "{{ userids.results | rejectattr('ansible_facts.userid', 'equalto', '') | map(attribute='ansible_facts.userid') | list }}" 

我试着用reject()代替rejectattr()这样的:

- name: Create list of userids 
    set_fact: 
    userid_list: "{{ userids.results | reject('equalto', '') | map(attribute='ansible_facts.userid') | list }}" 

...和喜欢这样的:

- name: Create list of userids 
    set_fact: 
    userid_list: "{{ userids.results | map(attribute='ansible_facts.userid') | reject('equalto', '') | list }}" 

我已经尝试了一些置换,我也试着比较'[]'而不是'',因为我的空行显示就像在结果列表中那样。我想我只是不明白如何正确应用过滤器。

编辑 - 变量内容

现在,如果我做

- debug: 
    var: userids 

我得到这个(截断显示2分的结果已经用户ID填充和1与用户ID空白):

ok: [localhost] => { 
    "userids": { 
     "changed": false, 
     "msg": "All items completed", 
     "results": [ 
      { 
       "_ansible_item_result": true, 
       "_ansible_no_log": false, 
       "ansible_facts": { 
        "userid": "xxxxxxxxx55" 
       }, 
       "changed": false, 
       "item": { 
        "_ansible_item_result": true, 
        "_ansible_no_log": false, 
        "ansible_facts": { 
         "member": "CN=Liam Fitzpatrick,OU=My User OU,DC=my,DC=domain,DC=com" 
        }, 
        "changed": false, 
        "item": "CN=Liam Fitzpatrick,OU=My User OU,DC=my,DC=domain,DC=com" 
       } 
      }, 
      { 
       "_ansible_item_result": true, 
       "_ansible_no_log": false, 
       "ansible_facts": { 
        "userid": "xxxxxxxxx58" 
       }, 
       "changed": false, 
       "item": { 
        "_ansible_item_result": true, 
        "_ansible_no_log": false, 
        "ansible_facts": { 
         "member": "CN=Mr Jones,OU=My User OU,DC=my,DC=domain,DC=com" 
        }, 
        "changed": false, 
        "item": "CN=Mr Jones,OU=My User OU,DC=my,DC=domain,DC=com" 
       } 
      }, 
      { 
       "_ansible_item_result": true, 
       "_ansible_no_log": false, 
       "ansible_facts": { 
        "userid": [] 
       }, 
       "changed": false, 
       "item": { 
        "_ansible_item_result": true, 
        "_ansible_no_log": false, 
        "ansible_facts": { 
         "member": "CN=Mr Smith,OU=My User OU,DC=my,DC=domain,DC=com" 
        }, 
        "changed": false, 
        "item": "CN=Mr Smith,OU=My User OU,DC=my,DC=domain,DC=com" 
       } 
      } 
+0

有点苛刻!我会说我比懒更傻。让我有什么不工作的一些例子更新的问题... – fitzplb

+0

我已经将服务器名称和用户ID列出,因为我不允许公开分享它们。 'userid'是“Get userids”任务中设置的一个事实。 'userids'是包含用户标识列表的注册变量。 'ansible_facts.userid'是我如何从'userids.result'中检索用户名的。 – fitzplb

+0

为什么史密斯先生没有账号?像其他小组成员一样,它是一个常规账户吗? – techraf

回答

0

你有一个字符串列表(例如"xxxxxxxxx63")和空列表([]) - 不为空字符串。

您可以使用Jinja2的select/reject过滤器,例如:

- name: Create list of userids 
    set_fact: 
    userid_list: "{{ userids.results | map(attribute='ansible_facts.userid') | select('string') | list }}" 

附:并避免嵌套大括号,使用:

"{{ lookup('ldap', item.item, context='users') }}" 
+0

非常感谢你!这是绝对有道理的。所以,如果我确实有空字符串'“”'那么也许我的'rejectattr()'尝试之一可以工作? – fitzplb

+0

是的,我想是的。 –