Ansible:循环执行我们的shell命令(Linux用户组搜索)结果并显示组

时间:2019-12-10 14:54:54

标签: ansible

Ansible:循环执行我们的shell命令(Linux用户组搜索)结果并显示组

检查组是否存在的任务

- name: "Checking if group doesn't exist"
  shell: "grep -i {{ item.group }} /etc/group"
  register: presence
  loop: "{{ UserAddList.add_users }}"
  ignore_errors: true
  no_log: true

Json输入文件:

UserAddList是一个json文件

{
  "add_users": [
    {
      "name": "test1_123",
      "group": "test1_123",
      "additional_groups":
      [
        "test2",
        "group1"
      ],
      "password" : "test1_newcdsaf",
      "sudo_entry": "ALL=(ALL)  NOPASSWD: ALL",
      "comment": "test1"
    }
  ],
  "delete_users": [
                  ]
}

显示组的任务不存在

- name: The following groups does't' exist
  debug:
    msg:
      "{{ item._ansible_item_label.group }}"
  loop: "{{ presence.results }}"

输出:

(item={
  '_ansible_parsed': True,
  'stderr_lines': [

  ],
  u'changed': True,
  u'stdout': u'',
  '_ansible_item_result': True,
  u'msg': u'non-zero return code',
  u'delta': u'0:00:00.008175',
  'stdout_lines': [

  ],
  '_ansible_item_label': {
    u'comment': u'test1',
    u'password': u'test1_newcdsaf',
    u'group': u'test1_123',
    u'name': u'test1_123',
    u'sudo_entry': u'ALL=(ALL)  NOPASSWD: ALL',
    u'additional_groups': [
      u'test2',
      u'group1'
    ]
  },
  u'end': u'2019-12-10 14:23:15.725676',
  '_ansible_no_log': True,
  'item': {
    u'comment': u'test1',
    u'password': u'test1_newcdsaf',
    u'group': u'test1_123',
    u'name': u'test1_123',
    u'sudo_entry': u'ALL=(ALL)  NOPASSWD: ALL',
    u'additional_groups': [
      u'test2',
      u'group1'
    ]
  },
  u'cmd': u'grep -i test1_123 /etc/group',
  u'failed': True,
  u'stderr': u'',
  u'rc': 1,
  u'invocation': {
    u'module_args': {
      u'warn': True,
      u'executable': None,
      u'_uses_shell': True,
      u'_raw_params': u'grep -i test1_123 /etc/group',
      u'removes': None,
      u'argv': None,
      u'creates': None,
      u'chdir': None,
      u'stdin': None
    }
  },
  u'start': u'2019-12-10 14:23:15.717501'
})=>{
  "changed": false,
  "item": {
    "changed": true,
    "cmd": "grep -i test1_123 /etc/group",
    "delta": "0:00:00.008175",
    "end": "2019-12-10 14:23:15.725676",
    "failed": true,
    "invocation": {
      "module_args": {
        "_raw_params": "grep -i test1_123 /etc/group",
        "_uses_shell": true,
        "argv": null,
        "chdir": null,
        "creates": null,
        "executable": null,
        "removes": null,
        "stdin": null,
        "warn": true
      }
    },
    "item": {
      "additional_groups": [
        "test2",
        "group1"
      ],
      "comment": "test1",
      "group": "test1_123",
      "name": "test1_123",
      "password": "test1_newcdsaf",
      "sudo_entry": "ALL=(ALL)  NOPASSWD: ALL"
    },
    "msg": "non-zero return code",
    "rc": 1,
    "start": "2019-12-10 14:23:15.717501",
    "stderr": "",
    "stderr_lines": [

    ],
    "stdout": "",
    "stdout_lines": [

    ]
  },
  "msg": "test1_123"
}

我不想显示整个输出,我只想显示组信息。

调试也将打印所有输入数据。

请提出任何建议

1 个答案:

答案 0 :(得分:0)

  

调试也将打印所有输入数据。

实际上不是打印数据的debug:任务,而是ansible向您显示了正在循环的数据。但是,您正在顶层loop:列表中使用presence.results,并且.results不仅包含您关注的输出,还包含调用参数,成功或失败以及实际的返回您关心的数据

有两种方法可以解决该问题:告诉ansible您只希望它在循环标签中显示较小的内容,或者将loop:更改为实际上仅循环显示已删除的用户

第一种方式,loop_control:可以做到这一点(它甚至引用了您在文档中所说的确切情况当遍历复杂的数据结构时,任务的控制台输出可能非常庞大。显示的输出,请使用带有loop_control的label指令):

- name: The following groups does't' exist
  debug:
    msg:
      "{{ item._ansible_item_label.group }}"
  loop: "{{ presence.results }}"
  loop_control:
    label: "{{ item.item.name }}"

第二种方式,只需选择您关心的组,然后msg:进行选择即可:

- name: The following groups does't' exist
  debug:
    msg:
      "{{ item }}"
  loop: "{{ presence.results | map(attribute='item') | map(attribute='group') | list }}"