I've got a .yml file filled with hundreds of configuration values for an Axis network camera. The contents look like this:
---
axis:
config:
"Bandwidth.Limit": 0
"HTTPS.AllowTLS1": "no"
"HTTPS.AllowTLS11": "no"
"HTTPS.AllowSSLV3": "no"
"HTTPS.Ciphers": AES256-SHA:AES128-SHA
"HTTPS.Enabled": "yes"
"HTTPS.Port": 443
...
The Axis API, called Vapix, provides an update function that updates a value, so I circled through the values and triggered a new API call with every iteration:
---
- name: update parameters
local_action:
module: uri
user: "{{ axis_snmp_role.login_user }}"
password: "{{ axis_snmp_role.login_password }}"
url: "{{ axis_snmp_role.server_url }}?action=update&{{ item.key }}={{ item.value }}"
validate_certs: false
with_dict: "{{ axis.config }}"
Turns out this works, but takes forever. I manually found out that it's possible to update multiple values with one API call by glueing the key/value-pairs together with the &-symbol like this:
https://{{ axis_snmp_role.server_url }}/axis-cgi/param.cgi?action=update&ImageSource.I0.Sensor.ExposureValue=100&Image.I0.Appearance.Compression=50
So I used this to buid one big API call that will set all the values at once.
---
- name: Create parameter list
set_fact:
my_parameters: "{{ my_parameters | default([]) + [item.key + '=' + item.value|string|urlencode() ] }}"
with_dict: "{{ axis.config }}"
- name: update parameters
#no_log: true
local_action:
module: uri
user: "{{ axis_snmp_role.login_user }}"
password: "{{ axis_snmp_role.login_password }}"
url: "{{ axis_snmp_role.server_url }}?action=update&{{ my_parameters | join('&') }}"
validate_certs: false
#with_dict: "{{ axis.config }}"
Turns out the network camera doesn't like to get so many values at once, so I guess I am stuck with having to split the process up a bit.
Is it possible to craft an Ansible loop that reads 100 key/values-pairs at once, creates one big api call with all of them, sends it off and repeats this until the end of the config file is reached?