Я пытаюсь использовать REST API by Barracuda ADC and/or WAF и, в то время как она работает, когда я использую Curl (из документации):Использование API Barracuda REST с анзибль - маркер аутентификации не работает
Запрос:
$ curl
-X POST \
-H "Content-Type:application/json" \
-d '{"username": "admin", "password": "admin"}' \ http://10.11.19.104:8000/restapi/v2/login
Ответ:
{ "маркер": "eyJldCI6IjEzODAyMzE3NTciLCJwYXNzd29yZCI6ImY3NzY2ZTFmNTgwMzgyNmE1YTAzZWZlMzcy \ nYzgzOTMyIiwidXNlciI6ImFkbWluIn0 = \ п"}
Тогда мы должны использовать этот маркер для выполнения команд на API, что-то вроде:
$ curl
-X GET \
-H "Content-Type:application/json" \
-u 'eyJldCI6IjEzODAyMzE3NTciLCJwYXNzd29yZCI6ImY3NzY2ZTFmNTgwMzgyNmE1YTAzZWZlMzcy\nYzgzOTMyIiwidXNlciI6ImFkbWluIn0=\n': \
http://10.11.19.104:8000/restapi/v2/virtual_service_groups
И это даст мне ответ листинг (в данном случае) мои виртуальные группы услуг, и это работает с cURL.
Теперь, когда я пытаюсь использовать ansible для выполнения одних и тех же вещей, первый этап аутентификации проходит успешно (я могу даже использовать сгенерированный токен с cURL, и он его принимает), но второй шаг для запуска команд с сгенерированный маркер всегда дает мне 401 ошибку (Недействительные учетные данные):
- name: login into the load balancer
uri:
url: "{{ barracuda_url }}/login"
method: POST
body_format: json
body:
username: "{{ barracuda_user }}"
password: "{{ barracuda_pass }}"
headers:
Content-Type: application/json
return_content: yes
force_basic_auth: yes
register: login
tags: login, debug
- debug: msg="{{ login.json.token }}"
tags: debug
- name: get
uri:
url: "{{ barracuda_url }}/virtual_service_groups"
method: GET
body_format: json
user: "{{ login.json.token }}:"
headers:
Content-Type: application/json
return_content: yes
force_basic_auth: yes
register: response
Вывод мой сборник пьес:
TASK [loadbalancer : login into the load balancer] *****************************
ok: [localhost]
TASK [loadbalancer : debug] ****************************************************
ok: [localhost] => {
"msg": "eyJldCI9IjE0ODQ2MDcxNTAiXCJwYXNzd29yZCI6IjRmM2TlYWMwN2ExNmUxYWFhNGEwNTU5NTMw\nZGQ3ZmM3IiwiaXNlciI6IndpYSJ9\n"
}
TASK [loadbalancer : get] ******************************************************
fatal: [localhost]: FAILED! => {"changed": false, "connection": "close", "content": "{\"error\":{\"msg\":\"Please log in to get valid token\",\"status\":401,\"type\":\"Invalid Credentials\"}}", "content_type": "application/json; charset=utf8", "date": "Mon, 16 Jan 2017 22:32:30 GMT", "failed": true, "json": {"error": {"msg": "Please log in to get valid token", "status": 401, "type": "Invalid Credentials"}}, "msg": "Status code was not [200]: HTTP Error 401: ", "redirected": false, "server": "BarracudaHTTP 4.0", "status": 401, "transfer_encoding": "chunked", "url": "http://10.11.19.104:8000/restapi/v2/virtual_service_groups"}
Почти! С небольшим количеством тестов и ошибок (плюс wirehark) я обнаружил, что мне нужно удалить двоеточие и добавить параметр пустого пароля: '' 'user:" {{login.json.token}} " пароль:" " '' ' – EvenMe
[Эта строка] (https://github.com/ansible/ansible/blob/devel/lib/ansible/module_utils/urls.py#L980) гарантирует, что независимо от того, укажите ли вы пустой пароль или не указываете это вообще, результирующее значение, переданное серверу, будет таким же. Я не совсем понимаю, почему вам нужно добавить его. – techraf
Без этой строки ничего не прошло (я проверил на wirehark, было только имя пользователя/токена, без пустого поля для пароля). – EvenMe