Uygun: Belirli bir koşul karşılandığında değişkenleri değişken olarak koşullu olarak tanımlayın


19

Group_vars içinde tanımlanan bir değişkenin değerine (True / False) bağlı olarak bir vars dosyasındaki bazı değişkenleri tanımlamaya çalışıyorum. Değerleri grubun değerine bağlıdır.

Mevcut var dosyam şöyle:

{% if my_group_var %}
test:
   var1: value
   var2: value
   ...
   varn: value
{% else %}
test:
   var1: other_value
   var2: other_value
   ...
   varn: other_value
{% endif %}

Rollerimin her biri için bu dosyada tanımlanan bir değişken kullanıyorum.

Test oyun kitabım aşağıdaki gibi görünüyor:

- name: blabla
  hosts: blabla
  vars_files:
     - <path>/test_vars.yml
  roles: blabla 

Başucu kitabını çalıştırdıktan sonra aldığım hata:

{% 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>"

Burada aptalca bir şey mi yapıyorum yoksa bu desteklenmiyor mu? Bu değişkenleri tanımlamak için başka bir yol bulmaya çalıştım (birçoğum var) ama burada işlevsel bir şey elde etmeyi başaramadım. Herhangi bir öneri?


Bu değişkenler nerede kullanılıyor? Bunları kullanacağınız tek şey bir templatemodül çağrısının parçasıysa, bu gereksiz olabilir .
84104

Eğer testgruba bağımlıysa, grup_varlarına yerleştirilmelidir.
Konstantin Suvorov

Ne yazık ki, test gruba bağlı değildir. Açıklamada belirtildiği gibi, test bir group_var değişkeninin değerine bağlıdır.
pandoJohn

Yanıtlar:


11

Yapabileceğinizi sanmıyorum, genellikle koşullu değişken koleksiyonları tutmak için ayrı dosyalar oluşturuyorum ve whenbunları belirli bir koşula dahil etmek için bir cümle kullanıyorum :

- 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
Bu kaçınmaya çalıştığım bir şey. İnclude vars kullanmak veya görevleri için 2 ek var dosyaları tanımlamak istemiyorum.
pandoJohn

Anlamıyorum ... koşul ile include_vars kullanmak mümkün olduğunda, neden değişken koşul ile tanımlanamaz?
GP92

10

Ansible, aşağıdaki formlardan birinin değişkeni koşullu olarak tanımlamasına izin verir:

    test:
      var1: "{% if my_group_var %}value{% else %}other_value{% endif %}"
      var2: "{{'value' if (my_group_var) else 'other_value'}}"

Yukarıdaki sözdizimini vars aramasıyla birleştirerek karmaşık vars yükleyebiliriz (bu durumda liste):

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

Değişken arama ile koşullu ağaç yüklemesi yapmanın başka bir yolu var. Uygulama örneği mantığına ihtiyacınız olduğunda bu yol kullanışlıdır (yani koşul değişkeni ikiden fazla olası değere sahiptir):

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

Güzel olmasına rağmen, korkarım ki yolunuz mümkün değil (ya da doğru yolun farkında değilim).

Önce jinja şablonundan vars dosyası hazırlamak ve sonra include_vars ile dahil öneririz. Örnek oyun kitabına bakın:

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

Örnek jinja şablonu /tmp/vars.yaml.j2 içeriği:

{% if my_group_var %}                                                                                                                                                                                             
test:                                                                                                                                                                                                             
   var1: value                                                                                                                                                                                                    
   var2: value                                                                                                                                                                                                    
{% else %}                                                                                                                                                                                                        
test:                                                                                                                                                                                                             
   var1: other_value                                                                                                                                                                                              
   var2: other_value                                                                                                                                                                                              
{% endif %}

I like it ama sorun jinja şablonundan .yml dosyası oluşturduktan sonra bu benim playbook sonraki görevleri için kullanılabilir olmasıdır.
pandoJohn

Neden? Ben ayıklama görevi Test taktik kitabı genişletmeye çalıştım - debug: var=test, görebiliyorum orada hem tanımlandığını test.var1ve test.var2beklenen değerlerle. Bu nedenle, bu değişkenleri oynatma kitabının diğer görevlerinde kullanabilmeniz gerekir.
Jaroslav Kucera

0

AFAIK, denediğiniz bu {} şey yml dosyaları için değil, Jinja2 şablonları içindir. Gönderen belgeler :

ansible, şablonlarda Jinja2 döngülerine ve koşullarına izin verir, ancak oyun kitaplarında bunları kullanmayız.

When cümlelerini kullanarak ihtiyacınız olan değişkenleri ayarlayan ve daha sonra bunları ana oynatma kitabınıza içe aktararak (veya dahil ederek) ayrı bir .yml dosyası hazırlayabilirsiniz. Bu şekilde, tüm değişkenleri tek bir dosyada koşullu olarak tanımlayabilirsiniz.

VEYA: Rolleri kullanın. Rolün sorununuzu çözmek için en uygun yaklaşım olduğunu düşünüyorum.


0

Sonunda yaptığım 2 ayrı var dosyası oluşturmak oldu - onları çağıralım type_a.ymlve type_b.yml- ve hangi dosyayı kullanacağını gösteren bir grup değişkeni tanımladım type_of_file: a. Oyun kitabım şu şekilde görünüyor:

- name: blabla
  hosts: blabla
  vars_files:
     - <path>/type_{{ type_of_file }}.yml
  roles: blabla

Tüm cevaplar için teşekkürler. Onları gerçekten yararlı buluyorum.


0

Umarım aşağıdaki kod parçası ( Ansible Documentation'dan alınmıştır ), yukarıdaki diğer kişilerin faydalı katkılarına değerli bir katkıda bulunabilir.

- name: Show value of 'variablename'
  debug: msg="{{ lookup('vars', 'variabl' + myvar)}}"
  vars:
    variablename: hello
    myvar: ename
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.