Ansible-変数が定義されていない場合はデフォルトを使用します


98

私はusers自分の役割の中でLinuxの作成をカスタマイズしています。私は私の役割のカスタマイズをユーザーに許可する必要がありますhome_directorygroup_namenamepassword

デフォルト値に対処するためのより柔軟な方法があるかどうか疑問に思っていました。

私は以下のコードが可能であることを知っています:

- name: Create default
  user:
    name: "default_name"
  when: my_variable is not defined

 - name: Create custom
  user:
    name: "{{my_variable}}"
  when: my_variable is defined

しかし、先ほど触れたように、オプションの変数はたくさんあり、これにより多くの可能性が生まれます。

上記のコードのようなものはありますか?

user:
  name: "default_name", "{{my_variable}}"

コードはname="default_name"my_variableが定義されていない場合に設定する必要があります。

すべての変数をオンに設定しdefaults/main.ymlて、そのようなユーザーを作成できます。

- name: Create user
  user:
    name: "{{my_variable}}"

しかし、これらの変数は非常に大きなハッシュ内にあり、そのハッシュ内にはデフォルトにできないハッシュがあります。


回答:


190

Jinja'sを使用できますdefault

- name: Create user
  user:
    name: "{{ my_variable | default('default_value') }}"

10
デフォルトの変数が別の変数に依存している場合。たとえばdefault('/home/' {{ anothervar }})、これらの値を連結する方法はありますか?
Bernardo Vale

8
周りの 'を削除するだけで、default_valuedefault_valueという変数が使用されます
dagonza

7
変数がのようにネストされている場合は機能しません{{ dict.key | default(5) }}dictが定義されていない場合は失敗します。
ジョーダンスチュワート

1
参考までに、これはエラーをスローします:[WARNING]: when statements should not include jinja2 templating delimiters such as {{ }} or {% %}.
ブライアン・ケネディ

1
@JordanStewart同じケースがありました-ネストされた変数で。以下の可能な解決策で回答を投稿しました。
ローマクル

11

完全に関連しているわけではありませんが、undefinedAND empty(たとえばmy_variable:)変数の両方を確認することもできます。(注:1.9以降のansibleバージョンでのみ機能します。リンク:を参照

- name: Create user
  user:
    name: "{{ ((my_variable == None) | ternary('default_value', my_variable)) \
    if my_variable is defined else 'default_value' }}"

2
これはとても便利です。
eagle33322

5

ネストされた変数を処理するオプションを誰かが探している場合、このgithubの問題にはそのようなオプションがいくつかあります。

つまり、ネストされた変数のすべてのレベルで「デフォルト」フィルターを使用する必要があります。変数「a.nested.var」の場合、次のようになります。

- hosts: 'localhost'
  tasks:
    - debug:
        msg: "{{ ((a | default({})).nested | default({}) ).var | default('bar') }}"

または、多分「結合」フィルターを使用して、varのレベルごとに空の辞書のデフォルト値を設定できます。または、「json_query」フィルターを使用します。ただし、ネストのレベルが1つしかない場合は、私が選択したオプションの方が簡単に思えます。


4

アイテムをループしたいプレイが1つしかない場合は、group_vars / allまたは意味のある他の場所でそのリストを定義します。

all_items:
  - first
  - second
  - third
  - fourth

次に、タスクは次のようになります。

  - name: List items or default list
    debug:
      var: item
    with_items: "{{ varlist | default(all_items) }}"

varlistをJSON配列として渡します。

ansible-playbook <playbook_name> --extra-vars='{"varlist": [first,third]}'

その前に、あなたはまた、タスクが必要になる場合がありますという点で、各項目ことを確認変数リストでもあるALL_ITEMS

  - name: Ensure passed variables are in all_items
    fail:
      msg: "{{ item }} not  in all_items list"
    when: item not in all_items
    with_items: "{{ varlist | default(all_items) }}"

3

ルックアップを使用して環境からのデフォルトの読み取りを設定する場合は、デフォルトの2番目のパラメーターもtrueに設定しています。

- set_facts:
    ansible_ssh_user: "{{ lookup('env', 'SSH_USER') | default('foo', true) }}"

複数のデフォルト定義を連結することもできます。

- set_facts:
    ansible_ssh_user: "{{ some_var.split('-')[1] | default(lookup('env','USER'), true) | default('foo') }}"

1

質問はかなり古いですが、次のことについてはどうですか:

- hosts: 'localhost'
  tasks:
    - debug:
        msg: "{{ ( a | default({})).get('nested', {}).get('var','bar') }}"

それは私にとってあまり面倒ではないように見えます...


1

ブールファクトにデフォルト値を割り当てる場合は、default()内で引用符が使用されていないことを確認してください。

- name: create bool default
  set_fact:
    name: "{{ my_bool | default(true) }}"

他の変数については、検証済みの回答で与えられたのと同じ方法を使用しました。

- name: Create user
  user:
    name: "{{ my_variable | default('default_value') }}"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.