Ansible : 특정 조건이 충족되면 변수를 vars 파일에 조건부로 정의 varn: value {% else %} test:

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