ссылка на доступную переменную: невозможно прочитать stdout_lines из регистровой переменной после ssh и команды

Команда, моя задача выполняется, она выполняет команды на хостах, которые извлекаются из зарегистрированной переменной. В настоящее время два хоста, но в производстве будет 100. я не могу прочитать stdout или stdout_lines. моя задача и результат ниже. Его отправка на сервер удаления, а затем выполнение команды df -h и сохранение вывода.

фактический вывод (с удалением некоторых текстов, но без скобок)

ok: [localhost] => {
        "raid_info.results": [
            {
                "ansible_loop_var": "item", 
                "changed": true, 
                "cmd": "ssh -F /home/svcngcctal.net \"df -kh /raid/\"", 
                "delta": "0:00:02.095839", 
                "end": "2019-10-24 22:55:38.323679", 
                "failed": false, 
                "failed_when_result": false, 
                "invocation": {
                    "module_args": {
                        "_raw_params": "ssh -F /home/metal.net \"df -kh /raid/\"", 
                        "_uses_shell": true, 
                        "warn": true
                    }
                }, 
                "item": {
                    "nodeType": "4.15.0-45-generic", 
                    "node_name": "hostB"
                }, 
                "rc": 0, 
                "start": "2019-10-24 22:55:36.227840", 
                "stderr": "Warning: Permanently***", 
                "stderr_lines": [
                    "Warning:asd"
                ], 
                "stdout": "Filesystem      Size  Used Avail Use% Mounted on\n/dev/sdb1       7.0T  175G  6.5T   3% /raid", 
                "stdout_lines": [
                    "Filesystem      Size  Used Avail Use% Mounted on", 
                    "/dev/sdb1       7.0T  175G  6.5T   3% /raid"
                ]
            }, 
            {
                "ansible_loop_var": "item", 
                "changed": true, 
                "cmd": "ssh -F /home/svcngcc/jenkinstal.net \"df -kh /raid/\"", 
                "delta": "0:00:02.115591",
                "invocation": {
                    "module_args": {
                        "_raw_params": "ssh -F /home/sal.net \"df -kh /raid/\"", 

                        "warn": true
                    }
                }, 
                "item": {
                    "nodeType": "4.15.0-45-generic", 
                    "node_name": "hostA"
                }, 
                "rc": 0, 
                "start": "2019-10-24 22:55:38.467007", ", 
                "stderr_lines": [
                    "Warning: Permanently "
                ], 
                "stdout": "Filesystem      Size  Used Avail Use% Mounted on\n/dev/sdb1       7.0T  176G  6.5T   3% /raid", 
                "stdout_lines": [
                    "Filesystem      Size  Used Avail Use% Mounted on", 
                    "/dev/sdb1       7.0T  176G  6.5T   3% /raid"
                ]
            }
        ]
    }

из приведенного выше вывода я не могу прочитать строки stdout для проверки точки монтирования.

задача:

      - name: "RAID mount check for fscache on GPU Nodes"
        shell: ssh -F {{ ssh_cfg_path.stdout }} {{ item.node_name }}.{{ ssh_host }} "df -kh /raid/"
        ignore_errors: no
        register: raid_info
        failed_when: raid_info.rc != 0
        with_items: "{{ gpu_nodes }}"

      - name: raid_info results1_stdout_lines
        debug:
          var: raid_info.results[1].stdout_lines

ничего не выводит ..


person AhmFM    schedule 24.10.2019    source источник
comment
Этот вывод был изменен - ​​из-за ряда ошибок он стал недействительным. Можете ли вы показать фактический результат работы - debug: var=raid_info.results?   -  person Matt P    schedule 25.10.2019
comment
Вы правы: я для краткости так и сделал. обновил вывод теперь с одинаковыми скобками. однако я удалил ненужную информацию. По 9 скоб. ][ и }{   -  person AhmFM    schedule 25.10.2019


Ответы (1)


Я не могу воспроизвести ваши результаты - я считаю, что вы упустили некоторую информацию при публикации.

Например, ваши задачи случайно не запускаются на разных хостах? Переменная raid_info регистрируется для каждого хоста, поэтому, если ваши задачи выполняются на разных хостах, это может вызвать вашу проблему.

Мой тест с аналогичным циклом: - playbook.yml

---
- hosts: localhost
  gather_facts: false
  vars_files:
    - packages.yml

  tasks:
  - name: Run a command
    command: "echo {{item}}"
    register: my_output
    loop: 
    - 10.10.80.193
    - 10.10.80.194

  - name: Print the results
    debug:
      var: my_output

  - name: Print only the second item in the list
    debug:
      var: my_output.results[1].stdout_lines
  • результат:
# ansible-playbook -i inventory.yml playbook.yml 

PLAY [localhost] *************************************************************************************************************************

TASK [Run a command] *********************************************************************************************************************
changed: [localhost] => (item=10.10.80.193)
changed: [localhost] => (item=10.10.80.194)

TASK [Print the results] *****************************************************************************************************************
ok: [localhost] => {
    "my_output": {
        "changed": true, 
        "msg": "All items completed", 
        "results": [ 
            { <snip>
            }, 
            { <snip>
            }
        ]
    }
}

TASK [Print only the second item in the list] ********************************************************************************************
ok: [localhost] => {
    "my_output.results[1].stdout_lines": [
        "10.10.80.194"
    ]
}

PLAY RECAP *******************************************************************************************************************************
localhost                  : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

person Bogd    schedule 25.10.2019
comment
Моя задача - запускать команды оболочки на хостах, которые извлекаются из зарегистрированной переменной. В настоящее время два хоста, но в производстве будет 100. - person AhmFM; 25.10.2019
comment
Как и мой пример - он выполняет команды оболочки на хосте (в данном случае localhost). Если вы выполняете задачи на нескольких хостах, обратите внимание, что зарегистрированные переменные регистрируются для каждого хоста (как упоминалось в моем ответе выше). Поэтому вам нужно будет получить результат с правильного хоста (либо запустив вторую задачу на том же хосте, либо используя hostvars[]) - person Bogd; 25.10.2019
comment
Не могли бы вы уточнить свой ответ в моем случае, когда я запускаю команды оболочки на всех хостах, как будет выглядеть моя задача? - person AhmFM; 25.10.2019
comment
Потрясающие!. Мне пришлось установить отладку на raid_info, как вы это делали в своей задаче, и тогда я смог ее получить. Но вопрос в том, насколько масштабным, как мне с этим справиться? Потому что у меня будет 100 узлов. Я не могу распечатать отладку 100 раз. Могу ли я выполнить отладку в цикле? - person AhmFM; 25.10.2019
comment
Отладка предназначена только для вас (и меня), поэтому во время устранения неполадок мы можем видеть переменные и их содержимое. Для производства вы замените модуль debug на тот, который выполняет фактическое действие :). И чтобы ответить на последний вопрос, да, конечно - debug - это просто еще один модуль, и вы можете просто зацикливаться при его использовании. - person Bogd; 26.10.2019
comment
Я все еще пытаюсь понять, как запустить задачу для 100 хостов, поскольку моя вышеупомянутая задача выполняется только для двух хостов. Намек? Можете ли вы вставить образец задачи - person AhmFM; 28.10.2019
comment
Вам просто нужно изменить переменную цикла (в моем случае это список из двух элементов - в вашем случае это может быть список из 100 :)). Если вы храните свои хосты в переменной hostlist, просто используйте loop: "{{hostlist}}" в первой задаче. Чтобы дать вам более полный пример, мне нужно знать, как вы получаете свой список хостов и где вы его храните. - person Bogd; 28.10.2019
comment
Это был единственный ответ, который работал у меня на сегодняшний день и ansible 2.9.6. Спасибо - person ionescu77; 03.04.2020