У меня есть одна из тех ситуаций, когда я мог бы написать роль с тремя задачами для поиска, сортировки и извлечения набора значений, например:

- name: Lookup available AMI instances
  amazon.aws.ec2_ami_info:
    filters: ...
  register: _ami_info
    
- name: Sort by creation date to get latest
  ansible.builtin.set_fact:
    _amis: '{{ _ami_info.images | sort(attribute="creation_date", reverse=True) }}'
    
- name: Set my facts for the latest AMI
    latest_ami_id: '{{ _amis[0].image_id }}
    ...

Мне нужно сделать что-то подобное в нескольких разных книгах, поэтому я хочу повторно использовать код. Что кажется более крутым и более похожим на Anible, так это реализовать плагин Lookup, но это гораздо больше строк Python с вызовами Boto3, чтобы эффективно делать то же самое (кроме возврата деталей в виде dict).

Кажется, я не могу найти ничего в лучших практиках для ролей, которые охватывают это, или, скорее всего, я что-то упускаю.

answer

В: Является ли плохим тоном создавать роль Ansible только для установления фактов?

О: Нет. Это не так. Вы говорите, что вы 'want code reuse'. Поместите задачи в файл, например, tasks/get_latest_ami_id.yml , и создайте роль, например, roles/my_lib.

shell> cat roles/my_lib/tasks/get_latest_ami_id.yml
- name: Lookup available AMI instances
  amazon.aws.ec2_ami_info:
    filters: ...
  register: _ami_info
    
- name: Sort by creation date to get latest
  ansible.builtin.set_fact:
    _amis: '{{ _ami_info.images | sort(attribute="creation_date", reverse=True) }}'
    
- name: Set my facts for the latest AMI
  ansible.builtin.set_fact:
    latest_ami_id: '{{ _amis[0].image_id }}
    ...

Затем используйте include_role или import_role и запустите задачи в своей книге воспроизведения, например

- import_role:
    name: my_lib
    tasks_from: get_latest_ami_id.yml
  • См. Повторное использование артефактов Ansible, чтобы узнать, в чем разница между включением и импортом.

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

  • Если вы запустите эту роль, ничего не произойдет, потому что tasks/main.yml отсутствует. Вы можете создать его как напоминание, например

shell> cat roles/my_lib/tasks/main.yml
- debug:
    msg: Do not run this role. It is a library of standalone tasks.