Soru Ansible: Belirli bir koşul karşılanırsa, vars dosyasındaki değişkenleri koşullu olarak tanımlar.


Group_vars içine tanımlanmış bir değişkenin değerine (Doğru / Yanlış) bağlı olarak bir vars dosyasındaki bazı değişkenleri tanımlamaya çalışıyorum. Onların değeri, grup varının değerine bağlıdır.

Mevcut var dosyanız şu şekilde görünüyor:

{% 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 dosyaya tanımlanmış bir değişken kullanıyorum.

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

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

Playbook'u ç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 bile desteklenmiyor mu? Bu varsları tanımlamak için başka bir yol bulmaya çalıştım (çok fazla var) ama burada işlevsel bir şey elde etmeyi başaramadım. Herhangi bir öneri?


7
2018-04-11 13:43


Menşei


Bu varlıklar nerede kullanılır? Bunları kullanmak için kullanacağınız şey, bunun bir parçasıysa, gereksiz olabilir. template modül çağrısı. - 84104
Eğer test grup bağımlı, group_vars içine yerleştirilmelidir. - Konstantin Suvorov
Ne yazık ki, test grup bağımlı değildir. Açıklamada belirtildiği gibi, test bir group_var değişkeninin değerine bağlıdır. - pandoJohn


Cevaplar:


Yapabileceğinizi düşünmüyorum, genellikle koşullu değişken koleksiyonları tutmak için ayrı dosyalar oluşturur ve when Belirli bir koşulda bunları dahil etmek için yan tümce:

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

5
2018-04-11 14:01



Bu kaçınmaya çalıştığım bir şey. Var varsayıma veya görevlerim için 2 ek var dosyası tanımlamak istemiyorum. - pandoJohn


Güzel olmasına rağmen, korkarım ki senin yolun mümkün değil (veya doğru şekilde farkında değilim).

Önce jinja şablonundan vars dosyasını hazırlamanızı ve ardından include_vars ile eklemenizi öneririm. Örnek oynatma 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 %}

2
2018-04-11 15:11



Bunu beğendim ama sorun şu ki, jinja şablonundan .yml dosyasını oluşturduktan sonra bu, benim oyun kitabımdan sonraki görevler için mevcut değil. - pandoJohn
Niye ya? Test oynatma kitabını hata ayıklama göreviyle genişletmeye çalıştığımda - debug: var=test Görebiliyorum ki, her ikisi de tanımlanmış test.var1 ve test.var2 beklenen değerlerle. Yani bu değişkenleri oyun kitabının diğer görevlerinde kullanabilmeniz gerekir. - Jaroslav Kucera


Ansible, aşağıdaki formlardan birinin koşullu olarak değişken tanımlamasını sağlar:

    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 arama ile birleştirerek karmaşık varsları 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')}}"

Vars arama ile koşullu ağaç yükleme yapmanın başka bir yolu vardır. Bu durumda, vaka mantığını uygulamak gerektiğinde kullanışlıdır (örn. Koşul değişkeninin ikiden fazla olası değeri vardır):

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

1
2018-05-26 19:43





AFAIK, bu {} çalıştığınız şey Jinja2 şablonları için ve yml dosyaları için değil. İtibaren belgeleme:

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

İhtiyaç duyduğunuz değişkenleri kurarken ayarlayan bir oyun ile ayrı bir .yml dosyası hazırlayabilir ve daha sonra bunları ana oyun defterinize içe aktarabilir (veya dahil edebilirsiniz). Bu şekilde, tüm varsayı koşullu olarak tek bir dosyada tanımlayabilirsiniz.

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


0
2018-04-11 15:29





Sonunda yaptığım şey 2 ayrı var dosya yaratmaktı. type_a.yml ve type_b.yml - ve hangi dosyayı kullanacağımı gösteren bir grup değişkeni tanımladım - type_of_file: a. Bu benim seyir kitabımın şimdi nasıl görünüyor:

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

Bütün cevaplar için teşekkürler. Onları gerçekten yararlı buluyorum.


0
2018-05-27 14:40