我有一种情况,我可以编写一个三任务角色来查找、排序和提取一组值,例如:
- 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 }}
...
我需要在几个不同的剧本中做这种事情,所以我想要代码重用。实现一个 Lookup 插件似乎更酷、更类似于 Anible 的是,但那是更多的 Python 行,调用 Boto3 来有效地做同样的事情(除了将细节作为 dict 返回)。
似乎在涵盖此内容的角色的最佳实践中找不到任何东西,或者我很可能遗漏了一些东西。
问:仅仅为了设置事实而创建 Ansible 角色是不是很糟糕?
答:不,不是。你说你
'want code reuse'
。将任务放入一个文件,例如tasks/get_latest_ami_id.yml,并创建一个角色,例如roles/my_lib然后使用include_role或import_role并运行你的剧本中的任务,例如
请参阅重用 Ansible 工件以了解包含和导入之间的区别。
您可以将此角色用作可重复使用的其他任务的库。
如果您运行此角色,则不会发生任何事情,因为缺少tasks/main.yml。您可以将其创建为提醒,例如