2016-09-16 3 views
1

У меня есть playbook, который я хочу выполнить только на серверах RHEL 6. Я знаю, что я могу поставитьAnsible run playbook только для хостов, которые соответствуют некоторым переменным

when: ansible_distribution == "RedHat" and ansible_distribution_major_version == 6 

В каждой задачи в рамках всего сборника пьес, но это кажется довольно неэффективно для меня.

Нет ли способа ограничить всю игру на эти машины, чтобы мне не пришлось вставлять эту строку в каждую задачу?

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

Кроме того, я полагаю, что наиболее эффективным способом было бы сохранить список серверов RHEL 6 в стороне и выполнить эту игру на них только, так как Ansible не кэширует эту информацию, поэтому она всегда должна была подключитесь ко всем серверам, чтобы выяснить, являются ли они RHEL и версией 6?

+0

Ниже приведен хороший ответ, но вы правы, что лучшим способом было бы отслеживать ОС в инвентаре в виде групп. – smiller171

ответ

2

Используйте include с with_first_found:

- include: "{{ include_path }}" 
    with_first_found: 
    - "{{ ansible_distribution }}.yml" 
    - "{{ ansible_os_family }}.yml" 
    - "default.yml" 
    loop_control: 
    loop_var: include_path 

Update: добавлены loop_var для предотвращения возможно item переменное столкновение.

+1

@techraf хорошая точка, спасибо! обновил ответ. –

0

Одна из стратегий для решения этой проблемы является включение файла задачи с целевой специфической для версии распределения, как это в основном файле задачи:

- include: "{{ ansible_distribution }}-{{ ansible_distribution_major_version }}.yml" 

Файл tasks/RedHat-6.yml будет, чем содержать все задачи, характерные для RHEL6.

Если вы хотите, чтобы ваш PlayBook на провал, когда распределение не поддерживается вы могли бы сделать что-то вроде этого:

- include: RedHat6.yml 
    when: ansible_distribution == "RedHat" and ansible_distribution_major_version == 6 

- fail: 
    msg: "Distribution not supported" 
    when: ansible_distribution != "RedHat" or whatever conditions you want 
+0

Это опрятно, есть ли способ поймать «неизвестный дистрибутив», так что ansible не создает какой-то файл, не найденный ошибка времени выполнения и не все? – Petr

+0

Возможно, что-то вроде этого: '- include: unknown_distribution.yml, когда: not {{ansible_distribution}} определен'. Но я не уверен, что Ansible возвращается, когда ему не удалось определить распределение. –

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