วิธีที่จะสืบทอดยังไม่ระบุตัวแปรกับ Jinja2?

0

คำถาม

ในของฉัน Ansible บทบาทบาท derive เฉพาะการปรับแต่งการตั้งค่าจากโกลบอลตัวแปรโกลบอลตัวแปรอาจจะทำดัชนีเทียบสี. การต่อรหัส illustrates งชุดรูปแบบ:

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

ทุกอย่างที่ทำงานเป็นคาดหวังแต่สุดท้ายแถลงการณ์:Ansible บังอาจยกเว้นได้สักเพราะว่า foo คือทำดัชนีเทียบสี(ใช่มันคือยังไม่ระบุ).

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

ดังนั้นทำไม bar ไม่ใช่"ประเมิ"เพื่ undefined เหมือน foo? แล้วฉันกับดักนี้หลายระดับ"undefinedness?

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

พยายามนี้:

- 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:ใช่จริง...และถ้าคุณวิ่งสคริปต์ของฉันแล้วคุณจะเห็นว่ามันวิ่งได้...
Swifty

ใช่...ฉันเห็นด้วยกับคุณ
Frenchy

ขอบคุณ@Swifty. อย่างไรก็ตาม Ansible แสดง vars.bar ที่ ถูกกำหนด กับของคุณรหัส: text TASK [debug] ************************************************************************************************************************************************************* ok: [localhost] => { "msg": "bar is defined" } อาจจะเพราะว่ามันถือต้นแบบข้อความ?
Stephan

ใช่มันตรงดังนั้น foo ถูกกำหนด implies แถบกำหนดไว้
Frenchy

แต่ foo ยังไม่กำหนดไว้...
Stephan

foo ไม่ได้กำหนดไว้ implies บาร์ไม่ได้กำหนดไว้..คุณแค่ต้องตรวจสอบว่า foo ถูกกำหนดเพื่อตรวจสอบว่าบาร์ที่ถูกกำหนด
Frenchy

@สเตฟานได้โปรดเข้าใจความแตกต่างระหว่าง '{{ foo }}' แล้ว "{{ foo }}"... "{{ foo }}" หมายถึงมีตัวแปร... '{{ foo }}' หมายถึงแท้จริงนั้นข้อความ...
Swifty
0

ปัญหาคือที่บาร์นั่นคือทางเทคนิคกำหนดไว้และความหมายของ bar ใช้เป็นอาจจะยังไม่ระบุตัวแปร ตอนที่คุณพยายามจะทำอะไรกับ bar มันต้องเป็นประเมินผลดดยใครเป็นอิสระ Jinja เงื่อนไขการซึ่งเกิดขึ้นก่อน is defined ตรวจส

ทางเดียวที่อยู่ที่นี่เพื่อทำให้มันดังนั้น bar สามารถเป็นประเมินผลดดยใครโดยไม่มีผลลัพธ์จากในการทำดัชนีเทียบสีค่า e.g.

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

คุณยังสามารถเช็ค foo ก่อนที่บาร์ตั้งแต่การประเมินผลมันสั้นนั-circuitable แต่อบเค้กของความรู้ของตัวแปรความสัมพันธ์ในงานของคุณจะเหมาะมือเลยแม้แต่น้อย

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

โปรดจำไว้ว่า@สเตฟานกำหนดไว้ที่บาร์ตัวแปรที่เป็นข้อความ! bar: '{{ foo }}' จริงหมายถึงนโดนผึ้งต่อย!!!
Swifty
-1

พยายามเพิ่ม

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

vars เป็น undocumented ภายใน implementation นั่นอาจจะถูกลบออยู่ในอนาคตและไม่ควรจะใช้ได้
flowerysong

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

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