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') }}"
답변
완전히 관련되지는 않지만 undefined
AND 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') }}"
또는 “combine”필터를 사용하여 각 수준의 var에 대해 빈 딕셔너리의 기본값을 설정할 수 있습니다. 또는 “json_query”필터를 사용하십시오. 그러나 내가 선택한 옵션은 중첩 수준이 하나 뿐인 경우 더 간단 해 보입니다.
답변
항목에 대해 반복하려는 단일 플레이가있는 경우 해당 목록을 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) }}"
답변
조회를 사용하여 환경에서 기본 읽기를 설정하는 경우 default의 두 번째 매개 변수도 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') }}"
답변
질문은 꽤 오래되었지만 어떨까요?
- hosts: 'localhost'
tasks:
- debug:
msg: "{{ ( a | default({})).get('nested', {}).get('var','bar') }}"
덜 번거로워 보입니다 …
답변
부울 팩트에 기본값을 할당하는 경우 default () 내부에 따옴표가 사용되지 않았는지 확인하십시오.
- name: create bool default
set_fact:
name: "{{ my_bool | default(true) }}"
다른 변수의 경우 확인 된 답변에 제공된 동일한 방법을 사용했습니다.
- name: Create user
user:
name: "{{ my_variable | default('default_value') }}"