Ansible : 특정 조건이 충족되면 변수를 vars 파일에 조건부로 정의


19

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를 정의하는 다른 방법을 찾으려고 노력했지만 (많은 것들이 있습니다) 여기서는 기능적인 것을 얻지 못했습니다. 어떤 제안?


이 변수는 어디에서 사용됩니까? 사용하려는 모든 것이 template모듈 호출의 일부인 경우에는 불필요 할 수 있습니다 .
84104

경우 test그룹에 의존, 그것은 group_vars에 배치해야합니다.
Konstantin Suvorov

불행히도 테스트는 그룹에 의존하지 않습니다. 설명에서 언급했듯이 테스트는 group_var 변수의 값에 따라 다릅니다.
pandoJohn

답변:


11

나는 당신이 할 수 있다고 생각하지 않습니다. 일반적으로 조건부 변수 컬렉션을 보유하기 위해 별도의 파일을 만들고 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" 

2
이것은 내가 피하려고했던 것입니다. include vars를 사용하거나 내 작업에 대해 2 개의 추가 var 파일을 정의하고 싶지 않습니다.
pandoJohn

나는 그것을 얻지 못한다.. 조건과 함께 include_vars를 사용할 수있을 때 변수로 조건을 정의 할 수없는 이유는 무엇입니까?
GP92

10

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

2

그것은 좋을 것이지만, 나는 당신의 길이 가능하지 않다는 것을 두려워합니다.

먼저 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 %}

나는 이것을 좋아하지만 문제는 jinja 템플릿에서 .yml 파일을 생성 한 후에 내 플레이 북의 후속 작업에 사용할 수 없다는 것입니다.
pandoJohn

왜? 내가 디버그 작업 테스트 각본 확장했을 때 - debug: var=test, 내가 볼 수있는이 두 정의되어 있는지 test.var1test.var2예상 값. 따라서이 변수를 플레이 북의 다른 작업에서 사용할 수 있어야합니다.
Jaroslav Kucera

0

AFAIK,이 {} 시도는 yml 파일이 아닌 Jinja2 템플릿을위한 것입니다. 로부터 문서 :

ansible은 템플릿에서 Jinja2 루프와 조건을 허용하지만 플레이 북에서는 사용하지 않습니다.

when 절을 사용하여 필요한 변수를 설정 한 다음 기본 플레이 북에서 가져 오기 (또는 포함)하는 별도의 .yml 파일을 준비 할 수 있습니다. 이렇게하면 모든 변수를 단일 파일로 조건부로 정의 할 수 있습니다.

또는 역할을 사용하십시오. 문제를 해결하기 위해 역할이 가장 적합한 방법이라고 생각합니다.


0

결국 내가 한 일은 두 개의 개별 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

모든 답변에 감사드립니다. 나는 그들이 정말로 도움이된다고 생각한다.


0

Ansible Documentation 에서 가져온 다음 코드가 위의 다른 사람들로부터 유용한 기여를 할 수 있기를 바랍니다 .

- name: Show value of 'variablename'
  debug: msg="{{ lookup('vars', 'variabl' + myvar)}}"
  vars:
    variablename: hello
    myvar: ename
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.