Just to provide a summary of my findings, in a nutshell: 

Ansible module `uri` that I started to admire previously seems to be only 
usable in the cases where one:

1. does not need to supply custom headers in requests
2. does not use JSON part of response in its entirety in the subsequent 
requests (one can use individual key/values to form another JSON structure 
though)

which renders it to be of very limited use unfortunately. 

I would be glad if someone proves that the above statements are wrong

With kind regards,
Roman

On Thursday, December 19, 2013 12:43:07 PM UTC+11, Roman Revyakin wrote:
>
> And looks like JSON that is returned from `uri` module is also bad in some 
> way. Here's a playbook where I replaced the first call to `curl` to obtain 
> user credentials with `uri` and then using `usp_user.content` in the header 
> of my subsequent curl POST requests, and that works. If I use 
> `usp_user.json` however, the second request fails with 400 again:
>
>   - name: Login to account-ng as the specified user and obtain its id
>     local_action: >
>       uri url='http://{{ account_app }}.{{ target_domain}}/auth/user'
>       body='{ "email": "{{ userId }}", "password": "{{ sa_password }}" }'
>       method=POST
>       return_content=yes status_code=200
>       HEADER_Content-Type="application/json"
>     register: usp_user
>
>   - name: Archive previous top-level settings config
>     local_action: >
>        command curl -i -f -H "content-type: application/json" -H 'user: {{ 
> usp_user.content | replace("\n", "") }}' -XPUT http://{{ config_manager 
> }}.{{ target_domain }}/archive/settings
>
> Regards,
> Roman
>
> On Thursday, December 19, 2013 12:33:10 PM UTC+11, Roman Revyakin wrote:
>>
>> Hi Michael,
>>
>> Thanks for your reply. 
>> I think I have already mentioned in my post that I used the debug 
>> statements and the structures returned seemed ok to me.
>>
>> I believe that there is a problem with the way `uri` module handles the 
>> HTTP headers. When I fall back to using curl in my playbook everything 
>> works correctly:
>>
>>   - name: Login to account-ng as the specified user and obtain its id
>>     local_action: >
>>       shell curl -v -f -H "content-type: application/json" -d '{ "email": 
>> "{{ userId }}", "password": "{{ sa_password }}" }' -XPOST 'http://{{ 
>> account_app }}.{{ target_domain}}/auth/user' | awk '$1=$1' RS= OFS=" "
>>     register: usp_user
>>
>>   - name: Archive previous top-level settings config
>>     local_action: >
>>        command curl -i -f -H "content-type: application/json" -H 'user: 
>> {{ usp_user.stdout }}' -XPUT http://{{ config_manager }}.{{ target_domain 
>> }}/archive/settings
>>
>> However if I try to replace `curl` in the second task with `uri` module I 
>> get 400 status. Here's the second task with `uri` used in place of `curl`:
>>
>>   - name: Archive previous top-level settings config
>>     local_action: >
>>        uri url='http://{{ config_manager }}.{{ target_domain 
>> }}/archive/settings'
>>        method=PUT
>>        return_content=yes status_code=200
>>        HEADER_Content-Type="application/json"
>>        HEADER_user="{{ usp_user.stdout }}"
>>
>> Best regards, 
>> Roman 
>>
>> On Wednesday, December 18, 2013 2:31:38 PM UTC+11, Michael DeHaan wrote:
>>>
>>>
>>> The easiest way to check the response code of a module is 
>>>
>>> - debug: var=registered_variable_name
>>>
>>> Start there.
>>>
>>> The fact that you're getting back unicode shouldn't be a problem.   
>>>
>>> Possible point of confusion -- What you print from "debug: var" is 
>>> actually a Python datastructure, not JSON per se.   The 'json' structure 
>>> you get back is the datastructure itself that came from the JSON.
>>>
>>> i.e.    registered_variable_name.json.some_value_from_your_web_service 
>>> should be directly accessible as a variable.
>>>
>>>
>>>
>>>
>>>
>>> On Tue, Dec 17, 2013 at 10:25 PM, Roman Revyakin <[email protected]
>>> > wrote:
>>>
>>>> Just one more thing that I forgot to mention: I am able to use the JSON 
>>>> response as it is in subsequent requests using a bash script which is 
>>>> currently in place until this issue with the Ansible playbook is fixed:
>>>>
>>>> # Getting the user credentials in JSON format
>>>> user_info="$(curl -f -v -XPOST $account.$target_domain/auth/user -d 
>>>> "$user_login" -H "$content_type_header" | awk '$1=$1' RS= OFS=" " )"
>>>> # Using them in the header for subsequent requests
>>>> curl -i -H "$user_header" -XPUT 
>>>> $config_manager.$target_domain/archive/settings -H "$content_type_header"
>>>> ...
>>>>
>>>>
>>>> On Wednesday, December 18, 2013 2:20:22 PM UTC+11, Roman Revyakin wrote:
>>>>>
>>>>> Hi guys,
>>>>>
>>>>> I am facing the problem of not being able to use the JSON part of the 
>>>>> HTTP response in my subsequent tasks in an Ansible playbook. Here are the 
>>>>> relevant tasks from the playbook:
>>>>>
>>>>>   - name: Login to account as the specified user and obtain its id
>>>>>     local_action: >
>>>>>       uri url='http://{{ account_app }}.{{ target_domain}}/auth/user'
>>>>>       body='{ "email": "{{ userId }}", "password": "{{ sa_password }}" 
>>>>> }'
>>>>>       method=POST
>>>>>       return_content=yes status_code=200
>>>>>       HEADER_Content-Type="application/json"
>>>>>     register: usp_user
>>>>>     tags:
>>>>>       - config-manager
>>>>>       - bootstrap
>>>>>       - api
>>>>>
>>>>>   - name: Archive previous top-level settings config
>>>>>     local_action: >
>>>>>        command
>>>>>        curl -i -f -H "content-type: application/json"
>>>>>         -H "{{ lookup('template', './user_header.json.j2') }}"
>>>>>         -XPUT http://{{ config_manager }}.{{ target_domain 
>>>>> }}/archive/settings
>>>>> #      uri url='http://{{ config_manager }}.{{ target_domain 
>>>>> }}/archive/settings'
>>>>> #      method=PUT
>>>>> #      return_content=yes status_code=200
>>>>> #      HEADER_Content-Type="application/json"
>>>>> #      HEADER_user="{{ usp_user.json }}"
>>>>>     tags:
>>>>>       - config-manager
>>>>>       - bootstrap
>>>>>       - api
>>>>>
>>>>>   - name: Create new top-level settings config
>>>>>     local_action: >
>>>>>        command
>>>>>        curl -i -f -H "content-type: application/json"
>>>>>         -H "{{ lookup('template', './user_header.json.j2') }}"
>>>>>         -XPOST http://{{ config_manager }}.{{ target_domain 
>>>>> }}/config/settings
>>>>>         -d '{{ lookup('template', './stages_request.json.j2') }}'
>>>>> #      uri url='http://{{ config_manager }}.{{ target_domain 
>>>>> }}/config/settings'
>>>>> #      body='{{ lookup('template', './stages_request.json.j2') }}'
>>>>> #      method=POST
>>>>> #      return_content=yes status_code=200
>>>>> #      HEADER_Content-Type="application/json"
>>>>> #      HEADER_user="{{ usp_user.json }}"
>>>>>     tags:
>>>>>       - config-manager
>>>>>       - bootstrap
>>>>>       - api
>>>>>
>>>>> The `user_header.json.j2` is a simple header template to overcome a 
>>>>> YAML parsing problem of having a ':' followed by the curly braces
>>>>>
>>>>> user: {{ usp_user.json }}
>>>>>
>>>>> Basically what I am trying to do it to log in as a particular user to 
>>>>> an account-managing app, and then use the JSON part of the response that 
>>>>> contains required credentials (like the user id and the token) to do some 
>>>>> requests to another app. It seems to work if I form the JSON header 
>>>>> manually using the individual values from the JSON response, but not when 
>>>>> I 
>>>>> try to use the JSON as it is by referring to `variable.json`.
>>>>> In the commented out code I tried to use the `uri` module which I've 
>>>>> become a fan of lately and used `curl` command to test whether the 
>>>>> problem 
>>>>> is in the way `uri` supplies header in the request. Both `curl` and `uri` 
>>>>> versions fail with the 400 on the "Archive previous top-level 
>>>>> settings config" task (where no body is used in the request) and in 
>>>>> the verbose output I see that the `usp_user.json` has 'u' prefixes before 
>>>>> any of the key/value pairs, like follows:
>>>>>
>>>>> "user: {u'customer': u'52afd279fa33dd1f00000004',...
>>>>>
>>>>> I suspect this is at least part of the problem if not the problem on 
>>>>> itself - please correct me if I am wrong and this is just the weird 
>>>>> formatting that is only visible in the verbose output. I tried inserting 
>>>>> the task `debug var=usp_user.json` and it seems to output well-formatted 
>>>>> JSON though, without any of the 'u' attached.
>>>>>
>>>>> I would appreciate a guidance on how to use the json part of the 
>>>>> response in forming headers for succeeding requests.
>>>>>
>>>>> With kind regards,
>>>>> Roman
>>>>>
>>>>  -- 
>>>> You received this message because you are subscribed to the Google 
>>>> Groups "Ansible Project" group.
>>>> To unsubscribe from this group and stop receiving emails from it, send 
>>>> an email to [email protected].
>>>> To post to this group, send email to [email protected].
>>>> For more options, visit https://groups.google.com/groups/opt_out.
>>>>
>>>
>>>
>>>
>>> -- 
>>> Michael DeHaan <[email protected]>
>>> CTO, AnsibleWorks, Inc.
>>> http://www.ansibleworks.com/
>>>
>>>  

-- 
You received this message because you are subscribed to the Google Groups 
"Ansible Project" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to