Jinja2 ile tanımlanmamış değişkenler nasıl devralınır?

0

Soru

Ansible rollerimde, bazı roller global değişkenlerden belirli yapılandırma ayarlarını türetir Global değişkenler tanımlanmamış olabilir. Aşağıdaki kod şemayı göstermektedir:

- hosts: localhost
  vars:
    bar: '{{ foo }}'
  tasks:
    # Assume foo comes from an Ansible environment
    - debug: var=foo
    # Assume bar comes from a role default
    - debug: var=bar
    # Catched by the "is defined" condition
    - debug: msg="foo is defined"
      when: 'foo is defined'
    # Cannot catch undefined exception?!
    - debug: msg="bar is defined"
      when: 'bar is defined'

Her şey beklendiği gibi çalışır, ancak son ifade: Ansible bir istisna oluşturur çünkü foo tanımsızdır (evet, tanımsızdır).

PLAY [localhost] *********************************************************************************************************************************************************

TASK [Gathering Facts] ***************************************************************************************************************************************************
ok: [localhost]

TASK [debug] *************************************************************************************************************************************************************
ok: [localhost] => {
    "foo": "VARIABLE IS NOT DEFINED!"
}

TASK [debug] *************************************************************************************************************************************************************
ok: [localhost] => {
    "bar": "VARIABLE IS NOT DEFINED!"
}

TASK [debug] *************************************************************************************************************************************************************
skipping: [localhost]

TASK [debug] *************************************************************************************************************************************************************
fatal: [localhost]: FAILED! => {"msg": "The conditional check 'bar is defined' failed. The error was: error while evaluating conditional (bar is defined): {{ foo }}: 'foo' is undefined\n\nThe error appears to be in '.../test-undef.yml': line 9, column 7, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n      when: 'foo is defined'\n    - debug: msg=\"bar is defined\"\n      ^ here\n"}

Peki neden öyle bar “değerlendirmek” değil undefined hoşlanmak foo? Ve bu "çok seviyeli" tanımsızlığı nasıl yakalayabilirim?

ansible jinja2
2021-11-23 09:46:53
3
0

Bunu dene:

- hosts: localhost
  vars:
    bar: '{{ foo }}'
  tasks:
    # Assume foo comes from an Ansible environment
    - debug: var=vars.foo
    # Assume bar comes from a role default
    - debug: var=vars.bar
    # Catched by the "is defined" condition
    - debug: msg="foo is defined"
      when: vars.foo is defined
    # Cannot catch undefined exception?!
    - debug: msg="bar is defined"
      when: vars.bar is defined
2021-11-23 09:57:21

@Frenchy: Evet, gerçekten... Ve eğer senaryomu çalıştırırsanız, iyi çalıştığını göreceksiniz...
Swifty

evet...Seninle aynı fikirdeyim,
Frenchy

Teşekkürler, @ Swifty. Ancak, Ansible gösterir vars.bar kodunuzla tanımlandığı gibi: text TASK [debug] ************************************************************************************************************************************************************* ok: [localhost] => { "msg": "bar is defined" } Muhtemelen şablon dizesini tuttuğu için mi?
Stephan

evet, bu doğru, bu yüzden foo tanımlanmış, bar tanımlanmış anlamına gelir
Frenchy

Ama foo tanımlanmadı ...
Stephan

foo tanımlanmamış, bar tanımlanmamış anlamına gelir..çubuğun tanımlanıp tanımlanmadığını kontrol etmek için foo'nun tanımlanıp tanımlanmadığını kontrol etmeniz yeterlidir
Frenchy

@ Stephan arasındaki farkı anlamak Lütfen '{{ foo }}' ve "{{ foo }}"... "{{ foo }}" değişken anlamına gelir... '{{ foo }}' kelimenin tam anlamıyla bu dize anlamına gelir...
Swifty
0

Sorun şu ki, çubuk teknik olarak tanımlanmış ve tanımınız bar muhtemelen tanımlanmamış bir değişken kullanır. Bir şey yapmaya çalıştığınızda bar bağımsız bir Jinja ifadesi olarak değerlendirilmelidir, ki bu ifadeden önce gerçekleşir. is defined kontrol.

Bunu çözmenin bir yolu bunu yapmaktır bar tanımlanmamış bir değere yol açmadan değerlendirilebilir, örn.

- hosts: localhost
  vars:
    bar: "{{ foo | default(false) }}"
  tasks:
    - debug:
        msg: bar is truthy
      when: bar is truthy

Değerlendirme kısa devre olabileceğinden, foo'yu çubuktan önce de kontrol edebilirsiniz, ancak değişken ilişkisinin bilgisini görevlerinize dahil etmek hantal olabilir.

- hosts: localhost
  vars:
    bar: "{{ foo }}"
  tasks:
    - debug:
        msg: bar is truthy
      when: 
        - foo is defined
        - bar is defined
2021-11-23 17:15:56

Lütfen @ Stephan bar değişkenini bir dize olarak tanımladığını unutmayın! bar: '{{ foo }}' kelimenin tam anlamıyla bir acı demektir!!!
Swifty
-1

eklemeyi deneyin

when: ( vars[bar] is defined )
2021-11-23 15:28:45

vars, gelecekte kaldırılabilen ve kullanılmaması gereken belgelenmemiş bir iç uygulamadır.
flowerysong

Diğer dillerde

Bu sayfa diğer dillerde

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................