Timur
Его мы и заполняем, беря соответствующие параметры из инвентаря
Timur
Берем группу 'all', вытаскиваем из всех хостов в этой группе свойства 'ansible_ssh_host', отбрасываем те элементы, где это свойство не задано (select('defined')) и формируем итоговый список из нужных нам значений (list)
Timur
На разные строки конвеер разбит для читабельности
John
счас попытаюсь дополнить list портами) Если что, через час опять приду за портами)
Timur
Это просто конвеер из фильтров. Подумайте логически, как бы вы сами составляли список
Timur
счас попытаюсь дополнить list портами) Если что, через час опять приду за портами)
Еще небольшой совет: не используйте имена кастомных переменных, начинающиеся на ansible
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
Задайте каждому хосту две переменные: prometheus_target и prometheus_port
John
Задайте каждому хосту две переменные: prometheus_target и prometheus_port
в инвентори? а для чего? чего я добьюсь тогда?
Timur
в инвентори? а для чего? чего я добьюсь тогда?
Добьетесь того, что четко опишете сущности. Если у вас поменяется интерфейс, по которому будет ходить ансибл, на мониторинг это не повлияет. И наоборот
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
Alexander
Так а сделать не по умолчанию для конкретной переменной можно? Я же явно int сказал
Timur
Добавить фильтр int
Alexander
Да вот же он - - set_fact: t_max: "{{ foo | map(attribute='t') | list | max | int }}"
Timur
Это внутри int, а снаружи кавычки :)
Timur
А, ну да
Timur
Хранить форматы он не умеет, если вы об этом
Alexander
Ну понятно. Не знал.
John
В параметре сделайте так: prometheus_targets: node: - targets: >- {{ groups['all'] | map('extract', hostvars, ['ansible_ssh_host']) | select('defined') | list }}
посыпаю голову пеплом. Не понимаю как указать еще и порт. то есть я получаю желаемое, но без порта получается так: - targets: - 10.0.3.123 а надо - targets: - 10.0.3.123:9100 что-куда бы не указал, везде плейбук ругается
Timur
Там чуть иначе нужно
Timur
Через pre-tasks
Timur
Вы переменные задали в inventory?
John
полтора часа бьюсь, и чувствую себя как чувак пырающийся выбить картину https://youtu.be/WejnmbuEcHo?t=27
Timur
Покажите, что у вас в инвентаре и плейбуке пока
John
https://pastebin.com/ereM34hx
Timur
https://pastebin.com/ereM34hx
И где у вас порты указаны?
Timur
Их же нет
John
я пробовал прям в плейбуке, в ту конструкцию что вы дали дописать :9100
John
просто порт статичен, по этому для него отдельно не указываю переменную
Timur
Я же сказал вам, что сделать
Timur
Укажите в инвентори переменные prometheus_target и prometheus_port
Timur
prometheus_port можете сделать общей для группы
Timur
Сделали?
John
https://pastebin.com/EuAhVKbp так?
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
Если нет, то либо писать самому, либо поддерживать другой велосипед
Pavel
модуль telnet есть, именно его я и тестировал
Nklya
Кошерный вариант - писать на питоне ансибл модули для своих железок.
Nklya
А так там raw есть, я видел примеры его использования для микротиков\
Pavel
у микротиков ssh есть
Pavel
а, например, d-link des3526 с ssh работает так, что лучше бы не работал - задержка при логине около минуты, не говоря уж об устаревших алгоритмах шифрования