Я использую uri
модуль Ansible 2.0
.
У меня есть такой код, чтобы сделать POST на api.
- name: Example POST
uri:
url: http://example.com:8001/api
method: POST
status_code: 201
body_format: json
body:
key1: value
key2: value2
register: response
changed_when: response.status == 201
У меня есть 2 целевых сервера в разных инвентарях. Это работает против сервера A. На сервере B происходит сбой с ошибкой:
fatal: [ip]: FAILED! =>
{"failed": true, "msg": "ERROR! The conditional check 'response.status == 201' failed.
The error was: ERROR! error while evaluating conditional (response.status == 201):
ERROR! 'dict object' has no attribute 'status'"}
Если я сделаю POST вручную с помощью curl
оба сервера A и B дают одинаковый ответ. Серверы A и B имеют одинаковую конфигурацию.
Если я запускаю книгу игр с полным подробным описанием, я вижу только эти строки перед ошибкой для рассматриваемой задачи:
TASK [role : Example POST] ***************************************
task path: /home/ansible/roles/role/tasks/example.yaml:15
<ip> ESTABLISH SSH CONNECTION FOR USER: ansible
<ip> SSH: EXEC ssh -C -vvv -o ControlMaster=auto -o ControlPersist=60s -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o User=ansiblr -o ConnectTimeout=10 -o ControlPath=/home/ansible/.ansible/cp/ansible-ssh-%h-%p-%r 10.100.105.22 '/bin/sh -c '"'"'sudo -H -S -n -u root /bin/sh -c '"'"'"'"'"'"'"'"'echo BECOME-SUCCESS-cvyeydaqaapnnwuaukxffwmgvinzoxaq; LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 /usr/bin/python'"'"'"'"'"'"'"'"''"'"''
Я не могу понять, почему этот тест не проходит для Ansible и почему это происходит только для другого сервера.
Как было предложено в комментарии, я использовал debug
модуль для просмотра переменной:
- debug:
msg: '{{ response }}'
Содержание переменной было httplib2 >= 0.7 is not installed
.
Итак, в моей среде отсутствовал пакет, который требуется uri
модуль. Согласно документации, это необходимо только для версий Ansible старше 2.1.
Установка пакета python-httplib2
решил проблему.