2014-09-19 9 views
3

Мне интересно, есть ли какой-либо достойный способ потребовать от всех хостов, чтобы набор задач должен выполняться для фактического достижения?Прерывание доступной игровой книги, если хост недоступен

В настоящее время я пытаюсь обработать обновление, которое может быть больно, если они не все соответствующие узлы обновляются синхронно.

ответ

4

Я собирался отправить вопрос, когда я увидел это. Ответ, предложенный Дунканом, не работает, по крайней мере, в моем случае. хост недостижим. Все мои плейбуки определяют max_fail_percentage of 0.

Но незаметный человек с радостью выполнит все задачи на хостах, которые он сможет достичь и выполнить действие. Я действительно хотел, чтобы какой-либо из хостов был недоступен, не выполняйте никаких задач.

То, что я нашел, было простым, но может считаться хакерским решением и открытым для лучших ответов.

С первого шага, как часть запуска плейбуков, невозможно собрать факты для всех хостов. И в случае, если хост недоступен, он не сможет. Я пишу простую игру в самом начале моей пьесы, которая будет использовать факт. И если хост недоступен, эта задача завершится с ошибкой «Неопределенная переменная ошибка». Задача - всего лишь манекен и всегда будет проходить, если все хосты достижимы.

Ниже мой пример:

- name: Check Ansible connectivity to all hosts 
    hosts: host_all 
    user: "{{ remote_user }}" 
    sudo: "{{ sudo_required }}" 
    sudo_user: root 
    connection: ssh # or paramiko 
    max_fail_percentage: 0 
    tasks: 
    - name: check connectivity to hosts (Dummy task) 
     shell: echo " {{ hostvars[item]['ansible_hostname'] }}" 
     with_items: groups['host_all'] 
     register: cmd_output 

    - name: debug ... 
     debug: var=cmd_output 

В случае хост недоступен, вы получите сообщение об ошибке, как показано ниже:

TASK: [c.. ***************************************************** 
fatal: [172.22.191.160] => One or more undefined variables: 'dict object' has no attribute 'ansible_hostname' 
fatal: [172.22.191.162] => One or more undefined variables: 'dict object' has no attribute 'ansible_hostname' 

FATAL: all hosts have already failed -- aborting 

Примечание: Если ваша группа хозяин не называется host_all, вы должны изменить фиктивную задачу, чтобы отразить это имя.

+0

Спасибо, я закончил тем, что использовал это как pretask [См. Gist] (https://gist.github.com/JakeDEvans/00aaaab051a9c234de7f32da1bb2b8c2) –

0

Вы можете добавить max_fail_percentage в свой сборник пьес - что-то вроде этого:

- hosts: all_boxes 
    max_fail_percentage: 0 
    roles: 
    - common 
    pre_tasks: 
    - include: roles/common/tasks/start-time.yml 
    - include: roles/common/tasks/debug.yml 

Таким образом, вы можете решить, сколько неудачи вы хотите терпеть. Вот relevant section from the Ansible Documentation:

По умолчанию анзибль продолжит выполнение действий до тех пор, пока хосты, в группе, пока не удалось. В некоторых ситуациях , например, с обновлением прокатки, описанным выше, может оказаться желательным , чтобы прервать игру, когда достигнут определенный порог ошибок . Чтобы достичь этого, в версии 1.3 вы можете установить максимальный процент провала на игре следующим образом:

  • хостов: вебсервер max_fail_percentage: 30 последовательные: 10 В приведенном выше примере, если более чем 3 из 10 серверов в группе было сбой, остальная часть игры была бы прервана.

Примечание: процентное значение должно быть превышено, а не равно. Например, если серийный были установлены на 4 и вы хотели задачу прервать, когда 2 из систем не удалось, процент должен быть установлен на 49, а не 50.

2

Вы можете комбинировать any_errors_fatal: trueилиmax_fail_percentage: 0 с gather_facts: false, а затем выполнить задачу, которая потерпит неудачу, если хозяин отсутствует. Нечто подобное в верхней части сборника пьес должны делать то, что вам нужно:

- hosts: all 
    gather_facts: false 
    max_fail_percentage: 0 
    tasks: 
    - action: ping 

бонус в том, что это также работает с -l SUBSET опции для ограничения, соответствующие узлы.

+1

Почему нужны необходимые факты? – hbogert

+1

По умолчанию Ansible будет работать только на хостах, которые достижимы, и определяет это при сборе фактов. Последующий 'ping' всегда будет успешным, потому что Ansible только пытается запустить playbook на хостах, которые, как он знает, уже заняты. – wilkystyle

+1

Бегущее поведение ansible изменилось таким образом в 2.0, что это больше не работает. – hbogert

 Смежные вопросы

  • Нет связанных вопросов^_^