Использование от ansible до bootstrap и поддержка нескольких серверов с разными ОС. Я хотел бы иметь свой собственный набор ролей, каждая из которых имеет одинаковые задачи / main.yml, примерно так:
---
- name: EXIT - not supported OS found
fail:
msg: "Unsupported OS {{ ansible_distribution }} {{ ansible_distribution_version }} ({{ ansible_distribution_major_version }})"
when:
- ansible_distribution != "CentOS" or ansible_distribution_major_version != "8"
- ansible_distribution != "Debian" or ansible_distribution_version != "10"
- ansible_distribution != "Ubuntu" or ansible_distribution_version != "20.04"
- name: "Load OS family specific variables - {{ ansible_os_family }}_family.yml"
include_vars:
file: "vars/{{ ansible_os_family }}_family.yml"
ignore_errors: true
- name: "Load distribution specific variables - {{ ansible_distribution }}.yml"
include_vars:
file: "vars/{{ ansible_distribution }}.yml"
ignore_errors: true
- name: "Load distribution major version specific variables - {{ ansible_distribution }}_{{ ansible_distribution_major_version }}.yml"
include_vars:
file: "vars/{{ ansible_distribution }}_{{ ansible_distribution_major_version }}.yml"
ignore_errors: true
- name: "Load distribution version specific variables - {{ ansible_distribution }}_{{ ansible_distribution_version }}.yml"
include_vars:
file: "vars/{{ ansible_distribution }}_{{ ansible_distribution_version }}.yml"
ignore_errors: true
- name: Running common tasks for any distribution any version - common.yml
include_tasks: common.yml
ignore_errors: true
- name: "Running tasks for OS family - {{ ansible_os_family }}_family.yml"
include_tasks: "{{ ansible_os_family }}_family.yml"
ignore_errors: true
- name: "Running tasks for distribution - {{ ansible_distribution }}.yml"
include_tasks: "{{ ansible_distribution }}.yml"
ignore_errors: true
- name: "Running tasks for {{ ansible_distribution }} {{ ansible_distribution_version }} ({{ ansible_distribution_major_version }})"
include_tasks: "{{ lookup('first_found', possible_files) }}"
vars:
possible_files:
- "{{ ansible_distribution }}_{{ ansible_distribution_version }}.yml"
- "{{ ansible_distribution }}_{{ ansible_distribution_major_version }}.yml"
ignore_errors: true
Первая задача предварительно проверит все поддерживаемые ОС и остановит выполнение если ОС не поддерживается ролью.
С его помощью я могу определять переменные на разных уровнях, а позже их можно переопределить. Например, если переменная определена в RedHat_family.yml, тогда она будет доступна для CentOS 7 и CentOS 8, но если она будет переопределена в CentOS_8.yml, то только для CentOS 8 она будет иметь другое значение. В то же время нет необходимости в существовании всех .ymls для всех поддерживаемых ОС и версий из-за ignore_errors: true
. Эта часть рабочая.
Проблема в разделе задач. Этот раздел не работает.
fatal: [myserver]: FAILED! => {"reason": "Could not find or access 'playbooks/common.yml' on the Ansible Controller."}
Include_tasks не поддерживают ignore_errors. Я хотел бы сгруппировать задачи в общие задачи, задачи семейства ОС, задачи распространения, задачи версии распространения, и каждая из них может существовать или не существовать. Как я могу добиться такой функциональности? Есть ли лучшее решение для такого рода динамики c загрузки зависимых переменных и задач ОС?
Спасибо,