Python получить ansible вывод сообщения в виде переменной - PullRequest
2 голосов
/ 12 января 2020

Я использую python3 и ansible 2.9.2, я использую скрипт python для запуска playbooks:

subprocess.Popen(["ansible-playbook",  "create.yml"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)

Я получаю вывод в виде строки:

"(b'\nPLAY [localhost] **\n\nTASK [Creating abc] ***\nok: [localhost]\n\nTASK [debug] ***\nok: [localhost] => {\n    "msg": "10.0.0.1"\n}\n\nPLAY RECAP ******\nlocalhost  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   \n\n', b"[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all'\n[WARNING]: Found variable using reserved name: name\n")"

Как я могу отфильтровать только вывод "msg" в python?

Я хочу получить IP-адрес 10.0.0.1 в качестве переменной и не могу найти правильное регулярное выражение для его перехвата.

Спасибо.

Ответы [ 2 ]

1 голос
/ 12 января 2020

Поскольку вывод ansible (результат playbook) не отличается от этого синтаксиса в 2.9.2, я бы использовал что-то подобное для того, чтобы перехватить ip как переменную:

import json

long_output = '''"(b'\nPLAY [localhost] **\n\nTASK [Creating abc] ***\nok: [localhost]\n\nTASK [debug] ***\nok: [localhost] => {\n    "msg": "10.0.0.1"\n}\n\nPLAY RECAP ******\nlocalhost  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   \n\n', b"[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all'\n[WARNING]: Found variable using reserved name: name\n")"'''

cut_string = json.loads(long_output.split("=> ")[1].split('PLAY RECAP')[0])
print(cut_string)

OUTPUT :

{'msg': '10.0.0.1'}

А затем выполните эту небольшую хитрость, чтобы перехватить все IP-адреса в виде списка: (Может быть, для будущего использования, если вы собираетесь запустить playbook более чем в одном месте назначения)

ip_addresses = [ip for ip in dict(cut_string).values()]
print(ip_addresses)

ВЫХОД:

['10.0.0.1']

Надеюсь, вы найдете это полезным.

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

Поскольку вы уже запускаете playbook из скрипта python, я рекомендую Ansible Runner .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...