告诉 Ansible 遍历一个大的(网络摄像机)配置 yml 并在一个 api 调用中同时更新 100 个值

Tell Ansible to iterate through a big (network camera) configuration yml and update 100 values simultaneously one api call

我有一个 .yml 文件,其中包含安讯士网络摄像机的数百个配置值。内容如下所示:

---
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
    ...

Axis API,称为 Vapix,提供了一个更新值的更新函数,因此我在值中循环并在每次迭代时触发新的 API 调用:

---
  - 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 }}"

事实证明这是有效的,但需要很长时间。我手动发现可以通过一个 API 调用来更新多个值,方法是将 key/value-pairs 与 &-符号粘合在一起,如下所示:

https://{{ axis_snmp_role.server_url }}/axis-cgi/param.cgi?action=update&ImageSource.I0.Sensor.ExposureValue=100&Image.I0.Appearance.Compression=50

是否可以制作一个 Ansible 循环,一次读取 100 key/values-pairs,创建一个包含所有这些的大 api 调用,发送它并重复此操作直到配置结束已到达文件?

只需在一个循环中创建一个查询参数列表,然后立即将其发送给 &

---
- name: Create a parameter list
  set_fact:
    my_params: "{{ my_params | default([]) + [îtem.key + '=' + item.value] }}"
  with_dict: "{{ axis.config }}"

- name: Update parameters
  uri:
    user: "{{ axis_snmp_role.login_user }}"
    password: "{{ axis_snmp_role.login_password }}"
    url: "{{ axis_snmp_role.server_url }}?action=update&{{ my_params | join('&') }}"
    validate_certs: false
  delegate_to: localhost

备注:

  • 如果您真的有很多或参数,您可能会达到 url 最大长度。在这种情况下,在几次迭代中削减以下内容。
  • 如果您的值包含特殊字符,您可能必须使用 urlencode 过滤器对其进行编码。