Получить письмо от ldapsearch в Ansible - PullRequest
1 голос
/ 15 января 2020

В основном я пытаюсь из списка лиц выполнить поиск в ldap и получить письмо.

Чтобы получить информацию, я запускаю этот ldapsearch.

- name: Get LDAP information
  command: ldapsearch -x -h ldap.test.com -D "LDAP Service Account" -w "xxxxxxx" -b "CN=Users,DC=example,DC=com" "cn={{item}}" -s sub "(cn=*)" mail
  register: ldap_output
  with_items: "{{owner_list}}"

Это результат ldapsearch (я отредактировал вывод) с успехом и с ошибкой (Daniel and Wrong1)

 [
            {
                "ansible_facts": {
                    "discovered_interpreter_python": "/usr/bin/python"
                },
                "ansible_loop_var": "item",
                "changed": true,
                "cmd": [
                    "ldapsearch",
                    "-x",
                    "-h",
                    "ldap.example.com",
                    "-D",
                    "admin",
                    "-w",
                    "xxxxxxxx",
                    "-b",
                    "CN=Users,DC=example,DC=com",
                    "cn=Daniel",
                    "-s",
                    "sub",
                    "(cn=*)",
                    "mail"
                ],
                "delta": "0:00:00.013156",
                "end": "2020-01-15 06:05:33.225344",
                "failed": false,
                "invocation": {
                    "module_args": {
                        "_raw_params": "ldapsearch -x -h ldap.example.com -D \"admin\" -w \"xxxxxxxx\" -b \"CN=Users,DC=example,DC=com\" \"cn=Daniel\" -s sub \"(cn=*)\" mail",
                        "_uses_shell": false,
                        "argv": null,
                        "chdir": null,
                        "creates": null,
                        "executable": null,
                        "removes": null,
                        "stdin": null,
                        "stdin_add_newline": true,
                        "strip_empty_ends": true,
                        "warn": true
                    }
                },
                "item": "Daniel",
                "rc": 0,
                "start": "2020-01-15 06:05:33.212188",
                "stderr": "",
                "stderr_lines": [],
                "stdout": "# extended LDIF\n#\n# LDAPv3\n# base <CN=Users,DC=example,DC=com> with scope subtree\n# filter: cn=Daniel\n# requesting: (cn=*) mail \n#\n\n# Daniel, Users, example.com\ndn: CN=Daniel,CN=Users,DC=example,DC=com\nmail: daniel@example.com\n\n# search result\nsearch: 2\nresult: 0 Success\n\n# numResponses: 2\n# numEntries: 1",
                "stdout_lines": [
                    "# extended LDIF",
                    "#",
                    "# LDAPv3",
                    "# base <CN=Users,DC=example,DC=com> with scope subtree",
                    "# filter: cn=Daniel",
                    "# requesting: (cn=*) mail ",
                    "#",
                    "",
                    "# Daniel, Users, example.com",
                    "dn: CN=Daniel,CN=Users,DC=example,DC=com",
                    "mail: daniel@example.com",
                    "",
                    "# search result",
                    "search: 2",
                    "result: 0 Success",
                    "",
                    "# numResponses: 2",
                    "# numEntries: 1"
                ]
            },
            {
                "ansible_loop_var": "item",
                "changed": true,
                "cmd": [
                    "ldapsearch",
                    "-x",
                    "-h",
                    "ldap.example.com",
                    "-D",
                    "admin",
                    "-w",
                    "xxxxxxxx",
                    "-b",
                    "CN=Users,DC=example,DC=com",
                    "cn=Wrong1",
                    "-s",
                    "sub",
                    "(cn=*)",
                    "mail"
                ],
                "delta": "0:00:00.014722",
                "end": "2020-01-15 06:05:33.394665",
                "failed": false,
                "invocation": {
                    "module_args": {
                        "_raw_params": "ldapsearch -x -h ldap.example.com -D \"admin\" -w \"xxxxxxxx\" -b \"CN=Users,DC=example,DC=com\" \"cn=Wrong1\" -s sub \"(cn=*)\" mail",
                        "_uses_shell": false,
                        "argv": null,
                        "chdir": null,
                        "creates": null,
                        "executable": null,
                        "removes": null,
                        "stdin": null,
                        "stdin_add_newline": true,
                        "strip_empty_ends": true,
                        "warn": true
                    }
                },
                "item": "Wrong1",
                "rc": 0,
                "start": "2020-01-15 06:05:33.379943",
                "stderr": "",
                "stderr_lines": [],
                "stdout": "# extended LDIF\n#\n# LDAPv3\n# base <CN=Users,DC=example,DC=com> with scope subtree\n# filter: cn=Wrong1\n# requesting: (cn=*) mail \n#\n\n# search result\nsearch: 2\nresult: 0 Success\n\n# numResponses: 1",
                "stdout_lines": [
                    "# extended LDIF",
                    "#",
                    "# LDAPv3",
                    "# base <CN=Users,DC=example,DC=com> with scope subtree",
                    "# filter: cn=Wrong1",
                    "# requesting: (cn=*) mail ",
                    "#",
                    "",
                    "# search result",
                    "search: 2",
                    "result: 0 Success",
                    "",
                    "# numResponses: 1"
                ]
            }
]

Из этого вывода мне нужно получить электронное письмо или получить пустой в случае, если человек не найден. Чтобы получить почту для каждого человека, которого я делаю:

- set_fact:
    mail_list: '{{ mail_list + item.stdout | regex_search("[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}", multiline=True, ignorecase=True)|default("Empty") }}'
  with_items:
    - "{{ldap_output.results}}"

Это вывод, который я получаю от ansible:

TASK [set_fact] *******************************************************************************
fatal: [127.0.0.1]: FAILED! => {"msg": "Unexpected templating type error occurred on ({{ mail_list + item.stdout | regex_search(\"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\\\.[A-Za-z]{2,6}\", multiline=True, ignorecase=True)|default(\"Empty\") }}): can only concatenate list (not \"unicode\") to list"}

Вопрос был бы, как можно Я получаю адрес электронной почты из вывода ldapsearch?

Спасибо, спасибо

Ответы [ 2 ]

0 голосов
/ 21 января 2020

Я заканчиваю тем же регулярным выражением, которое отсутствует при добавлении нового элемента в список. [1001 * С помощью ldapsearch я получил всю информацию в ldap_output, а затем с помощью regex_search я получил письмо.

- name: Obtain email from ldap output
  set_fact:
    mail_list: '{{ mail_list + [ item.stdout |  regex_search("[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}", multiline=True, ignorecase=True) ] }}'
  with_items:
    - "{{ldap_output.results}}"
0 голосов
/ 15 января 2020

Вот простой пример, иллюстрирующий вашу проблему.

Я предлагаю вам упростить свой вопрос, сузив проблему и добавив несколько примеров, чтобы ее было легко смоделировать.

- hosts: localhost
  become: yes
  tasks:

  # example of unicode data in mail_list
  - set_fact:
      mail_list: u'eeeee

  # convert the unicode to string
  - set_fact:
      mail_list: "{{ mail_list.encode('UTF-8') }}"

  # convert the string to list with 1 element
  - set_fact:
      mail_list: "{{ [ mail_list ] }}"

  # now you can append items
  - set_fact:
      mail_list: "{{ mail_list + ['aaa','bbb'] }}"

  - debug:
      msg: "{{ mail_list }}" 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...