У меня проблема с подготовкой источников данных Grafana с переменными хоста для ключа api и URL-адреса.
Я намерен реализовать общий список источников данных на нескольких хостах Grafana (платформах для тестирования и разработки). у этих хостов есть собственный URL-адрес Grafana и ключ API.
Запуск grafana_datasource
явно работает нормально, а использование переменных в debug
выводит мои ожидаемые значения для ключа API и URL-адреса, как и ожидалось, но с использованием того же синтаксиса в grafana_datasource
вызывает проблемы.
Я создал переменные хоста в моем инвентаре следующим образом:
[hostgroup]
host1 grafapikey=loTsoFLeTTers grafurl=https://host1.net
host2 grafapikey=loTsoFLeTTers grafurl=https://host2.net
Затем я тестирую ссылки на эти переменные в моем playbook следующим образом:
- name: what is grafurl
debug:
msg: "{{ hostvars[inventory_hostname].grafurl }}"
- name: what is grafapi
debug:
msg: "{{ hostvars[inventory_hostname].grafapikey }}"
# note output is identical whether using msg or var here
и результат будет таким, как ожидалось:
TASK [what is grafurl] **************************
ok: [host1.net] => {
"msg": "https://host1.net/"
}
TASK [what is grafapi] **************************
ok: [host1.net] => {
"msg": "loTsoFLeTTers"
}
Кроме того, явное определение всех аргументов при выполнении этой команды ad-ho c успешно создает источник данных.
user@ansible-host:~$ ansible host1.net -m grafana_datasource -a "grafana_api_key='LoTsofLettERs' grafana_url='https://host1.net' name=testds ds_type=mysql url='testurl' database='test'" -K
BECOME password:
host1.net | CHANGED => {
"changed": true,
"id": 2,
"msg": "Datasource testds created : Datasource added",
"name": "testds"
}
Однако , выполнение той же команды adho c с использованием ссылок на переменные вызывает проблемы:
user@ansible-host:~$ ansible host1.net -m grafana_datasource -a "grafana_api_key='{{ hostvars[inventory_hostname].grafapikey }}' grafana_url='{{ hostvars[inventory_hostname].grafurl }}' name=testds ds_type=mysql url='testurl' database='test' validate_certs=no" -K
BECOME password:
scada.ifctrl.net | FAILED! => {
"changed": false,
"module_stderr": "Shared connection to scada.ifctrl.net closed.\r\n",
"module_stdout": ##see below
Я получаю длинные ошибки в выводе плейбука, описывающие неожиданный пустой JSON:
Traceback (most recent call last):
File \"/root/.ansible/tmp/ansible-tmp-1596750425.3152304-29947-100749071777145/AnsiballZ_grafana_datasource.py\", line 102, in <module>
_ansiballz_main()
File \"/root/.ansible/tmp/ansible-tmp-1596750425.3152304-29947-100749071777145/AnsiballZ_grafana_datasource.py\", line 94, in _ansiballz_main
invoke_module(zipped_mod, temp_path, ANSIBALLZ_PARAMS)
File \"/root/.ansible/tmp/ansible-tmp-1596750425.3152304-29947-100749071777145/AnsiballZ_grafana_datasource.py\", line 40, in invoke_module
runpy.run_module(mod_name='ansible.modules.monitoring.grafana_datasource', init_globals=None, run_name='__main__', alter_sys=True)
File \"/usr/lib/python3.6/runpy.py\", line 205, in run_module
return _run_module_code(code, init_globals, run_name, mod_spec)
File \"/usr/lib/python3.6/runpy.py\", line 96, in _run_module_code
mod_name, mod_spec, pkg_name, script_name)
File \"/usr/lib/python3.6/runpy.py\", line 85, in _run_code
exec(code, run_globals)
File \"/tmp/ansible_grafana_datasource_payload_pwpa837u/ansible_grafana_datasource_payload.zip/ansible/modules/monitoring/grafana_datasource.py\", line 683, in <module>
File \"/tmp/ansible_grafana_datasource_payload_pwpa837u/ansible_grafana_datasource_payload.zip/ansible/modules/monitoring/grafana_datasource.py\", line 665, in main
File \"/tmp/ansible_grafana_datasource_payload_pwpa837u/ansible_grafana_datasource_payload.zip/ansible/modules/monitoring/grafana_datasource.py\", line 504, in grafana_create_datasource
File \"/tmp/ansible_grafana_datasource_payload_pwpa837u/ansible_grafana_datasource_payload.zip/ansible/modules/monitoring/grafana_datasource.py\", line 397, in grafana_datasource_exists
File \"/usr/lib/python3.6/json/__init__.py\", line 354, in loads
return _default_decoder.decode(s)
File \"/usr/lib/python3.6/json/decoder.py\", line 339, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File \"/usr/lib/python3.6/json/decoder.py\", line 357, in raw_decode
raise JSONDecodeError(\"Expecting value\", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
Мой синтаксис неверен? Я неправильно ссылаюсь на переменные в области действия grafana_datasource
в моем сценарии?