Ansible

僅僅為了設置事實而創建 Ansible 角色是不是很糟糕?

  • January 26, 2022

我有一種情況,我可以編寫一個三任務角色來查找、排序和提取一組值,例如:

- 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

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_roleimport_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.

引用自:https://serverfault.com/questions/1091169