Как лучше всего управлять неподдерживаемыми дистрибутивами в роли Ansible?

Роль Ansible поддерживает Debian Stretch и Buster.

Он не может выполнять эту работу на Джесси или более старых версиях.

Как лучше всего сообщить пользователю, что эту роль нельзя использовать в данной старой версии?

  • Ничего не делать в файле main.yml (управление версией дистрибутива с помощью объявлений when:)
  • Позвольте роли явным образом дать сбой с помощью модуля fail.
  • Не проверяйте поддерживаемую версию дистрибутива и позволяйте задачам завершаться неудачно.

person Mat    schedule 07.02.2020    source источник


Ответы (2)


Разработчики должны размещать поддерживаемые/протестированные версии в файле Readme. Затем пользователи всегда должны читать Readme. Тогда следует руководствоваться здравым смыслом. Но мы все знаем, что это не так.

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

Этот метод наименее желателен: Do not check for a supported distro version and let tasks fail themselves. Потому что когда вы идете по этому пути, то на хосте выполняются какие-то неподдерживаемые задачи и тогда вы уже не можете гарантировать состояние системы. Короче говоря; вы создадите беспорядок.

Чтобы просто предотвратить кошмар, пусть игра провалится:

- name: fail when using older version
  fail:
    msg: "You fail because reason, woohoo"
  when: ansible_distribution is Ubuntu and ansible_distribution_version is 10.04
person Kevin C    schedule 07.02.2020

Вопрос: Как лучше всего управлять неподдерживаемыми дистрибутивами в роли Ansible?

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

В роли можно прочитать переменную galaxy_info из файла роли meta/main.yml и протестировать поддерживаемые платформы и версии.

$ cat roles/role_1/meta/main.yml
galaxy_info:
  author: your name
  description: your role description
  company: your company (optional)
  license: license (GPL-2.0-or-later, MIT, etc)
  min_ansible_version: 2.9
  platforms:
    - name: Ubuntu
      versions:
        - bionic
        - cosmic
        - disco
        - eoan
  galaxy_tags: []
dependencies: []

Например, задачи в роли ниже

$ cat roles/role_1/tasks/main.yml
---

- name: Print OS and distro Ansible variables collected by setup
  debug:
    msg:
      - "ansible_os_family: {{ ansible_os_family }}"
      - "ansible_distribution: {{ ansible_distribution }}"
      - "ansible_distribution_major_version: {{ ansible_distribution_major_version }}"
      - "ansible_distribution_version: {{ ansible_distribution_version }}"
      - "ansible_distribution_release: {{ ansible_distribution_release }}"

- name: Include roles' meta data
  include_vars:
    file: "{{ role_path }}/meta/main.yml"

- name: Test the distribution is supported. End the host if not.
  set_fact:
    supported_distributions: "{{ galaxy_info.platforms|json_query('[].name') }}"
- debug:
    var: supported_distributions
- block:
    - debug:
        msg: "{{ ansible_distribution }} not supported. End of host."
    - meta: end_host
  when: ansible_distribution not in supported_distributions

- name: Test the release is supported. End the host if not.
  set_fact:
    supported_releases: "{{ (galaxy_info.platforms|
                            selectattr('name', 'match', ansible_distribution)|
                            list|first).versions }}"
- debug:
    var: supported_releases
- block:
    - debug:
        msg: "{{ ansible_distribution_release}} not supported. End of host."
    - meta: end_host
  when: ansible_distribution_release not in supported_releases

- name: The distribution and release is supported. Continue play.
  debug:
    msg: "{{ ansible_distribution }} {{ ansible_distribution_release }} is supported. Continue play."

с игрой

- hosts: localhost
  gather_facts: true
  roles:
    - role_1

дайте

    "msg": [
        "ansible_os_family: Debian", 
        "ansible_distribution: Ubuntu", 
        "ansible_distribution_major_version: 19", 
        "ansible_distribution_version: 19.04", 
        "ansible_distribution_release: disco"
    ]

    "supported_distributions": [
        "Ubuntu"
    ]

    "supported_releases": [
        "bionic", 
        "cosmic", 
        "disco", 
        "eoan"
    ]

    "msg": "Ubuntu disco is supported. Continue play."
person Vladimir Botka    schedule 08.02.2020