Скажите Ansible, чтобы выполнить итерацию по большой (сетевой камере) конфигурации yml и обновить 100 значений одновременно одним вызовом API - PullRequest
0 голосов
/ 09 января 2020

У меня есть файл .yml, заполненный сотнями значений конфигурации для сетевой камеры Axis. Содержимое выглядит следующим образом:

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

API Axis, называемый 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, склеив пары ключ / значение вместе с & -symbol следующим образом:

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

Возможно ли создать Ansible l oop, который одновременно читает 100 пар ключ / значение, создает один большой вызов API со всеми из них, отправляет его и повторяет до тех пор, пока не будет достигнут конец файла конфигурации?

1 Ответ

1 голос
/ 09 января 2020

Просто создайте список параметров запроса в al oop и отправьте его сразу, присоединив их к &.

---
- 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, если у вас действительно много или params. В этом случае обрежьте следующее в несколько итераций.
  • Возможно, вам придется кодировать свои значения с помощью фильтра urlencode, если они содержат специальные символы.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...