2016-09-20 12 views
0

AWSルート53レコードを作成するループ内で複数回プレイブックを実行しようとしています。 route53レコードを作成するには不可能 - 変数/ファクトを定義しないように強制します

私の仕事は、次のようになります。

- 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) }}" 

私の問題は、ヘルスチェックは、常にたびに定義されていないということです。ヘルスチェックの

作成は、次のようになります。

- 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 

ループが5回実行した場合、それが唯一の反復で定義されてもよいです。ヘルスチェックが実行されると、 'healthcheck'変数にはヘルスチェックの詳細が含まれます。 ID。それは与えられたループ上ない実行を行う場合は、「ヘルスチェック」変数には以下が含まれています。

私route53作成で
"healthcheck": { 
     "changed": false, 
     "skip_reason": "Conditional check failed", 
     "skipped": true 
    } 

「ヘルスチェック」変数が定義されていない場合は、ヘルスチェックが省略されています。しかし、である場合、存在しないhealthcheckのhealth_checkパラメータのidパラメータを参照解除しようとします。

ヘルスチェックを使用していないときにデフォルト値に設定しようとすると、 {}それでも定義されていて、route53の作成は失敗します。

変数またはファクトを強制的に未定義にする方法はありますか?ような何か:スキップされたとhealthcheck.health_check.idそうhealthcheck場合、これはomitを渡します

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

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

あなたのループの変数を設定する部分を追加してください。間違った方向に進んでいるようですが、どのようにして毎回手動でリセットする必要がありますか? –

+0

この詳細を追加しました – RikSaunderson

答えて

1

はこのような何かを試してみてください。私の経験から

defaultは2+レベルのネストされたdictsと正常に動作していない(すなわちmydict.myitem | default('ok')で動作しますが、mydict.mysubdict.myitem | default('ok')で失敗したので、私はidに安全にアクセスする最初の{}にsubdictをデフォルトにハックを使用:(healthcheck.health_check | default({})).id

関連する問題