Oleg
Мог быть 1с-ный camelcase в обратной польской нотации
George
А как бы сделать hander, который бы ничего не делал в наиболее аккуратном виде? У меня notify может быть перехвачен другим handler'ом (listen), а может и не быть, и мне нужен hander-затычка, чтобы не было ошибки.
Oleg
George
Я оба знаю. А чем они мне помогут сделать handler, который ничего не делает?
Oleg
возможно я ошибаюсь но
changed_when: false
сделает так что хандлер не будет дёргаться
George
У меня другая задача. Мне нужно дёрнуть handler, но в одной ситуации его будет слушать осмысленный получатель (которого результат волнует), а в другом - нет. (но таска в любом случае changed, т.к. изменения были).
George
О, нашёл.
- name: some_handler
set_stats:
George
Ой, есть ещё интереснее. У handler'а поддерживается when. Т.е. будет так:
- name: some
set_stats:
when: false
А в выводе будет:
TASK [r2 : command]
changed: [localhost]
RUNNING HANDLER [r2 : some]
skipping: [localhost]
Timur
Timur
Зачем дергать хендлер, который ничего не делает?
George
Потому что если нет подходящего handler'а, то notify ломает роль.
Timur
George
ERROR! The requested handler 'bad' was not found in either the main handlers list nor in the listening handlers list
Отделение Bereke Bank
а зачем notify-ить несуществующий хандлер 🤔
Timur
George
Потому что роль может посылать уведомление другой роли (которая её import)
Tamerlan
Timur
Отделение Bereke Bank
мне кажется вы делаете чтото не так
Timur
George
А мне кажется, что вы просто не писали на Ансибле переиспользуемые роли, которые могут посылать уведомления вызывающей роли. //Вот и обменялись любезностями, спасибо за помощь.
Timur
Timur
Что за уведомления вызывающей роли?
George
Приложение А запускает приложение Б, которое использует приложение В. Мне нужно перезапустить приложение А если любое из Б||В было обновлено, но только если API-сервер даёт на это разрешение. Если не даёт, надо подождать (retries: 10, delay: 10), и если не получится, сломаться. Но при следующем перезапуске надо всё равно повторить попытку перезапуска (с получением разрешения).
George
И да, там не только опциональные handler'ы, но и персистентные флаги в файловой системе.
George
... Для усиления любопытства, приложение Б используется ещё с кучей других приложений (другим образом), так что роль переиспользуется много-много раз.
Timur
Ну, и при чем тут вызывающая роль тогда?
Timur
Все это можно сделать и проще, на мой взгляд
George
Я весь внимание.
Timur
Пост-таски, как вариант
Timur
Хэндлеры должны быть привязаны к роли и не отрываться от нее
Timur
Если есть кросс-зависимости с другими ролями, это уже решается на уровне плейбука
Отделение Bereke Bank
не знаю что за приложения, но к примеру у меня есть роль nginx. у нее есть хандлер для релоада
есть куча других ролей для приложений, которым может понадобиться nginx. То есть роль вполне переиспользуемая. И в куче других ролей так же есть хандлер reload nginx.
notify-ится он из тасок, на которых висит when: "'nginx' in ansible_facts.packages"
George
пост-таски на уровне play?... А, прошу прощения, забыл уточнить: сервис A устанавливается в N копий (внутри include_tasks с `with_items`). Список сколько ставить определяется динамически, по ответу того же API-сервера.
George
Tamerlan
Tamerlan
далее просто when: A and B
Старый
народ, объясните как достать idшник видеокарты и аудокарты из фактов?
Старый
Tamerlan
Tamerlan
или я вас неправильно понял, что вполне ожидаемо
Tamerlan
George
дозавершить - перезапустить без проверок?
Увидеть, что не было успешного перезапуска, запросить разрешение, дождаться его, и свалиться или перезапустить. Эту часть я давно решил. (https://medium.com/opsops/file-flags-in-ansible-two-implementations-b0910b3a1479)
Tamerlan
а если вы прогнали роль один раз, а потом сервер перезапустился?
Tamerlan
/var/run в tmpfs существует
Tamerlan
т.е., уже не персистентно
George
Хехе. Как ты думаешь, был ли сервис перезапущен, если /var/run пересоздалась? (Это основная причина для использования /var/run)
Tamerlan
George
Если после register роль упала, то значение потеряется. При следующем запуске package уже не зарегистрирует changed.
Tamerlan
George
Да, если делать не просто register, а ставить флаги в файловую систему, то да, отработает как надо. Собственно, у меня уже работает как надо, я просто искал красивую затычку на handler во вложенной роли, который некоторые вызывающие роли будут listen, а некоторые нет. Уже нашёл давно.
Дальше мне собеседники пытаются решить проблему которая уже решена.
Tamerlan
такое решение красивым назвать сложно. пощадите наследников
George
Программистов я и так уже пушаю сколько могу, а на уровне play оно ничуть не проще будет, только больше повторений, и per-role тестов не будет.
kevit
добрый день. может быть кто в курсе какие ограничения есть у {{ groups['x'] | map('extract', hostvars, 'ec2_ip_address') | list }}
kevit
у меня есть в group_vars переменная которая составляется из host_vars/host.yml и похоже это все ломает
kevit
точнее вопрос сводится к "рендерит ли map jinja"
George
Во-первых можно писать groups.x, а во-вторых extract с тремя аргументами требует, чтобы все объекты в hostvars были бы словарями. Будет не словарь - споткнётся. Я бы так не делал по hostvars, там шути что бывает.
kevit
Anonymous
Anonymous
это пздц
Vlad
есть наверно банальный вопрос
есть такая штука
- name: Copy systemd services
copy:
src: "systemd_services/{{ item }}_exporter.service"
dest: "{{ exporters_path_server }}"
loop: "{{ exporters }}
хочу как в баш использовать * после {{item}} чтобы получить все файлы совпадающие
как тут реализовать такое?
Vlad
типа src: "systemd_services/{{ item }}*_exporter.service"
а там у меня в папке файлы test_exporter.service и test123_exporter.service
например
Михаил Telsir
Михаил Telsir
Firestalk
Прошу прощения, не туда написал
Viachaslau
Всем привет. Ни как не могу понять как вывод парсить.
Например вывод модуля setup
"ansible_mounts": [
{
"block_available": 187323,
"block_size": 1024,
"block_total": 233191,
"block_used": 45868,
"device": "/dev/sda1",
"fstype": "ext2",
"inode_available": 124251,
"inode_total": 124496,
"inode_used": 245,
"mount": "/boot",
"options": "rw,relatime,errors=continue",
"size_available": 191818752,
"size_total": 238787584,
"uuid": "ab651abf-b5d8-411b-ba4e-6dde7bf4498e"
},
{
"block_available": 1675327,
"block_size": 4096,
"block_total": 25246570,
"block_used": 23571243,
"device": "/dev/mapper/srv--mon-root",
"fstype": "ext3",
"inode_available": 5323777,
"inode_total": 6414336,
"inode_used": 1090559,
"mount": "/",
"options": "rw,relatime,errors=remount-ro,barrier=1,data=ordered",
"size_available": 6862139392,
"size_total": 103409950720,
"uuid": "N/A"
}
],
Например надо вывести "device" и "mount" для двух сущностей.
пытался использовать regex_search и regex_findall
Timur
Timur
Всем привет. Ни как не могу понять как вывод парсить.
Например вывод модуля setup
"ansible_mounts": [
{
"block_available": 187323,
"block_size": 1024,
"block_total": 233191,
"block_used": 45868,
"device": "/dev/sda1",
"fstype": "ext2",
"inode_available": 124251,
"inode_total": 124496,
"inode_used": 245,
"mount": "/boot",
"options": "rw,relatime,errors=continue",
"size_available": 191818752,
"size_total": 238787584,
"uuid": "ab651abf-b5d8-411b-ba4e-6dde7bf4498e"
},
{
"block_available": 1675327,
"block_size": 4096,
"block_total": 25246570,
"block_used": 23571243,
"device": "/dev/mapper/srv--mon-root",
"fstype": "ext3",
"inode_available": 5323777,
"inode_total": 6414336,
"inode_used": 1090559,
"mount": "/",
"options": "rw,relatime,errors=remount-ro,barrier=1,data=ordered",
"size_available": 6862139392,
"size_total": 103409950720,
"uuid": "N/A"
}
],
Например надо вывести "device" и "mount" для двух сущностей.
пытался использовать regex_search и regex_findall
Фильтром map можно сформировать список из нужных свойств каждого словаря списка
Viachaslau
Timur
Михаил Telsir
Михаил Telsir
Timur
Михаил Telsir
Timur
Спасибо. Буду пробовать. Был бы признателен за пример.
В общем, я выдернул нужные данные так:
- name: Set lists
set_fact:
device_list: '{{ ansible_mounts | map(attribute="device") | list }}'
mount_list: '{{ ansible_mounts | map(attribute="mount") | list }}'