2016-09-20 1 views
0

Ich versuche, ein Playbook mehrmals in einer Schleife zu starten, die AWS route53-Datensätze erstellt.Ansible - erzwinge das Undefinieren einer Variablen/Fakt.

Meine Aufgabe der route53 Datensatz zu erstellen wie folgt aussieht:

- name: Create Public DNS record 
    route53: 
    profile: "{{ route53_profile_id }}" 
    command: "{{ dns_command }}" 
    zone: "{{ dns_zone }}" 
    record: "{{ dns_record_name }}.{{ dns_zone }}" 
    type: "{{ dns_type }}" 
    value: "{{ dns_value }}" 
    overwrite: "{{ dns_overwrite }}" 
    ttl: "{{ dns_ttl }}" 
    health_check: "{{ healthcheck.health_check.id | default(omit) }}" 
    failover: "{{ dns_setting.failover | default(omit) }}" 
    weight: "{{ dns_setting.weight | default(omit) }}" 
    region: "{{ region | default(omit) }}" 
    identifier: "{{ identifier | default(omit) }}" 

Mein Problem ist, dass der Gesundheitscheck nicht immer jedes Mal definiert ist.

Erstellung der Gesundheitscheck sieht wie folgt aus:

- name: Create healthcheck with IP address for EC2 instance 
    route53_health_check: 
    state: "{{ healthcheck.state | default(healthcheck_defaults.state) }}" 
    profile: "{{ route53_profile_id }}" 
    region: "{{ vpc.region }}" 
    ip_address: "{{ dns_value }}" 
    type: "{{ healthcheck.type | default(healthcheck_defaults.type) }}" 
    resource_path: "{{ healthcheck.resource_path | default(omit) }}" 
    port: "{{ healthcheck.port | default(omit) }}" 
    security_token: "{{ healthcheck.security_token | default(omit) }}" 
    validate_certs: "{{ healthcheck.validate_certs | default(omit) }}" 
    string_match: "{{ healthcheck.string_match | default(omit) }}" 
    request_interval: "{{ healthcheck.request_interval | default(healthcheck_defaults.request_interval) }}" 
    failure_threshold: "{{ healthcheck.failure_threshold | default(healthcheck_defaults.failure_threshold) }}" 
    register: healthcheck 
    when: 
    - dns_type == "A" 
    - dns_setting.healthcheck is defined 

Wenn die Schleife 5 mal läuft, ist es nur in einer Iteration definiert werden kann. Wenn der Gesundheitscheck ausgeführt wird, enthält die Variable 'healthcheck' die Details des Gesundheitschecks, z. die ID. Ist dies der Fall nicht laufen auf einer gegebenen Schleife, die ‚Gesundheitscheck‘ Variable enthält folgende Komponenten:

"healthcheck": { 
     "changed": false, 
     "skip_reason": "Conditional check failed", 
     "skipped": true 
    } 

In meiner route53 Schöpfung wird die Gesundheitsprüfung entfällt, wenn die ‚Healthcheck‘ Variable nicht definiert ist. Wenn es jedoch definiert ist, versucht ansible, den ID-Parameter des health_check-Parameters von healthcheck zu dereferenzieren, der nicht vorhanden ist.

Wenn ich versuche, den Health Check auf einen Standardwert zu setzen, wenn er nicht verwendet wird, z. {} dann ist es immer noch definiert und meine route53-Erstellung schlägt fehl.

Gibt es eine Möglichkeit, eine Variable oder eine Tatsache zu erzwingen, um undefiniert zu sein? Etwas wie:

- name: Undefine health check 
    set_fact: 
     healthcheck: undef 
+2

Bitte fügen Sie den Teil hinzu, in dem Sie Variablen für Ihre Schleife festgelegt haben Es scheint, dass Sie in die falsche Richtung gehen Wie ist das möglich, dass Sie sie bei jedem Schritt manuell zurücksetzen müssen? –

+0

Dieses Detail hinzugefügt – RikSaunderson

Antwort

1

Probieren Sie etwas wie folgt aus:

- name: Create Public DNS record 
    route53: 
    ... cut ... 
    health_check: "{{ healthcheck | skipped | ternary(omit, (healthcheck.health_check | default({})).id) }}" 
    ... cut ... 

Diese omit passieren wird, wenn healthcheck übersprungenen war und healthcheck.health_check.id anders.

Aus meiner Erfahrung default funktioniert nicht richtig mit verschachtelten dicts von 2+ -Spiegel (dh arbeitet mit mydict.myitem | default('ok') doch irgendwie mydict.mysubdict.myitem | default('ok'), so habe ich den Hack subdict zu {} zuerst auf dem Standard sicher id Zugriff auf: (healthcheck.health_check | default({})).id

Verwandte Themen