web-dev-qa-db-ja.com

追加変数または在庫変数を通じてAnsible変数を未定義に設定する

だから私は次のようなAnsibleプレイブックを持っています

---
- hosts: mygroup
  tasks:
    - debug:
        msg: "{{ foo | default(inventory_hostname) }}"

私のインベントリファイルは次のようになります

[mygroup]
127.0.0.1

fooはどこにも定義されていないため、デバッグは期待どおり127.0.0.1を出力します。

しかし、私のインベントリファイルが次のようになっているとします。

[mygroup]
127.0.0.1 foo=null

プレイブックを実行すると、文字列nullが出力されます。私はfoo=Noneでも試しましたが、空の文字列が出力されます。インベントリまたは追加変数を使用して変数をnullに設定するにはどうすればよいですか?

これは、プレイブックで既に定義されている変数の設定を解除する場合に役立ちます。

Ansibleバージョン2.1.1.0を使用しています。

7
Rickkwa

Python(したがってAnsible)は、未定義の変数とnone値の変数を区別します。

一度定義された変数を「未定義」にする方法はありません。

その結果、値をnoneに設定した場合でも、指定した条件は変数を未定義と見なしません。

これは""を出力ログで取得します。これは、debugモジュールが値なしを表示する方法であり、空の文字列ではないためです。

ソリューション1

foo変数の実際の値を確認するには、条件とともに三項演算子を使用します。

- debug:
    msg: "{{ ((foo is defined) and (foo != None)) | ternary(foo, inventory_hostname) }}"

ソリューション2

「ラッパー」辞書を使用します。

  1. 「ラッパー」辞書内の変数のデフォルト値を定義します。

    foodict:
      foo: bar
    
  2. 演劇では、変数をfoodict.fooとして参照します。

    ---
    - hosts: mygroup
      tasks:
        - debug:
            msg: "{{ foodict.foo | default(inventory_hostname) }}"
    
  3. 「ラッパー」ディクショナリを無効にして、インベントリファイルの値を上書きします。

    [mygroup]
    127.0.0.1 foodict=None
    
7
techraf