Как обработать вывод, который может быть строкой или списком в Ansible - PullRequest
0 голосов
/ 13 февраля 2020

Здравствуйте, у меня возникла следующая проблема. В основном я запускаю запрос на AD с помощью команды PS, чтобы получить список подразделений. Затем я хочу сравнить мою переменную с этим списком. это команда PS:

- name: PS - Pull SITE Sub OUs from AD for specific application 
  win_command: powershell - 
  args:
    stdin: "Get-ADOrganizationalUnit -LDAPFilter '(name=*)' -SearchScope 1  -SearchBase 'OU=SITES,DC=xxx,DC=int' -Server domain.int | select-object name | ConvertTo-Json"
  become: yes
  register: ou_site_out

выводится, когда существует только одно подразделение: изменено: [хост] => {"изменено": истина, "cmd": "powershell -", "delta": "0: 00: 00.913282", "end": "2020-02-13 04: 04: 26.289368", "r c": 0, "start": "2020-02-13 04: 04: 25.376086 "," stderr ":" "," stderr_lines ": []," stdout ":" {\ r \ n \ "name \": \ "OU1 \" \ r \ n} \ r \ n " , "stdout_lines": ["{", "\" name \ ": \" OU1 \ "", "}"]}

вывод при наличии нескольких OU:

изменено: [хост] => {"изменено": true, "cmd": "powershell -", "delta": "0: 00: 00.875002", "end": "2020-02-13 04: 25: 49.409360 "," r c ": 0," start ":" 2020-02-13 04: 25: 48.534358 "," stderr ":" "," stderr_lines ": []," stdout ":" [\ r \ n {\ r \ n \ "name \": \ "OU1 \" \ r \ n}, \ r \ n {\ r \ n \ "name \": \ "OU2 \" \ r \ n}, \ r \ n {\ r \ n \ "name \": \ "OU3 \" \ r \ n}] "

, затем я устанавливаю факт из стандартного вывода следующим образом:

- name: Set list of  OUs as facts
   set_fact:
      ou_site_list: "{{ ou_site_out.stdout | from_json }}"

Проблема начинается здесь. Если ou_site_out содержит только один элемент (существует только 1 OU), то ou_site_list вернет строку

TASK [debug] *******************************************************************
ok: [host] => {
    "ou_site_list": {
        "name": "OU1"

, но если есть несколько OU, я получу список:

TASK [debug] *******************************************************************
ok: [host] => {
    "ou_site_list": [
        {
            "name": "OU1"
        },
        {
            "name": "OU2"
        },
        {
            "name": "OU3"}]

Как я могу затем обработайте список ou_site_list, если я не знаю, будет ли это список строк?

Спасибо за любую помощь

1 Ответ

2 голосов
/ 13 февраля 2020

На основе исключительно на приведенных вами примерах вы можете узнать, взглянув на главный символ выходных данных: если это [, то list, иначе его необходимо переупаковать в list. Фильтр type_debug , вероятно, является более портативным способом решения этой проблемы:

- set_fact:
    ou_site_list: ["a","b"]
  # then you can comment that one and uncomment this one
  # to see how it behaves in each case:
  # ou_site_list: "alpha"
- set_fact:
    ou_site_type: '{{ ou_site_list | type_debug }}'
- debug:
    msg: it's a list
  when: ou_site_type == 'list'
- debug:
    msg: it is not a list, and needs to be wrapped in one
  when: ou_site_type != 'list'
  # it's type is 'AnsibleUnicode' but for your purposes
  # just "not a list" is probably good enough
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...