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