Ansible динамика c include_vars и include_tasks в зависимости от ОС - PullRequest
1 голос
/ 16 июня 2020

Использование от 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 загрузки зависимых переменных и задач ОС?

Спасибо,

...