group_vars에 정의 된 변수의 값 (True / False)에 따라 vars 파일에서 일부 변수를 정의하려고합니다. 그 값은 var 그룹의 값에 따라 다릅니다.
내 현재 var 파일은 다음과 같습니다
{% if my_group_var %}
test:
var1: value
var2: value
...
varn: value
{% else %}
test:
var1: other_value
var2: other_value
...
varn: other_value
{% endif %}
각 역할마다이 파일에 정의 된 변수를 사용하고 있습니다.
테스트 플레이 북은 다음과 같습니다.
- name: blabla
hosts: blabla
vars_files:
- <path>/test_vars.yml
roles: blabla
플레이 북을 실행 한 후 수신되는 오류는 다음과 같습니다.
{% if my_group_var %}
^ here
exception type: <class 'yaml.scanner.ScannerError'>
exception: while scanning for the next token
found character that cannot start any token
in "<unicode string>"
내가 멍청한 짓을하고 있거나 지원되지 않습니까? 나는이 vars를 정의하는 다른 방법을 찾으려고 노력했지만 (많은 것들이 있습니다) 여기서는 기능적인 것을 얻지 못했습니다. 어떤 제안?
답변
나는 당신이 할 수 있다고 생각하지 않습니다. 일반적으로 조건부 변수 컬렉션을 보유하기 위해 별도의 파일을 만들고 when
절을 사용 하여 특정 조건에 포함시킵니다.
- include_vars: test_environment_vars.yml
when: global_platform == "test"
- include_vars: staging_environment_vars.yml
when: global_platform == "staging"
- include_vars: prod_environment_vars.yml
when:
- global_platform != "test"
- global_platform != "staging"
답변
Ansible은 다음 양식 중 하나가 변수를 조건부로 정의 할 수 있도록합니다.
test:
var1: "{% if my_group_var %}value{% else %}other_value{% endif %}"
var2: "{{'value' if (my_group_var) else 'other_value'}}"
위의 구문을 vars 조회와 결합하면 복잡한 var를로드 할 수 있습니다 (이 경우 나열).
test_value_when_my_group_var_is_true:
var1: value
var2: value
test_value_when_my_group_var_is_false:
var1: other_value
var2: other_value
test: "{{ lookup('vars','test_value_when_my_group_var_is_true') if (my_group_var) else lookup('vars','test_value_when_my_group_var_is_false')}}"
vars 조회를 사용하여 조건부 트리로드를 수행하는 다른 방법이 있습니다. 이 방법은 사례 로직을 구현해야 할 때 편리합니다 (예 : 조건 변수에 가능한 값이 두 개 이상 있음).
test_value_when_my_group_var_is_foo:
var1: value
var2: value
test_value_when_my_group_var_is_bar:
var1: other_value
var2: other_value
test_value_when_my_group_var_is_baz:
var1: yet_another_value
var2: yet_another_value
test: "{{ lookup('vars','test_value_when_my_group_var_is_' + my_group_var) }}"
답변
그것은 좋을 것이지만, 나는 당신의 길이 가능하지 않다는 것을 두려워합니다.
먼저 jinja 템플릿에서 vars 파일을 준비한 다음 include_vars에 포함시키는 것이 좋습니다. 플레이 북 예를 참조하십시오.
---
- name: -Test-
hosts: local
vars:
my_group_var: False
# my_group_var: True
tasks:
- name: Prepare vars file from template.
template: src=/tmp/vars.yaml.j2
dest=/tmp/vars.yaml
- name: Include vars
include_vars: "/tmp/vars.yaml"
jinja 템플릿 /tmp/vars.yaml.j2의 내용은 다음과 같습니다.
{% if my_group_var %}
test:
var1: value
var2: value
{% else %}
test:
var1: other_value
var2: other_value
{% endif %}
답변
AFAIK,이 {} 시도는 yml 파일이 아닌 Jinja2 템플릿을위한 것입니다. 로부터 문서 :
ansible은 템플릿에서 Jinja2 루프와 조건을 허용하지만 플레이 북에서는 사용하지 않습니다.
when 절을 사용하여 필요한 변수를 설정 한 다음 기본 플레이 북에서 가져 오기 (또는 포함)하는 별도의 .yml 파일을 준비 할 수 있습니다. 이렇게하면 모든 변수를 단일 파일로 조건부로 정의 할 수 있습니다.
또는 역할을 사용하십시오. 문제를 해결하기 위해 역할이 가장 적합한 방법이라고 생각합니다.
답변
결국 내가 한 일은 두 개의 개별 var 파일을 만드는 것이 었습니다. 그것들을 호출 type_a.yml
하고 type_b.yml
-사용할 파일을 나타내는 그룹 변수를 정의했습니다 type_of_file: a
. 이것이 내 플레이 북의 모습입니다 :
- name: blabla
hosts: blabla
vars_files:
- <path>/type_{{ type_of_file }}.yml
roles: blabla
모든 답변에 감사드립니다. 나는 그들이 정말로 도움이된다고 생각한다.
답변
Ansible Documentation 에서 가져온 다음 코드가 위의 다른 사람들로부터 유용한 기여를 할 수 있기를 바랍니다 .
- name: Show value of 'variablename'
debug: msg="{{ lookup('vars', 'variabl' + myvar)}}"
vars:
variablename: hello
myvar: ename