Можно ли определить стратегию run_once в Ansible?

No estoy seguro de lo que estás preguntando exactamente.

Para obtener la ruta de un archivo con la mayor primera secuencia de 8 dígitos en su primera línea, conzsh:

getdate() {
  local MATCH
  IFS= read -r < $REPLY && [[ $REPLY =~ '[[:digit:]]{8}' ]]
  REPLY=$MATCH
}

printf '%s\n' /Home/h87654/file/*.*(O+getdate[1])

Para obtener la fecha mayor y todos los archivos que contienen esa fecha mayor como la primera secuencia de 8 dígitos en su primera línea, podría hacer algo como:

typeset -A bydate
for file (/Home/h87654/file/*.*) {
  IFS= read -r line < $file &&
    [[ $line =~ '[[:digit:]]{8]' ]] &&
    bydate[$MATCH]+=$file$'\n'
}
latest=${${(kO)bydate}[1]}
printf 'Latest date: %s\nFiles:\n%s' $latest $bydate[$latest]
2
12.07.2019, 17:59
1 ответ

Насколько мне известно, такого интегрированного механизма не существует. Задача начнется с первого хоста в инвентаре в зависимости от того, что совпадает в вашей игре (, то есть параметр hosts, ), и, в конечном итоге, ограничения, которые вы использовали в своей командной строке (, то есть параметр -l. в ansible playbook )и остановится после этого, если был использован run_once.

Между тем, я думаю, что есть способ достичь цели.

Фоновая информация

  • Ansible поддерживает некоторые магические переменные , среди которых :
    • 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

Примечание.:Я проверял это только на инвентаре с двумя локальными экземплярами докеров, чтобы проверить мой плейбук, поэтому вывод на самом деле не актуален (все экземпляры имеют одинаковую доступную память, выбирается первый экземпляр, который делегирует самому себе ). Но я совершенно уверен, что это сработает, и я готов отредактировать это, чтобы учесть некоторые возможные особенности, если нет.

2
27.01.2020, 22:08

Теги

Похожие вопросы