Syntax error on template while trying to default variable - ansible

What I'm trying to do
Everything concern HTTP requests.
Create something using POST API, if created I can get the resource id
If resource already created, it returns 422 status code
If 422 status code, get resource by name so I can access it's id
Create another resource with the given id inside its request body
The code I have
- name: Create cluster
uri:
url: '{{ rancher_url }}/v3/cluster'
method: POST
body: {"type":"cluster","nodes":[],"rancherKubernetesEngineConfig":{"ignoreDockerVersion":true, "network":{"type":"networkConfig","plugin":"{{ rancher_network_provider }}"}},"name":"{{ rancher_cluster_name }}"}
status_code: 201, 422
body_format: json
headers:
Authorization: "Bearer {{ api_key_result.json.token }}"
validate_certs: "{{ validate_certs }}"
register: cluster_created
- name: Cluster already exists, retrieving id
uri:
url: '{{ rancher_url }}/v3/cluster?name={{ rancher_cluster_name }}'
method: GET
status_code: 200
headers:
Authorization: "Bearer {{ api_key_result.json.token }}"
body_format: json
validate_certs: "{{ validate_certs }}"
register: cluster_found
when: cluster_created.status == 422
- name: Get command to launch for nodes
uri:
url: '{{ rancher_url }}/v3/clusterregistrationtoken'
method: POST
body: {"type":"clusterRegistrationToken","clusterId":"{{cluster_created.json.id | cluster_found.json.data[0].id}}"}
status_code: 201
body_format: json
headers:
Authorization: "Bearer {{ api_key_result.json.token }}"
validate_certs: "{{ validate_certs }}"
register: node_command_result
So basically I want this line to work : {{cluster_created.json.id | cluster_found.json.data[0].id}}
The error I get
TASK [rancher_worker : Get command to launch for nodes] ***************************************************************************************************************************************************************************************
fatal: [51.15.25.38]: FAILED! => {"msg": "template error while templating string: expected token 'end of print statement', got '['. String: {{cluster_created.json.id | cluster_found.json.data[0].id}}"}
What do you think ?
Thanks for your help :)

Related

Issues using Ansible URI module - Getting 401 even when authentication credentials are added

I am using Ansible's URI module to call a simple GET endpoint but I am getting a 401 error message as shown below.
Here is the playbook configuration
- name: Elasticsearch Cluster health Check
uri:
url: https://elastichost:9200/_cluster/health?&pretty
url_password : xxxxxxx
url_username : xxxxxx
validate_certs : no
method: GET
body_format: json
force_basic_auth: yes
return_content: yes
headers:
Content-Type: "application/json"
register: showhealth
tags: NonProd
- name: Show Elasticsearch Health
debug: var=showhealth
tags: NonProd
Any inputs on how to resolve
specific issue with elastic. elastic is secure, you need token or certificate to connect to api.
And ofc, your's user need correct right.
exemple
- name: Create update_user
uri:
url: 'uri'
method: POST
user: elasticuser
body_format: json
headers:
Content-Type: application/json
body: '{{ item.body }}'
client_cert: 'certificate.crt'
client_key: 'certificate.key'
password: '{{ elastic_password }}'
validate_certs: false
return_content: true

Ansible URI module ignore body for GET request

why URI module ignores body. I need to send body to get the response what I need. Python request module works fine.
---
- name: Get info
hosts: local_host
gather_facts: no
vars:
auth_key: 'xxxxxx'
tasks:
- name: Fetch all entries matching
uri:
url: "https://get_changes.com?"
method: GET
headers:
Content-Type: "application/json"
Accept: "application/json"
Authorization: 'Basic {{auth_key}}'
Timeout: '30'
body_format: json
body:
sysparm_fields: "number, state"
sysparm_query:"cur_state=10^number=abcdef^u_ci_infra_type=network^name=Network"
return_content: yes
status_code: 200
register: crb_output
Ah I see. That's true. Args should be in URL itself for GET. forgot about that. Thanks.

How to extract a deeply nested value from a module result into a variable for later tasks?

In this instance I'm using the uri module to smoketest an API deployment. The flow is:
Attempt to log test user in and capture JWT token
If #1 fails register new user
If #2 fired simulate clicking the verify user email link
If #3 fired log the new test user in and capture JWT token
In #1 or #4 I'd like to assign the JWT from the result to a variable for later use. Something like:
- name: log user in
uri:
url: "{{ api_url }}/user"
method: post
body_format: json
body:
email: "{{ email }}"
password: "{{ password }}"
assign:
jwt: {{ response.json.data.jwt }}
As if assign were a thing. I could register: session and use {{ session.json.data.jwt}} a hundred times in the rest of the smoke tests without it but it would be so much cleaner if I could mutate a play scoped variable, perhaps defined at the top of the playlist.
The answer came from #matt-p in the comments - use set_fact. Thanks.
I wanted to show off how well this works on a REST API. Notice how we can later access keys from the returned JSON with a simple {{ user.email }} and use the JWT token with headers:
jwt={{ user.jwt }}
- name: Login and get JWT session
uri:
url: "{{ url }}/users/login"
body_format: json
body:
email: "{{ email }}"
password: "{{ password }}"
method: POST
status_code: [200]
register: user_login
- name: Assign user variable to user_login results
set_fact:
user: "{{ user_login.json.data }}"
- name: Create a post
uri:
url: "{{ url }}/users/{{ user.id }}/posts"
body_format: json
method: POST
headers: jwt={{ user.jwt }}
body:
content: >
My name is {{ user.firstName }} and you
can email me at {{ user.email }}
status_code: [201]
register: post_creation

translate a curl PUT command into ansible uri

I want to interact with a seafile server with its REST api.
So far I had no problems translating POST or GET queries into the ansible uri module. However, I have a problem with getting a PUT query to work.
The following works with curl:
curl -X PUT -d "share_type=group&group_id=<groupid>&permission=rw" -H 'Authorization: Token <mysecrettoken>' -H 'Accept: application/json; charset=utf-8; indent=4' https://<myserverurl>/api2/repos/<mylibraryid>/dir/shared_items/?p=/
When I translate this to the following ansible task, it fails:
- name: mytask
uri:
url: "https://<myserverurl>/api2/repos/<mylibraryid>/dir/shared_items/?p=/"
method: PUT
headers: '{ "Authorization": "Token <mysecrettoken>" }'
body: '{ "share_type": "group", "group_id": "<groupid>", "permission": "rw"}'
body_format: json
return_content: yes
I get the error:
HTTP Error 500: INTERNAL SERVER ERROR", "redirected": false, "server": "nginx", "set_cookie": "SERVERID=<serverid>; path=/", "status": 500, "transfer_encoding": "chunked", "url": "https://<myserverurl>/api2/repos/<mylibraryid>/dir/shared_items/?p=/", "vary": "Accept-Language, Cookie"}
In a python script using the requests library, I had to supply the final ?p=/ as params={'p': '/'}. Is this the reason for the failure? How do I correctly submit the parameter then?
You should pass the headers as a YAML hash, not as a JSON string:
- name: mytask
uri:
url: "https://<myserverurl>/api2/repos/<mylibraryid>/dir/shared_items/?p=/"
method: PUT
headers:
Authorization: "Token <mysecrettoken>"
body: '{ "share_type": "group", "group_id": "<groupid>", "permission": "rw"}'
body_format: json
return_content: yes
For reference, see the docs, especially the second-to-last example:
- uri:
url: https://your.form.based.auth.example.com/dashboard.php
method: GET
return_content: yes
headers:
Cookie: "{{ login.set_cookie }}"

HTTP Error 405 when uploading an image using uploadify

I'm trying to create an uploading control in MVC3.
At first i've tried with javascript and HTML5 to create upload control, but that doesn't work with any of the IE versions. So,i've move to this flash version of uploadify.
I'm getting HTTP Error: 405 when uploading
Here is my code in javascript for uploadify
$(function () {
$('#file_upload').uploadify({
debug:true,
'swf': '/Content/uploadify/uploadify.swf',
'uploader': '/Content/uploadify/uploadify.php',
'cancelImg': '/Images/uploadify-cancel.png',
'script': '/Home/Uploadify',
'folder': '/Content/uploads',
auto: true
});
});
I've even tried with debug: true to see what was gone wrong, but i couldn't get what is wrong.
Here is my output with debug:
---SWFUpload Instance Info---
Version: 2.2.0 2009-03-25
Movie Name: SWFUpload_0
Settings:
upload_url: /Content/uploadify/uploadify.php
flash_url: /Content/uploadify/uploadify.swf?preventswfcaching=1355289873808
use_query_string: false
requeue_on_error: false
http_success:
assume_success_timeout: 30
file_post_name: Filedata
post_params: [object Object]
file_types: *.*
file_types_description: All Files
file_size_limit: 0
file_upload_limit: 0
file_queue_limit: 999
debug: true
prevent_swf_caching: true
button_placeholder_id: file_upload
button_placeholder: Not Set
button_image_url: /
button_width: 120
button_height: 30
button_text:
button_text_style: color: #000000; font-size: 16pt;
button_text_top_padding: 0
button_text_left_padding: 0
button_action: -110
button_disabled: false
custom_settings: [object Object]
Event Handlers:
swfupload_loaded_handler assigned: false
file_dialog_start_handler assigned: true
file_queued_handler assigned: true
file_queue_error_handler assigned: true
upload_start_handler assigned: true
upload_progress_handler assigned: true
upload_error_handler assigned: true
upload_success_handler assigned: true
upload_complete_handler assigned: true
debug_handler assigned: true
SWF DEBUG: SWFUpload Init Complete
SWF DEBUG:
SWF DEBUG: ----- SWF DEBUG OUTPUT ----
SWF DEBUG: Build Number: SWFUPLOAD 2.2.0
SWF DEBUG: movieName: SWFUpload_0
SWF DEBUG: Upload URL: /Content/uploadify/uploadify.php
SWF DEBUG: File Types String: *.*
SWF DEBUG: Parsed File Types:
SWF DEBUG: HTTP Success: 0
SWF DEBUG: File Types Description: All Files (*.*)
SWF DEBUG: File Size Limit: 0 bytes
SWF DEBUG: File Upload Limit: 0
SWF DEBUG: File Queue Limit: 999
SWF DEBUG: Post Params:
SWF DEBUG: ----- END SWF DEBUG OUTPUT ----
SWF DEBUG:
SWF DEBUG: Event: fileDialogStart : Browsing files. Multi Select. Allowed file types: *.*
SWF DEBUG: Select Handler: Received the files selected from the dialog. Processing the file list...
SWF DEBUG: Event: fileQueued : File ID: SWFUpload_0_0
SWF DEBUG: Event: fileDialogComplete : Finished processing selected files. Files selected: 1. Files Queued: 1
SWF DEBUG: StartUpload: First file in queue
SWF DEBUG: Event: uploadStart : File ID: SWFUpload_0_0
SWF DEBUG: ReturnUploadStart(): File accepted by startUpload event and readied for upload. Starting upload to /Content/uploadify/uploadify.php for File ID: SWFUpload_0_0
SWF DEBUG: Event: uploadProgress (OPEN): File ID: SWFUpload_0_0
SWF DEBUG: Event: uploadProgress: File ID: SWFUpload_0_0. Bytes: 846359. Total: 846359
SWF DEBUG: Event: uploadError: HTTP ERROR : File ID: SWFUpload_0_0. HTTP Status: 405.
SWF DEBUG: Event: uploadComplete : Upload cycle complete.
Can anyone tell me, where am i wrong ?
EDIT:
This is the request responce tracked from Fiddler:
POST /Content/uploadify/uploadify.php HTTP/1.1
Host: localhost:6930
Connection: keep-alive
Content-Length: 561702
Origin: http://localhost:6930
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11
Content-Type: multipart/form-data; boundary=----------Ef1Ij5Ef1cH2GI3GI3ei4Ij5ae0gL6
Accept: */*
Referer: http://localhost:6930/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
HTTP/1.1 405 Method Not Allowed
Cache-Control: private
Allow: GET, HEAD, OPTIONS, TRACE
Content-Type: text/html; charset=utf-8
Server: Microsoft-IIS/8.0
X-SourceFiles: =?UTF-8?B?YzpcdXNlcnNcYWRtaW5pc3RyYXRvclxkb2N1bWVudHNcdmlzdWFsIHN0dWRpbyAyMDEyXFByb2plY3RzXERhdGVBbmRUaW1lQ29udHJvbFxEYXRlQW5kVGltZUNvbnRyb2xcQ29udGVudFx1cGxvYWRpZnlcdXBsb2FkaWZ5LnBocA==?=
X-Powered-By: ASP.NET
Date: Wed, 12 Dec 2012 10:03:44 GMT
Content-Length: 5506
I've solve my problem finally. Its the uploader that troubled me.
the uploader should be the action of the controller in mvc.
Here is the solution:
$(function () {
$('#file_upload').uploadify({
debug:true,
'swf': '/Content/uploadify/uploadify.swf',
'uploader': '/Home/Uploadify',
auto: true
});
});

Resources