Насколько мне известно, такого интегрированного механизма не существует. Задача начнется с первого хоста в инвентаре в зависимости от того, что совпадает в вашей игре (, то есть параметр hosts
, ), и, в конечном итоге, ограничения, которые вы использовали в своей командной строке (, то есть параметр -l
. в ansible playbook )и остановится после этого, если был использован run_once
.
Между тем, я думаю, что есть способ достичь цели.
ansible_play_hosts
-список активных хостов в текущем воспроизведении, ограниченный серийным номером, он же «пакет» hostvars
-хэш-карта со всеми хостами в инвентаре и назначенными им переменными ansible_memfree_mb
. Эта переменная существует только в том случае, если вы собираете факты о своих хостах (, т.е. вы не отключили это с помощью gather_facts: no
в своей игре )map
позволяет нам извлекать только соответствующую информацию о хосте изhostvars
json_query
(реализацияjmespath
)позволяет нам фильтровать список переменных, ища максимальную память и получая только имя хоста соответствующего узла в конце В приведенном ниже плейбуке показано, как комбинировать вышеперечисленные элементы для достижения цели. В задаче используется комбинация run_once
, delegate_to
и delegate_facts
, поэтому она выполняется на определенном хосте, как если бы он был выбран в первую очередь.
---
- name: Delegate single running task to dynamically chosen host
hosts: all
gather_facts: true
vars:
max_mem_query: max_by(@, &ansible_memfree_mb).inventory_hostname
selected_host: >-
{{
ansible_play_hosts |
map('extract', hostvars) |
list |
json_query(max_mem_query)
}}
tasks:
- name: Run a command on host with most memory
debug:
msg: "I would run on host {{ inventory_hostname }}"
run_once: true
delegate_to: "{{ selected_host }}"
delegate_facts: true
Примечание.:Я проверял это только на инвентаре с двумя локальными экземплярами докеров, чтобы проверить мой плейбук, поэтому вывод на самом деле не актуален (все экземпляры имеют одинаковую доступную память, выбирается первый экземпляр, который делегирует самому себе ). Но я совершенно уверен, что это сработает, и я готов отредактировать это, чтобы учесть некоторые возможные особенности, если нет.
Это тема Zsh под названием agnoster , которая работает в сочетании с Powerline -исправленными шрифтами для отображения этих символов.
Он доступен в Oh My Zsh .