Timur
Его мы и заполняем, беря соответствующие параметры из инвентаря
Timur
Берем группу 'all', вытаскиваем из всех хостов в этой группе свойства 'ansible_ssh_host', отбрасываем те элементы, где это свойство не задано (select('defined')) и формируем итоговый список из нужных нам значений (list)
Timur
На разные строки конвеер разбит для читабельности
John
счас попытаюсь дополнить list портами) Если что, через час опять приду за портами)
John
Timur
Это просто конвеер из фильтров. Подумайте логически, как бы вы сами составляли список
John
вы про ansible_ssh_host ?
Timur
да
John
так это вроде из мануалов взял
Timur
С ansible начинаются обычно всякие встроенные переменные ансибла и факты
Timur
Есть служебная переменная ansible_host
Timur
Видимо, она имелась в виду
Timur
Но это именно для подключения ансибла используется
Timur
Для таргетов прометея лучше другую переменную использовать
Timur
Потому что в общем случае мониторинг и менеджмент могут ходить по разным интерфейсам
John
не могут) Потому что машина имеет только один интерфейс
а действительно про ansible_ssh_host в мануале сколько написано для 1.9 версии использовался, а с 2.+ надо ansible_host
поправлю
Timur
Timur
В тех же инстансах амазона с паблик айпи их минимум два
Timur
Внутренний и внешний
Timur
А может быть вообще несколько
Timur
Не нужно хардкодить то, что можно параметризовать
Timur
Задайте каждому хосту две переменные: prometheus_target и prometheus_port
John
Svyatoslav
Я уже отказался от идеи oneliner'а и пробую по-другому.
Всё равно никак:
$ cat ttt.yml
---
- hosts: localhost
vars:
foo:
- { "val": 1, t: 3 }
- { "val": 2, t: 2 }
- { "val": 3, t: 1 }
tasks:
- set_fact:
t_max: "{{ foo | map(attribute='t') | list | max }}"
cacheable: true
- set_fact:
val_with_t_max: "{{ foo | selectattr('t', 'equalto', t_max) | list }}"
- set_fact:
val_with_t_3: "{{ foo | selectattr('t', 'equalto', 3) | list }}"
$ ansible-playbook -v -i hosts ttt.yml
PLAY [localhost] ****************************
TASK [set_fact] *****************************
ok: [localhost] => {"ansible_facts": {"t_max": "3"}, "changed": false}
TASK [set_fact] *****************************
ok: [localhost] => {"ansible_facts": {"val_with_t_max": []}, "changed": false}
TASK [set_fact] *****************************
ok: [localhost] => {"ansible_facts": {"val_with_t_3": [{"t": 3, "val": 1}]}, "changed": false}
PLAY RECAP **********************************
localhost : ok=3 changed=0 unreachable=0 failed=0
работает если использовать int
- set_fact:
val_with_t_max: "{{ foo | selectattr('t', 'equalto', t_max | int) | list }}"
Alexander
Alexander
Timur
Timur
Ларчик просто открывался
Alexander
Ну и в одну строку можно, если аргументом к selectattr подставить не готовое t_max, а foo | map(attribute='t') | list | max | int
Но это, конечно, не нативная фильтрация по аттрибуту (которая, судя по всему, не работает).
Alexander
Забавно, что, судя по всему, не существует способа конвертировать переменную в int при назначении.
$ cat ttt.yml
---
- hosts: localhost
vars:
foo:
- { "val": 1, t: 3 }
- { "val": 2, t: 2 }
- { "val": 3, t: 1 }
tasks:
- set_fact:
t_max: "{{ foo | map(attribute='t') | list | max | int }}"
cacheable: true
- set_fact:
val_with_t_max: "{{ foo | selectattr('t', 'equalto', t_max ) | list }}"
$ ansible-playbook -v -i ~/ansible-home/hosts ttt.yml
PLAY [localhost] ********************
TASK [set_fact] ********************
ok: [localhost] => {"ansible_facts": {"t_max": "3"}, "changed": false}
TASK [set_fact] ********************
ok: [localhost] => {"ansible_facts": {"val_with_t_max": []}, "changed": false}
PLAY RECAP ********************
localhost : ok=2 changed=0 unreachable=0 failed=0
Timur
Забавно, что, судя по всему, не существует способа конвертировать переменную в int при назначении.
$ cat ttt.yml
---
- hosts: localhost
vars:
foo:
- { "val": 1, t: 3 }
- { "val": 2, t: 2 }
- { "val": 3, t: 1 }
tasks:
- set_fact:
t_max: "{{ foo | map(attribute='t') | list | max | int }}"
cacheable: true
- set_fact:
val_with_t_max: "{{ foo | selectattr('t', 'equalto', t_max ) | list }}"
$ ansible-playbook -v -i ~/ansible-home/hosts ttt.yml
PLAY [localhost] ********************
TASK [set_fact] ********************
ok: [localhost] => {"ansible_facts": {"t_max": "3"}, "changed": false}
TASK [set_fact] ********************
ok: [localhost] => {"ansible_facts": {"val_with_t_max": []}, "changed": false}
PLAY RECAP ********************
localhost : ok=2 changed=0 unreachable=0 failed=0
По умолчанию ансибл все строками считает, ЕМНИП
Alexander
Так а сделать не по умолчанию для конкретной переменной можно?
Я же явно int сказал
Timur
Добавить фильтр int
Alexander
Да вот же он -
- set_fact:
t_max: "{{ foo | map(attribute='t') | list | max | int }}"
Timur
Это внутри int, а снаружи кавычки :)
Timur
А, ну да
Timur
Хранить форматы он не умеет, если вы об этом
Alexander
Ну понятно. Не знал.
Timur
Timur
Там чуть иначе нужно
Timur
Через pre-tasks
Timur
Вы переменные задали в inventory?
John
полтора часа бьюсь, и чувствую себя как чувак пырающийся выбить картину https://youtu.be/WejnmbuEcHo?t=27
Timur
Покажите, что у вас в инвентаре и плейбуке пока
John
https://pastebin.com/ereM34hx
Timur
Timur
Их же нет
John
я пробовал прям в плейбуке, в ту конструкцию что вы дали дописать :9100
Timur
John
просто порт статичен, по этому для него отдельно не указываю переменную
Timur
Я же сказал вам, что сделать
Timur
Укажите в инвентори переменные prometheus_target и prometheus_port
Timur
prometheus_port можете сделать общей для группы
Timur
Сделали?
John
John
https://pastebin.com/EuAhVKbp так?
Timur
Timur
А для таргетов нужно сделать вот такую магию
Timur
https://pastebin.com/ErfY1ePB
Timur
Только вместо tasks напишите pre_tasks
John
ругается почему то на prom_targets
"msg": "'prom_targets' is undefined"}
Timur
Момент
John
чую все праздники буду разбираться с этой магией)
вообще тупое копи-паст получается. Хотя надо-то всего в файлик написать пять строчек. Спасибо за то, что помогаете!
Timur
Тогда вот так попробуйте:
https://pastebin.com/aEgfyAMz
John
TASK [cloudalchemy.prometheus : Fail when file_sd targets are not defined in scrape_configs]
fatal: [test-bnb0]: FAILED! => {"msg": "'localhost' is undefined"}
Timur
У вас файлов с нужными конфигами нет
Timur
Тут уж я ничем помочь не могу. Вы их сами должны делать
John
так если я руками укажу
prometheus_targets:
node:
- targets:
- 10.0.3.177:9100
- 10.0.3.178:9100
- 10.0.3.179:9100
то файл появляется. Но так как я уже много раз играл этот плейбук, то и сам файл есть. просто его содержимое...
John
ладно, спасибо за попытку помочь!
бежать надо. Позднее попытаюсь разобраться с деталями
Pavel
подскажите, как нынче в ансибле с телнетом для всяких древних сетевых железок? поддерживать велосипед на bash+expect утомило, но когда тестировал версию 2.7.1, оно всё так же падало где-то внутри себя с руганью на сбой преобразования кодировок.
Timur
Timur
Если нет, то либо писать самому, либо поддерживать другой велосипед
Pavel
модуль telnet есть, именно его я и тестировал
Nklya
Кошерный вариант - писать на питоне ансибл модули для своих железок.
Nklya
А так там raw есть, я видел примеры его использования для микротиков\
Pavel
у микротиков ssh есть
Pavel
а, например, d-link des3526 с ssh работает так, что лучше бы не работал - задержка при логине около минуты, не говоря уж об устаревших алгоритмах шифрования