web-dev-qa-db-ja.com

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

私は自分の役割の中でlinux usersの作成をカスタマイズしています。自分の役割のユーザーに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}}"

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

72
Bernardo Vale

Jinjaのdefaultを使うことができます。

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

完全に関連しているわけではありませんが、undefinedempty(たとえば、my_variable:)の両方の変数をチェックすることもできます。 (注:Ansibleバージョン> 1.9でのみ機能します。参照: link

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

あなたがアイテムをループしたいシングルプレイがあるなら、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]}'

その前に、varlistの各項目が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
Jack

ルックアップを使用して環境からのデフォルトの読み取りを設定する場合は、defaultの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
panticz.de