Estou tentando criar uma matriz no Ansible que contém todas as regiões da AWS habilitadas na minha conta que oferecem suporte ao FSx para NetApp ONTAP (FSxN).
Sei que posso usar o seguinte para habilitar a lista de regiões na minha conta:
- name: Get all the opted in regions.
amazon.aws.aws_region_info:
register: region_info
- name: Just get region names
set_fact:
opted_in_regions: "{{ [item.region_name] + opted_in_regions }}"
loop: "{{ region_info.regions }}"
Mas há momentos, geralmente quando uma nova região fica online, em que algumas regiões não oferecem suporte ao FSxN.
A única maneira que encontrei de saber quais regiões oferecem suporte a serviços específicos é baixar o guia de preços https://api.regional-table.region-services.aws.a2z.com/index.json
e procurar regiões que tenham "Amazon FSx for NetApp ONTAP" como "aws:serviceName". O formato desse arquivo é:
{
"prices": [
{
"attributes": {
"aws:region": "ap-east-1",
"aws:serviceName": "Amazon Translate",
"aws:serviceUrl": "https://aws.amazon.com/translate/"
},
"id": "translate:ap-east-1"
},
{
"attributes": {
"aws:region": "ap-northeast-1",
"aws:serviceName": "Amazon Translate",
"aws:serviceUrl": "https://aws.amazon.com/translate/"
},
"id": "translate:ap-northeast-1"
},
Então, o que eu fiz foi criar uma variável com o conteúdo do arquivo:
- name: Get the capabilities of all regions.
set_fact:
regions_capabilities: "{{lookup('ansible.builtin.url', 'https://api.regional-table.region-services.aws.a2z.com/index.json', split_lines=false)}}"
A próxima "tarefa" é percorrer todos os valores e adicionar a outra matriz aqueles que têm a string específica no aws:serviceName
campo.
- name: Get the intersection of opted in regions and regions that support FSxN.
when: item['attributes']['aws:serviceName'] == "Amazon FSx for NetApp ONTAP" and item['attributes']['aws:region'] in opted_in_regions
set_fact:
fsxnRegions: "{{ [item['attributes']['aws:region']] + fsxnRegions }}"
loop: "{{ regions_capabilities.prices }}"
Enquanto funciona, essas when:
declarações geram MUITAS (milhares) de skipping...
linhas na saída. E é dolorosamente lento.
Então, a questão é: existe uma maneira melhor de criar o array de regiões que suportam FSxN? E se não, como posso suprimir essa skipping
mensagem, mas SOMENTE para essa tarefa?
Aqui está o manual completo do Ansible:
# Title: generate report
---
- hosts: localhost
collections:
- amazon.aws
gather_facts: false
name: Playbook to generate a report on all the FSxNs
vars:
fsxnRegions: []
opted_in_regions: []
tasks:
- name: Get all the opted in regions.
amazon.aws.aws_region_info:
register: region_info
- name: Just get region names
set_fact:
opted_in_regions: "{{ [item.region_name] + opted_in_regions }}"
loop: "{{ region_info.regions }}"
- name: Get the capabilities of all regions.
set_fact:
regions_capabilities: "{{lookup('ansible.builtin.url', 'https://api.regional-table.region-services.aws.a2z.com/index.json', split_lines=false)}}"
- name: Get the intersection of opted in regions and regions that support FSxN.
when: item['attributes']['aws:serviceName'] == "Amazon FSx for NetApp ONTAP" and item['attributes']['aws:region'] in opted_in_regions
set_fact:
fsxnRegions: "{{ [item['attributes']['aws:region']] + fsxnRegions }}"
loop: "{{ regions_capabilities.prices }}"
- name: Output
debug:
msg: "fsxnRegions={{ fsxnRegions }}"
Se entendi corretamente, você pode tentar usar
selectattr
sem usar oloop