I’m developing a playbook with Ansible 2.0 where I want to insert a blob of JSON data (read from a file) into the user_data segment of an EC2 instance.
The task looks like this:
- name: Create Instance
local_action:
module: ec2
region: “{{ aws_region }}”
keypair: “{{ key_name }}”
instance_type: “m4.xlarge”
image: “{{ ami }}”
assign_public_ip: yes
group: cmic-sg
vpc_subnet_id: “{{ vpc_subnet_id }}”
exact_count: 1
count_tag:
Name: “instance ansible”
instance_tags:
Name: “instance ansible”
wait: yes
user_data: “{{ lookup(‘file’, ‘/tmp/metadata.txt’) }}”
register: app_instance
The JSON data read from the file looks like this:
{
“key1” : “value1”,
“key2” : “value2”,
“key3" : “value3”
}
This errors out as the string passed for user_data is apparently treated as a python dict:
An exception occurred during task execution. The full traceback is:
Traceback (most recent call last):
File “/home/cl186051/.ansible/tmp/ansible-tmp-1454387154.58-221595234821842/ec2”, line 3575, in
main()
File “/home/cl186051/.ansible/tmp/ansible-tmp-1454387154.58-221595234821842/ec2”, line 1415, in main
(tagged_instances, instance_dict_array, new_instance_ids, changed) = enforce_count(module, ec2, vpc)
File “/home/cl186051/.ansible/tmp/ansible-tmp-1454387154.58-221595234821842/ec2”, line 801, in enforce_count
= create_instances(module, ec2, vpc, override_count=to_create)
File “/home/cl186051/.ansible/tmp/ansible-tmp-1454387154.58-221595234821842/ec2”, line 1029, in create_instances
res = ec2.run_instances(**params)
File “/usr/local/lib64/python2.6/site-packages/boto-2.38.0-py2.6.egg/boto/ec2/connection.py”, line 930, in run_instances
params[‘UserData’] = base64.b64encode(user_data).decode(‘utf-8’)
File “/usr/lib64/python2.6/base64.py”, line 53, in b64encode
encoded = binascii.b2a_base64(s)[:-1]
TypeError: b2a_base64() argument 1 must be string or read-only buffer, not dict
If I add single quotes around the JSON data read from the file (user_data: “‘{{ lookup(‘file’, ‘/tmp/metadata.txt’) }}’”) then the playbook runs successfully, but the user_data value retrieved from the metadata server isn’t valid JSON unless the leading and trailing single quotes are removed first.
Is there a better way to insert JSON data into the user_data?
Thanks in advance!
Chris