Получение Ansible ошибка времени выполнения У объекта dict нет атрибута stdout_lines, несмотря на то, что переменная не равна нулю - PullRequest
0 голосов
/ 06 ноября 2019

Ниже приведена моя книга с переменной running_processes, которая содержит список пидов (один или несколько)

Далее я читаю идентификаторы пользователей для каждого из пидов. Пока все хорошо.

Затем я пытаюсь напечатать список идентификаторов пользователей в переменной curr_user_ids, используя -debug module, когда я получаю сообщение об ошибке: 'объект dict' не имеет атрибута 'stdout_lines'

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

    - name: Get running processes list from remote host
      shell: "ps -few | grep java | grep -v grep | awk '{print $2}'"
      changed_when: false
      register: running_processes

    - name: Gather USER IDs from processes id before killing.
      shell: "id -nu `cat /proc/{{ running_processes.stdout }}/loginuid`"
      register: curr_user_ids
      with_items: "{{ running_processes.stdout_lines }}"

    - debug: msg="USER ID LIST HERE:{{ curr_user_ids.stdout }}"
      with_items: "{{ curr_user_ids.stdout_lines }}"

TASK [Get running processes list from remote host] **********************************************************************************************************
task path: /app/wls/startstop.yml:22
ok: [10.9.9.111] => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "cmd": "ps -few | grep java | grep -v grep  | awk '{print $2}'", "delta": "0:00:00.166049", "end": "2019-11-06 11:49:42.298603", "rc": 0, "start": "2019-11-06 11:49:42.132554", "stderr": "", "stderr_lines": [], "stdout": "24032", "stdout_lines": ["24032"]}

TASK [Gather USER IDS of processes id before killing.] ******************************************************************************************************
task path: /app/wls/startstop.yml:59
changed: [10.9.9.111] => (item=24032) => {"ansible_loop_var": "item", "changed": true, "cmd": "id -nu `cat /proc/24032/loginuid`", "delta": "0:00:00.116639", "end": "2019-11-06 11:46:41.205843", "item": "24032", "rc": 0, "start": "2019-11-06 11:46:41.089204", "stderr": "", "stderr_lines": [], "stdout": "user1", "stdout_lines": ["user1"]}

TASK [debug] ************************************************************************************************************************************************
task path: /app/wls/startstop.yml:68
fatal: [10.9.9.111]: FAILED! => {"msg": "'dict object' has no attribute 'stdout_lines'"}

Не могли бы вы подсказать, почему я получаю ошибку и как ее устранить?

Спасибо

Ответы [ 2 ]

1 голос
/ 06 ноября 2019

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

Задача Get running processes list from remote host возвращает строку \n с новой строкой. Поэтому вам нужно будет обработать это и сначала превратить вывод в объект списка пропплеров.

Задача Gather USER IDs from processes id before killing. возвращает словарь, содержащий ключ results, где значение имеет тип list, поэтому вы будетенужно перебрать его и извлечь для каждого элемента значение stdout.

Вот как я это решил.

---

- hosts: "localhost"
  gather_facts: true
  become: true
  tasks:
      - name: Set default values
        set_fact:
          process_ids: []
          user_names: []

      - name: Get running processes list from remote host
        shell: "ps -few | grep java | grep -v grep | awk '{print $2}'"
        changed_when: false
        register: running_processes

      - name: Register a list of Process ids (Split newline from output before)
        set_fact:
          process_ids: "{{ running_processes.stdout.split('\n') }}"

      - name: Gather USER IDs from processes id before killing.
        shell: "id -nu `cat /proc/{{ item }}/loginuid`"
        register: curr_user_ids
        with_items: "{{ process_ids }}"

      - name: Register a list of User names (Out of result from before)
        set_fact:
          user_names: "{{ user_names + [item.stdout] | unique }}"
        when: item.rc == 0
        with_items:
          - "{{ curr_user_ids.results }}"

      - name: Set unique entries in User names list
        set_fact:
          user_names: "{{ user_names | unique }}"

      - name: DEBUG
        debug:
          msg: "{{ user_names }}"
0 голосов
/ 06 ноября 2019

Переменная curr_user_ids регистрирует результаты каждой итерации

register: curr_user_ids
with_items: "{{ running_processes.stdout_lines }}"

Список результатов хранится в

curr_user_ids.results

Посмотрите на переменную

- debug:
    var: curr_user_ids

и цикл stdout_lines

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