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 }} ...
我需要在幾個不同的劇本中做這種事情,所以我想要程式碼重用。實現一個 Lookup 外掛似乎更酷、更類似於 Anible 的是,但那是更多的 Python 行,呼叫 Boto3 來有效地做同樣的事情(除了將細節作為 dict 返回)。
似乎在涵蓋此內容的角色的最佳實踐中找不到任何東西,或者我很可能遺漏了一些東西。
問:僅僅為了設置事實而創建 Ansible 角色是不是很糟糕?
答:不,不是。你說你*
'want code reuse'
。將任務放入一個文件,例如tasks/get_latest_ami_id.yml*,並創建一個角色,例如roles/my_libshell> 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.