Po przejrzeniu kilku dokumentacji doszedłem do wniosku, że nie mogę użyć with_items
dla roles
.Tworzenie dynamicznej roli w ansible
Stworzyłem więc filter_plugin
, aby wygenerować listę słowników dla ról.
Oto mój Play
:
---
- name: Boostrap vpc and subnets with route table
hosts: localhost
connection: local
gather_facts: no
pre_tasks:
- include_vars: ec2_vars/common/regions.yml
- include_vars: environment.yml
roles:
- {
role: vpc,
ec2_region: 'ap-southeast-2'
}
- {
role: vpc,
ec2_region: "ap-southeast-1",
}
- {
role: vpc,
ec2_region: "us-west-2",
}
Chcę, aby wygenerować powyżej ról dynamicznie i że stworzył filter_plugin
który generuje listę słowników i że działa prawidłowo.
Oto mój plugin:
# this is for generating vpc roles
def roles(ec2_regions):
return [{'role': 'vpc', 'ec2_region': ec2_region} for ec2_region in ec2_regions]
class FilterModule(object):
def filters(self):
return {'vpcroles': roles}
Mój plan był do generowania role jak następuje:
roles: "{{ EC2_REGIONS | vpcroles }}"
gdzie EC2_REGIONS
jest ['ap-southeast-2', 'us-east-1']
Ale role nie działa w ten sposób.
otrzymuję następujący błąd:
ERROR! A malformed role declaration was encountered.
wszelkie myśli/pomysły?
Nie rozwiązuje twojego problemu, ale twój YAML jest niespójny. Używasz pojedynczych i podwójnych cudzysłowów (dla 'ec2_region'), gdzie nie są one potrzebne, i bez cudzysłowów dla innych wartości skalarnych. Możesz także niekonsekwentnie stosować końcowy przecinek w odwzorowaniu stylu przepływu (elementy wartości dla 'ról'). IMO, jeśli korzystasz z odwzorowań stylu wielowierszowego, zawsze używaj przecinka końcowego lub lepiej korzystaj z odwzorowań stylu blokowego. – Anthon
@Anthon Noted, dziękuję. – Suku