programing tip

Ansible-변수가 정의되지 않은 경우 기본값 사용

itbloger 2020. 10. 14. 07:35
반응형

Ansible-변수가 정의되지 않은 경우 기본값 사용


users내 역할 내에서 Linux 생성을 사용자 정의하고 있습니다 . 내 역할 사용자 정의 사용자에게 알려야합니다 home_directory, group_name, name, password.

기본값에 대처하는 더 유연한 방법이 있는지 궁금합니다.

아래 코드가 가능하다는 것을 알고 있습니다.

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

하지만 그 변수들은 정말 큰 해시 안에 있고 그 해시 안에는 기본값이 될 수없는 해시들이 있습니다.


Jinja의 default다음을 사용할 수 있습니다 .

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

항목에 대해 반복하려는 단일 플레이가있는 경우 해당 목록을 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) }}"

완전히 관련이 없지만 undefinedAND empty(예 :) my_variable:변수 를 모두 확인할 수도 있습니다 . (참고 : ansible 버전> 1.9에서만 작동합니다. 참조 : 링크 )

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

중첩 된 변수를 처리하는 옵션을 찾는 사람이 있다면이 github 문제 에 이러한 옵션이 몇 가지 있습니다 .

간단히 말해, 중첩 된 변수의 모든 수준에 대해 "기본"필터를 사용해야합니다. "a.nested.var"변수의 경우 다음과 같습니다.

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

or you could set default values of empty dicts for each level of vars, maybe using "combine" filter. Or use "json_query" filter. But the option I chose seems simpler to me if you have only one level of nesting.


In case you using lookup to set default read from environment you have also set the second parameter of default to true:

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

You can also concatenate multiple default definitions:

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

The question is quite old, but what about:

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

It looks less cumbersome to me...

참고URL : https://stackoverflow.com/questions/35105615/ansible-use-default-if-a-variable-is-not-defined

반응형