仅为了设置事实而创建 Ansible 角色是否不好?

仅为了设置事实而创建 Ansible 角色是否不好?

我遇到过这样的情况,我可以编写一个三项任务的角色来查找、排序和提取一组值,例如:

- 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 才能有效地做同样的事情(除了以字典形式返回详细信息)。

在角色最佳实践中似乎找不到涵盖此内容的任何内容,或者很可能我遗漏了一些东西。

答案1

问:仅为了设置事实而创建 Ansible 角色是否不好?

答:不,不是。你说你'want code reuse'. 将任务放入文件中,例如任务/get_latest_ami_id.yml,并创建一个角色,例如角色/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 }}
    ...

然后使用包括角色或者导入角色并运行剧本中的任务,例如

- import_role:
    name: my_lib
    tasks_from: get_latest_ami_id.yml
  • 重复使用 Ansible 工件了解包含和导入之间的区别。

  • 您可以将此角色用作可重复使用的其他任务的库。

  • 如果你担任这个角色,什么也不会发生,因为任务/main.yml丢失。您可以创建它作为提醒,例如

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

相关内容