2017-01-29 8 views
2

私は自分の役割の実行に含めている辞書構造を持っており、別の値に基づいて辞書の1つに項目を設定しようとしています。 以下の例では、辞書に "value2"という値がないため、 "another_host"で実行すると実行が失敗することがありますが、Anteriorは "dictオブジェクトに属性がありません"というエラーを返します。条件付きで別の辞書属性の値から設定可能な変数値

私がAnabilitiesのデザインと矛盾するものを実行しようとしているかどうか、または私がしようとしていることを達成するためのほんの簡単な方法があるかどうかはわかりません。

dict1: 
    abc: 
    name: abc 
    value: something 
    xyz: 
    name: xyz 
    value: "{{ dict2[inventory_hostname].values.value2 | default(blah) }}" 

dict2: 
    some_host: 
    values: 
     value1: aaa 
     value2: bbb 
    another_host: 
    values: 
     value1: aaa 

答えて

0

私は同様の質問hereに答えました。

最初に、システムキーワードであるため、dictキーにはvaluesという名前を使用しないでください。あなたの例ではvalues()システムメソッドのvalue2プロパティにアクセスしようとすると、これは間違いなく失敗します。

第2に、最上位レベルの変数が未定義(例ではdict2)または最下位キーが未定義(例ではvalue2)の場合、構造は正常に機能します。だから、value2を持っていなくても問題ありません。

しかし、あなたはミドルレベルを持っている場合のように、キー未定義:

top: 
    middle1: 
    leaf1: 1 
    middle3: 
    leaf3: 3 

top.middle2.leaf2 | default('def')はエラーが上昇します。この場合、すべてのレベルを空のdict {}にデフォルト設定すると、ジョブは((top | default({})).middle2 | default({})).leaf2 | default('def')になります。

+0

答えをありがとう。 まだ私のために働いていない、と私はYAMLの内部の構文で何かが不足していると思う。 私は次のようなものを持っています: 'something:" {{dict1 [inventory_hostname] .leaf1.leaf2.leaf3}} "' これらのすべてにデフォルトを追加する必要がありますか?もしそうなら、私はかっこをどこで使うのでしょうか?どこにそれらが必要ではありませんか? – Vadimski

関連する問題