Ansible странная ошибка: ошибка была: объект 'str' не имеет атрибута 'ip' - PullRequest
0 голосов
/ 16 января 2020

У меня очень странная проблема с Ansible playbook.

Я использую ansible с Flask API, поэтому я использую ansible -runner для передачи моих переменных в мою playbook.

Моя книга игр - просто отладка моего словаря и его атрибута ip:

- hosts: localhost
  connection: local
  any_errors_fatal: no
  tasks:
    - debug: 
        msg: '{{ device }}' 

    - debug: 
        msg: '{{ device["ip"] }}'

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

deploy okay [WARNING]: Unable to parse /etc/ansible/hosts as an inventory source
 [WARNING]: No inventory was parsed, only implicit localhost is available
 [WARNING]: provided hosts list is empty, only localhost is available. Note
that the implicit localhost does not match 'all'

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

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [shell] *******************************************************************
changed: [localhost]

TASK [Set date and time] *******************************************************
ok: [localhost]

TASK [Define log filepath] *****************************************************
ok: [localhost]

TASK [Create staging folder] ***************************************************
ok: [localhost]

TASK [begin of logging file] ***************************************************
changed: [localhost]

TASK [debug] *******************************************************************
ok: [localhost] => {
    "msg": {
        "admin_password": "",
        "admin_user": "user",
        "dns1_server_ip": "0.0.0.0",
        "equipement_name": "NEW_EQUIPMENT",
        "hostname": "EQUIPMENT",
        "ip": "127.0.0.1",
        "port": 80
    }
}

TASK [debug] *******************************************************************
fatal: [localhost]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'str object' has no attribute 'ip'\n\nThe error appears to have been in '/path/main.yml': line 59, column 9, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n      - debug:\n        ^ here\n"}

PLAY RECAP *********************************************************************
localhost                  : ok=7    changed=2    unreachable=0    failed=1

За исключением случаев, когда я запускаю свою книгу игр за пределами docker, у меня нет ошибок, и я использую те же версии python не возможны локально или на моем docker.

У вас есть идеи, что это такое?

Ansible 2.7.4

Python 3.5.3

Если вам нужна дополнительная информация, не стесняйтесь спрашивать.

[РЕДАКТИРОВАТЬ]

Я пробовал новые вещи об этой проблеме, и это, кажется, проблема формата. Итак, я сделал более полный пост ЗДЕСЬ

Ответы [ 2 ]

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

Попробуйте как показано ниже

   - debug:
      msg: "{{device.ip}}"

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

Ваша ошибка говорит: 'str object' has no attribute 'ip'

Итак, ваша переменная device является строкой, а не диктантом. Бывает, что эта строка является сериализацией объекта json.

. Это можно исправить с помощью from_json фильтра , который преобразует вашу строку json в соответствующие данные. Структура.

    - debug: 
        msg: '{{ device | from_json }}' 

    - debug: 
        msg: '{{ (device | from_json)["ip"] }}'

Затем вам нужно будет выяснить, почему вы получаете правильный объект json при запуске из localhost и форматированную строку json при запуске из контейнера docker. Но это другая история ....

...